簡體   English   中英

如何使用Scala連接到MySQL數據庫?

[英]How can I connect to a MySQL database using Scala?

我正在開發一個小項目,我想解析一些數據,然后把它放到數據庫中。 我沒有使用Lift,我也找不到標准的方法來做到這一點。

我自己編寫查詢很好,但我不確定用什么來實際連接到數據庫。

您可以使用JDBC - 使Java與數據庫通信的標准方法。 您需要適當的MySQL JDBC驅動程序。 Apache DbUtils提供了一些圍繞JDBC的實用程序類,並且非常有用。

如果你想要一個更高級別的API,它需要一些樣板,那么請查看Spring的JDBC集成

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

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

當然,您可以使用與JDBC兼容的所有Java版本(Hibernate,Spring等),但為了更好地使用Scala語言,我建議使用具有更好DSL的Scala特定框架。

  • 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

我實際上在Scala中編寫了一個SQL命令shell ,它與任何存在JDBC驅動程序的任意數據庫進行通信。 正如Brian Agnew所說,它完美無缺。 此外,還有像QuerulousSQueryLOR / Broker這樣的工具可以提供Scala友好的數據庫層。 它們位於JDBC之上,但它們提供了一些額外的語義(在某些情況下通過DSL)以使您更容易。

嘗試O / R經紀人

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

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

我剛剛發現了ScalikeJDBC,它為JDBC提供了類似Scala的API包裝器

(我發現ScalikeJDBC研究如何使用時ScalaAnorm 無間隙框架 。現在看來,我不會需要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)

}

一些文檔鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM