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

8

我正在开展一个小项目,需要解析一些数据并将其存储到数据库中。我没有使用Lift框架,并且没有找到标准的方法来完成此项任务。

我可以自己编写查询语句,但是我不知道要使用什么工具来连接数据库。


1
这个问题包含了很多有用的信息:http://stackoverflow.com/questions/1362748/wanted-good-examples-of-scala-database-persistence - David J.
6个回答

12
你可以使用JDBC - 这是Java与数据库通信的标准方式。你需要适当的MySQL JDBC驱动程序。Apache DbUtils提供了一些围绕JDBC的实用类,可能会有帮助。
如果你想要一个更高级别的API,可以减少一些样板代码,请查看Spring的JDBC集成
如果你想要一个ORM(对象关系映射),那么Hibernate是一个不错的选择。
我已经在Scala中成功地使用了这三个工具。

7
当然,您可以使用与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,了解有关这些框架的更多信息。


还要考虑ScalikeJDBC,它与上述列出的非常相似。此外,Play Framework的相关ScalaAnorm也很类似。我创建了一个关于ScalikeJDBC的完整答案。 - Peter Lamberg

5
我实际上写了一个使用Scala编写的SQL命令行工具,可以与任何存在JDBC驱动程序的数据库通信。正如Brian Agnew所指出的那样,它完美地工作。此外,还有像Querulous, SQueryLOR/Broker这样的工具,提供Scala友好的数据库层。它们建立在JDBC之上,但它们提供了一些额外的语义(通过DSL,在某些情况下),以使您的工作更加轻松。

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)
}

2

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


1
我刚刚发现ScalikeJDBC,它提供了一个Scala风格的JDBC API包装器
(我在研究如何使用ScalaAnorm而不需要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)

}

一些文档链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接