2010-06-19 87 views
7

我正在研究一個我想解析一些數據的小項目,然後將它放到數據庫中。我沒有和Lift一起工作,我一直沒有找到一個標準的方法來做到這一點。如何使用Scala連接到MySQL數據庫?

我很好寫自己的查詢,但我不知道用什麼來實際連接到數據庫。

+1

這個問題有很多很好的信息:http://stackoverflow.com/question s/1362748/wanted-good-examples-of-scala-database-persistence – 2011-06-24 03:04:33

回答

11

您可以使用JDBC - 使Java與數據庫交談的標準方法。您將需要適當的MySQL JDBC驅動程序。 Apache DbUtils提供了一些圍繞JDBC的實用程序類,並且會很有用。

如果你想要一個更高層次的API,它需要一些樣板,然後檢查Spring's JDBC integration

如果你想要一個ORM(對象關係映射),那麼Hibernate是一個不錯的選擇。

我已經在Scala中使用了所有三個成功的東西。

5

我實際上在Scala中編寫了一個SQL command shell,它與存在JDBC驅動程序的任何任意數據庫進行通信。正如Brian Agnew指出的那樣,它完美地工作。此外,還有諸如Querulous,SQueryLOR/Broker等提供Scala友好型數據庫層的工具。他們坐在JDBC之上,但他們提供了一些額外的語義(通過DSL,在某些情況下),讓您更容易。

2

爲了完整性,還請查看RichSQL。它是演示代碼,演示如何包裝JDBC以製作更多類似Scala的操作,但實際上它非常實用。它具有簡單和小巧的優點,因此您可以輕鬆研究源代碼以瞭解發生了什麼。不要忘記關閉()你的PreparedStatements。

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

當然,你可以使用所有的Java版本使用JDBC(休眠,彈簧等)兼容,但爲了更好的使用Scala語言,我建議使用Scala的具體框架,有更好的DSL。

簽出更多關於這些框架 - 一個高度抽象的可擴展性和功能性的編程風格

  • Slick
  • +0

    也考慮[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

    1

    我剛剛發現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) 
    
    } 
    

    一些文檔鏈接: