ScalaでPlay+Slickの勉強をし始めたのだけど、DIを使ってDBオブジェクトを取得したり、コネクションプールを使っていたり、クエリ発行はDSLだったりと、色々なことをやっていて全く理解できなかった。そのため、とりあえず地道に下の方から学習して、分からないところを減らしていこうと思ったので、まずはJDBCによるDB操作の勉強をした。
とりあえず使い方をさっと理解するために https://www.postgresql.jp/document/7.4/html/jdbc.html が参考になった。
依存の追加
今回は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で使うドライバを読み込む
- 今回はPostgreSQLのドライバを利用
- なぜこれでDBアクセスが使えるようになるかは http://d.hatena.ne.jp/spider-man/20080307/p1 が参考になる
- 次に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を使った操作の学習はここまでにしておく。