ScalaでDB操作

Scala勉強会#3の資料(PDFリンク)をみながら試してみました。JavaJDBC使うのとまったく同じ。簡単すぎてビビる。

MySQLのテーブル

mysql> select * from bs_tb;
+------+------+------+
| bang | uria | tuki |
+------+------+------+
| A103 |  101 |    4 |
| A102 |   54 |    5 |
| A104 |  181 |    4 |
| A101 |  184 |    4 |
| A103 |   17 |    5 |
| A101 |  300 |    5 |
| A102 |  205 |    6 |
| A104 |   93 |    5 |
| A103 |   12 |    6 |
| A107 |   87 |    6 |
| A109 |  333 | NULL |
+------+------+------+
11 rows in set (0.07 sec)

mysql> desc bs_tb;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| bang  | varchar(10) | YES  |     | NULL    |       |
| uria  | int(11)     | YES  |     | NULL    |       |
| tuki  | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

これは基礎からのMySQL [基礎からのシリーズ] (プログラマの種シリーズ)に書いてあった練習用テーブルです。

サンプルコード

import java.sql.DriverManager

object DB {

	def main(args: Array[String]) = {
		selectLikeJava()
	}

	def selectLikeJava() = {
		Class.forName("com.mysql.jdbc.Driver")
		val db = DriverManager.getConnection(
			"jdbc:mysql://{ホスト名}/{データベース名}",
			"{アカウント}",
			"{パスワード}")
		val st = db.createStatement
		val sql = "SELECT * FROM bs_tb"
		val res = st.executeQuery(sql)

		while (res.next) {
			val bang = res.getString(1)
			val uria = res.getInt(2)
			val tuki = res.getInt(3)
			printf("%4s %4d %4d\n", bang, uria, tuki)
		}
	}

}

{ホスト名}{データベース名}{アカウント}{パスワード}の部分は自分の環境に応じて書き換えてください。

sbtでの実行結果

テーブルの内容をSELECT文で全部表示しただけです。

[info] Running DB 
A103  101    4
A102   54    5
A104  181    4
A101  184    4
A103   17    5
A101  300    5
A102  205    6
A104   93    5
A103   12    6
A107   87    6
A109  333    0
[info] == run ==
[success] Successful.

実行するには、JDBCが必要となります。MySQLのサイト(リンク)からダウンロードしてクラスパスに通せばいいんですけど、自分はsbt使ってるので、以下のようにビルド環境を扱ってくれるクラスに書いて、updateすれば自動ダウンロードと自動設定してくれるようになってます。

project/build/MyProject.scala
import sbt._

class MyProject(info: ProjectInfo) extends DefaultProject(info) {
	val mysql = "mysql" % "mysql-connector-java" % "5.1.13"
}

Scala-dbcについて

ScalaでDB操作するにはもうひとつやり方があって、Scala-dbcという標準APIを使うことができます。
ただ、書き方にちょっと癖があるのと、まだ開発途上であるため、ScalaAPIリンク)でも公開されていません。現在は、Scala-dbc2というのが策定中らしく、構文とかが変わる可能性もあります。まだ実用ではなさそうですね。
Scala-dbcの構文は、DSL使って実現してるらしいので、勉強材料として面白いと思います。自分はDSLの仕組みがちゃんと理解できてないので、そもそもなぜコンパイルエラーにならないのか、というとこからわかりませんが。