LoginSignup
6
2

More than 5 years have passed since last update.

ScalaのREPLからJDBCを使って対話的にMySQLを操作する

Last updated at Posted at 2016-05-16

背景

Play2/Scala 開発環境を作っていて、MySQL JDBCドライバーを経由してローカルマシンのMySQLに接続しようとしたが、上手くいかない。
原因箇所が、
* ライブラリの依存関係不足
* JDBCの設定ミス
* MySQL側の設定や状態がおかしい
と3つあり、変更する箇所を迅速に切り替えつつ、効率的に問題の切り分けをしたかった。
REPLから対話的にJDBCを経由して、MySQLへの接続を試すのが、最も効率的と思い、やってみました。

Scala REPLから対話的に使う

まず、MySQLドライバーをダウンロードし、そのjarファイルをロードしながらScalaのREPLを立ち上げます。

$ scala -classpath PATH_TO/mysql-connector-java-5.1.39-bin.jar

ScalaのREPLが立ち上がりました。

scala>

JDBCをimportします。

scala> import java.sql.{Connection, DriverManager, ResultSet};
import java.sql.{Connection, DriverManager, ResultSet}

MySQLのJDBCドライバーをロードします。

scala> classOf[com.mysql.jdbc.Driver]
res0: Class[com.mysql.jdbc.Driver] = class com.mysql.jdbc.Driver

接続情報を設定します。

scala> val conn_str = "jdbc:mysql://localhost:3306/some_database?user=root&password=''"
conn_str: String = jdbc:mysql://localhost:3306/some_database?user=user_name&password=some_password

接続します。

scala> val conn = DriverManager.getConnection(conn_str)
conn: java.sql.Connection = com.mysql.jdbc.JDBC4Connection@32709393

これで接続されました。
あとは、JDBCのコードを対話的にかけます。

scala> val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
scala> val rs = statement.executeQuery("SELECT * FROM some_table LIMIT 5")

Scalaといいながら、Javaのライブラリを使っているので、90%位はJavaそのものです。

接続を閉じます。

scala> conn.close

ちなみにこの結果、build.sbt上の依存ライブラリの記述に原因があることが迅速にわかりました。今回は、開発環境上で行いましたが、テスト環境上での問題切り分けにも有効ですね、REPL。

その他応用

ScalaからJavaのライブラリが使えることを利用して、REPLで簡単に対話的にライブラリの動作を確認できました。。

その後、調べて、Java REPLもあることを確認。一般的にJava界では、コードやライブラリを対話的に試すっていう感覚が少ないですよね。
自分もRubyとJavaを行ったり来たりしてたのに、これまでJavaでは対話的にコードを触ろうという発想がなかった(固定観怖い)。なので、スクリプト言語では当たり前の対話的な実行方法で、Javaのライブラリを対話的に触れる、というのはすごく新鮮、かつ地味に便利なのではないかなと思い記録

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2