我正在研究一個我想解析一些數據的小項目,然後將它放到數據庫中。我沒有和Lift一起工作,我一直沒有找到一個標準的方法來做到這一點。如何使用Scala連接到MySQL數據庫?
我很好寫自己的查詢,但我不知道用什麼來實際連接到數據庫。
我正在研究一個我想解析一些數據的小項目,然後將它放到數據庫中。我沒有和Lift一起工作,我一直沒有找到一個標準的方法來做到這一點。如何使用Scala連接到MySQL數據庫?
我很好寫自己的查詢,但我不知道用什麼來實際連接到數據庫。
您可以使用JDBC - 使Java與數據庫交談的標準方法。您將需要適當的MySQL JDBC驅動程序。 Apache DbUtils提供了一些圍繞JDBC的實用程序類,並且會很有用。
如果你想要一個更高層次的API,它需要一些樣板,然後檢查Spring's JDBC integration。
如果你想要一個ORM(對象關係映射),那麼Hibernate是一個不錯的選擇。
我已經在Scala中使用了所有三個成功的東西。
我實際上在Scala中編寫了一個SQL command shell,它與存在JDBC驅動程序的任何任意數據庫進行通信。正如Brian Agnew指出的那樣,它完美地工作。此外,還有諸如Querulous,SQueryL和OR/Broker等提供Scala友好型數據庫層的工具。他們坐在JDBC之上,但他們提供了一些額外的語義(通過DSL,在某些情況下),讓您更容易。
爲了完整性,還請查看RichSQL。它是演示代碼,演示如何包裝JDBC以製作更多類似Scala的操作,但實際上它非常實用。它具有簡單和小巧的優點,因此您可以輕鬆研究源代碼以瞭解發生了什麼。不要忘記關閉()你的PreparedStatements。
嘗試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)
}
當然,你可以使用所有的Java版本使用JDBC(休眠,彈簧等)兼容,但爲了更好的使用Scala語言,我建議使用Scala的具體框架,有更好的DSL。
簽出更多關於這些框架 - 一個高度抽象的可擴展性和功能性的編程風格
也考慮[ScalikeJDBC](http://scalikejdbc.org/),它與上面列出的非常相似。 Play Framework相關的[ScalaAnorm](https://github.com/playframework/anorm/blob/master/docs/manual/working/scalaGuide/main/sql/ScalaAnorm.md)也是類似的。我創建了一個關於ScalikeJDBC的完整答案。 – 2016-01-02 15:35:03
我剛剛發現ScalikeJDBC which offers a Scala like API wrapper for JDBC。
(當我研究如何使用ScalaAnormwithout 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)
}
一些文檔鏈接:
這個問題有很多很好的信息:http://stackoverflow.com/question s/1362748/wanted-good-examples-of-scala-database-persistence – 2011-06-24 03:04:33