如何使用Scala连接到MySQL数据库?

时间:2010-06-19 20:08:24

标签: mysql scala

我正在开发一个小项目,我想解析一些数据,然后将它放入数据库中。我没有使用Lift,我也找不到标准的方法来做到这一点。

我自己编写查询很好,但我不确定用什么来实际连接到数据库。

6 个答案:

答案 0 :(得分:11)

您可以使用JDBC - 让Java与数据库通信的标准方法。您需要适当的MySQL JDBC驱动程序。 Apache DbUtils提供了一些围绕JDBC的实用程序类,并且很有用。

如果你想要一个更高级别的API,它需要一些样板,那么请查看Spring's JDBC integration

如果你想要一个ORM(对象关系映射),那么Hibernate是一个不错的选择。

我已成功使用Scala中的所有三个。

答案 1 :(得分:5)

我实际上在Scala中编写了一个SQL command shell,它与任何存在JDBC驱动程序的任意数据库进行通信。正如Brian Agnew所说,它完美无缺。此外,还有QuerulousSQueryLOR/Broker等工具可提供对Scala友好的数据库图层。它们位于JDBC之上,但它们提供了一些额外的语义(在某些情况下通过DSL),以便于您使用。

答案 2 :(得分:5)

当然,您可以使用与JDBC兼容的所有Java版本(Hibernate,Spring等),但为了更好地使用Scala语言,我建议使用Scala特定的框架,它具有更好的DSL。

  • ScalaQuery是一种基于JDBC构建的API / DSL(特定于域的语言),用于访问Scala中的关系数据库。它的设计考虑了以下目标:
  • Squeryl是一个Scala ORM和DSL,用于与数据库进行通信,具有最小的冗长和最大类型安全性
  • SORM是一个Scala ORM框架,旨在通过高级抽象和函数式编程风格消除样板代码并解决可伸缩性问题
  • Slick - 使用功能关系映射的Typesafe支持项目

https://stackoverflow.com/questions/1362748/looking-for-a-comparison-of-scala-persistence-frameworks

查看有关这些框架的更多信息

答案 3 :(得分:3)

尝试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 :(得分:2)

为了完整性,还可以查看RichSQL。它的演示代码展示了如何包装JDBC以进行更多类似Scala的操作,但它实际上非常有用。它具有简单和小巧的优点,因此您可以轻松地研究源,看看发生了什么。不要忘记关闭()您的PreparedStatements。

答案 5 :(得分:1)

我刚发现ScalikeJDBC which offers a Scala like API wrapper for JDBC

(我在研究如何使用ScalaAnorm without Play Framework时找到了ScalikeJDBC。现在看起来我不想在我的项目中使用Anorm。)

这是一个简单的例子,虽然它提供了许多有趣的功能:

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)

}

一些文档链接: