$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

ScalaでのJDBCによるDB操作の勉強をした

ScalaでPlay+Slickの勉強をし始めたのだけど、DIを使ってDBオブジェクトを取得したり、コネクションプールを使っていたり、クエリ発行はDSLだったりと、色々なことをやっていて全く理解できなかった。そのため、とりあえず地道に下の方から学習して、分からないところを減らしていこうと思ったので、まずはJDBCによるDB操作の勉強をした。

とりあえず使い方をさっと理解するために https://www.postgresql.jp/document/7.4/html/jdbc.html が参考になった。

JDBCとは

PerlDBIみたいなやつとおぼえた。ドライバの組み合わせもDBD::mysqlやDBD::pgみたいなものとおぼえた。

依存の追加

今回はPostgreSQLを使って操作をしようと思ったので、そのドライバを依存に追加する。build.sbtに以下のように記述する。

libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"

DB操作のサンプルコードの実装

https://www.postgresql.jp/document/7.4/html/jdbc.html を参考にしながら、自分でサンプルコードを書いてみると以下のようになった。

import java.sql._
import scala.util.Random

/**
 $ createdb jdbc-example
 $ psql jdbc-example
 CREATE TABLE person (
   id SERIAL NOT NULL PRIMARY KEY,
   name VARCHAR(254) NOT NULL
 );
 */
object JdbcExample {
  def main(args: scala.Array[String]) = {
    Class.forName("org.postgresql.Driver")
    val db = DriverManager.getConnection(
      "jdbc:postgresql:jdbc-example",
      "dbuser",
      "dbuser"
    )

    val newName = Random.alphanumeric.take(10).mkString
    val st1 = db.prepareStatement("INSERT INTO person (name) VALUES(?)")
    st1.setString(1, newName)
    val rowsInserted = st1.executeUpdate()
    println(rowsInserted + " inserted. name = " + newName)
    st1.close()

    val limit = 3
    val st2 = db.prepareStatement("SELECT id, name FROM person ORDER BY id DESC LIMIT ?")
    st2.setInt(1, limit)
    val rs2 = st2.executeQuery()
    while (rs2.next()) {
      println("id: " + rs2.getInt(1))
      println("name: " + rs2.getString("name"))
    }
    rs2.close()
    st2.close()

    db.close()
  }
}
  • まず、Class.forNameでJDBCで使うドライバを読み込む
  • 次にgetConnectionでDB名やユーザー名、パスワードを指定して、DBのコネクションを取得
  • prepareStatementとsetStringでDBのプレースホルダーを使ってクエリ発行ができるので、これでランダムなnameを作ってpersonテーブルにINSERT
  • 次にpersonテーブルに入っているデータをSELECT。LIMITは3件にしてみる。
    • ResultSetが返ってくるので、nextで一行ずつ見ながら、getIntやgetStringを使ってカラムのデータを取得していける

これで実行してみると以下のような出力を得られる。

> runMain JdbcExample
fGdQ97AoFu
1 inserted. name = fGdQ97AoFu
id: 1
name: fGdQ97AoFu
> runMain JdbcExample
JnS9X2nt2b
1 inserted. name = JnS9X2nt2b
id: 2
name: JnS9X2nt2b
id: 1
name: fGdQ97AoFu
> runMain JdbcExample
M5ZGqRLjqA
1 inserted. name = M5ZGqRLjqA
id: 3
name: M5ZGqRLjqA
id: 2
name: JnS9X2nt2b
id: 1
name: fGdQ97AoFu
> runMain JdbcExample
KARBx9lGLG
1 inserted. name = KARBx9lGLG
id: 4
name: KARBx9lGLG
id: 3
name: M5ZGqRLjqA
id: 2
name: JnS9X2nt2b

これでひとまず簡単なDB操作ができるようになった。

まとめ

今回はひとまずJDBCをそのまま使ってDB操作を行う方法について学習した。コードは https://github.com/shibayu36/scala-playground/blob/master/src/main/scala/JdbcExample.scala においた。

さらにJDBCの使い方について学ぶには https://jdbc.postgresql.org/documentation/93/ あたりを読むのが良さそう。

他にもコネクションプールを使うとか、いろいろアドバンスドな使い方はあると思うけど、一旦JDBCを使った操作の学習はここまでにしておく。