2010-06-19 12 views
7

Estoy trabajando en un pequeño proyecto en el que me gustaría analizar algunos datos y luego ponerlo en una base de datos. No estoy trabajando con Lift, y no he podido encontrar una forma estándar de hacerlo.¿Cómo puedo conectarme a una base de datos MySQL usando Scala?

Estoy bien escribiendo las consultas, pero no estoy seguro de qué usar para conectarme realmente a la base de datos.

+1

Esta pregunta tiene mucha información buena: http://stackoverflow.com/question s/1362748/wanted-good-examples-of-scala-database-persistence –

Respuesta

11

Puede usar JDBC - el medio estándar para que Java converse con las bases de datos. Necesitará el controlador MySQL JDBC apropiado. Apache DbUtils proporciona algunas clases de utilidad que rodean JDBC y sería útil.

Si desea una API de nivel superior que saque parte de la plantilla, entonces consulte Spring's JDBC integration.

Si desea un ORM (mapeo objeto-relacional), entonces Hibernate es una buena opción.

He usado los tres en Scala con éxito.

5

De hecho, he escrito un SQL command shell, en Scala, que habla con cualquier base de datos arbitraria para la que exista un controlador JDBC. Como señala Brian Agnew, funciona perfectamente. Además, hay herramientas como Querulous, SQueryL y OR/Broker que proporcionan capas de base de datos de Scala. Se sientan encima de JDBC, pero proporcionan algo de semántica adicional (a través de DSL, en algunos casos) para facilitarle las cosas.

2

Para mayor información, también echa un vistazo a RichSQL. Es un código de demostración que muestra cómo ajustar JDBC para realizar más operaciones similares a Scala, pero en realidad es bastante útil. Tiene la ventaja de ser simple y pequeño, por lo que puede estudiar fácilmente la fuente para ver qué está sucediendo. No olvide cerrar() sus estados preparados.

3

Trate O/R Broker:

case class MyObj(name: String, year: Int) 

val ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource 
// set properties on ds 

import org.orbroker._ 
val builder = new BrokerBuilder(ds) 
val broker = builder.build 

val myObj: MyObj = // Parse stuff to create MyObj instance 
broker.transaction() { session => 
    session.execute("INSERT INTO MYTABLE VALUES(:obj.name, :obj.year)", "obj"->myObj)s 
} 

val myObjs: Seq[MyObj] = // Parse stuff to create sequence of MyObj instances 
broker.transaction() { session => 
    session.executeBatch("INSERT INTO MYTABLE VALUES(:obj.name, :obj.year)", "obj"->myObjs) 
} 
4

Off supuesto, puede utilizar todas las versiones de Java compatible con JDBC (Hibernate, Spring, etc), pero para un mejor uso del lenguaje Scala, recomiendo el uso de un marco específico Scala, que tener un DSL mejor

  • ScalaQuery es una API/DSL (lenguaje específico de dominio) construido encima de JDBC para acceder a bases de datos relacionales en Scala. Fue diseñado con los siguientes objetivos en mente:
  • Squeryl es un ORM Scala y DSL para hablar con bases de datos con nivel de detalle mínimo y la seguridad de tipos máximo
  • SORM es un Scala ORM-marco diseñado para eliminar el código repetitivo y resolver los problemas de escalabilidad con una abstracción de alto nivel y un estilo de programación funcional
  • Slick - proyecto respaldado Typesafe con el mapeo relacional funcional

ver más acerca de estos marcos en https://stackoverflow.com/questions/1362748/looking-for-a-comparison-of-scala-persistence-frameworks

+0

Considere también [ScalikeJDBC] (http://scalikejdbc.org/) que es muy similar al listado arriba. También el relacionado de Play Framework [ScalaAnorm] (https://github.com/playframework/anorm/blob/master/docs/manual/working/scalaGuide/main/sql/ScalaAnorm.md) es similar. Creé una respuesta completa sobre ScalikeJDBC. –

1

Acabo de descubrir ScalikeJDBC which offers a Scala like API wrapper for JDBC.

(Encontré ScalikeJDBC al investigar cómo usar ScalaAnormwithout Play Framework. Ahora parece que no necesitaré Anorm para mi proyecto.)

Aquí está un ejemplo sencillo, a pesar de que ofrece muchas características interesantes que no se muestran aquí:

import scalikejdbc._ 

Class.forName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource") 

ConnectionPool.singleton("jdbc:mysql://localhost:3306/myschema", "user", "password") 

DB.localTx { implicit conn => 

    val data = sql"select mystringcol, myintcolumn from mytable".map { 
    rs => (rs.string("mystringcol"), rs.int("myintcolumn")) 
    }.list().apply() 

    println(data) 

} 

Algunos enlaces de documentación:

Cuestiones relacionadas