JDBC
java SE8 GOLDの範囲であるところの「JDBC」についてのまとめを試みます!
「JDBC」とは、javaから様々なデータベースにアクセスできるようにするための仕組み、いわゆるインターフェースです。
silverの時にも学んだ「多態性」をデータベースにも適用しているというわけです。
つまりこれがあると何ができるのかというと、Oracle,MySQL,PostgreSQL...ほかに思いつかないですけど(無知)
JDBCを用意することで、これらのデータベースに__1行で接続できる__ようになります。
使い方
まず必要なものはこちらです。
・JDBCドライバ
以上です。
それから、ここではEclipse,MySQLで行うものとします。
JDBCドライバ
「jdbcドライバ [使いたいデータベース名]」で検索すると出てきます。
自分の使うデータベースに応じたものをダウンロードします。
ダウンロードしたものを開くと、JARファイルが入っています。
(mysqlだと「mysql-connector-java-〇〇.jar」です。)
これがJDBCドライバの本体です。
適当に置いておいたままではjavaはこれがどこにあるのかわかりません。
なので色々なメッセージで「これはどこにあるのだ」と訴えてきます。
Eclipseで実行するにも、設定が必要です。
プロジェクトを右クリック → [プロパティ] → [Javaのビルドパス] → [ライブラリー]タブ → [外部JARの追加]
この手順で、自分が先ほどダウンロードしたJARファイルを指定します。
No Suitable Driver found for ...
こんなエラーを出す場合があります。
これがつまり、上の「これはどこにあるのだ」という状態です。
ちょっと話は逸れますが、サーブレットでの実行時は上記の設定では足りません。
足りない、というよりも、JARファイルの置き場所に注意が必要になります。
[WEB-INF/lib]
この直下にJARファイルを配備します。
書き方
Eclipseでプロジェクト、パッケージ、クラスを作成して、いざ書いてみます。
String jdbc = "jdbc:mysql://localhost/test_db?serverTimezone=JST";
// jdbc:(データベース名)://localhost/(スキーマ名)?(タイムゾーン情報)
まずはこれです。
後に書くConnectionクラスを使う際にjdbcの居場所をこれで特定します。
try(Connection con = DriverManager.getConnection(jdbc,"root","pass");
Statement statement = con.createStatement();
ResultSet resultSet = statement.executeQuery(sql)){
try-with-resouece文の途中です。
jdbc関連はSQLExceptionを投げますので、tryで囲んでいます。
Connectionオブジェクトを使って接続しています。
getConnection()
の引数は、
1.JDBCドライバの情報
2.データベースのユーザー名
3.パスワード(データベース作成時に設定したもの)
となっています。
この接続を使って、StatementオブジェクトにSQL文を受け取る準備をさせます。
3行目にてついにSQL文を実行しています。
ResultSetは読んで字のごとく"結果セット"です。
executeQuery()
はSELECT文の結果を受け取ることができます。まとめてゴソっと入ってくるので、これを後で取り出しましょう。
そして、開いた接続は閉じねばなりません。
本来であれば各クラスにあるclose()
で閉じてあげるのですが、try-with-resouce文で解放してあげれば問題ありません。
while(resultSet.next()){
System.out.println(resultSet.getString(2));
}
どんなSQL文を投げたかによりますが、これは結果セットを取り扱っている文の一例です。
まず1行目のnext()
はResultSetクラスのメソッドです。これは、届いた結果セットの「次の行」へ移ります。
1回目であれば「1行目」を見てくれます。2回目以降は、一行ずつ進んでいってくれます。便利ですね。
IteratorのhasNext()と似たような働きをしてくれます。
ここでは、行がある限り処理を行ってくれます。
ちなみにここではSELECT * FROM human
というSQLを投げることとしました。
humanテーブル
には複数のカラムがありますが、___2番目___にname
というカラムがあるとします。このカラムは文字列のデータが入っているので、String___で受け取ることができます。
故に、ここではgetString(2)
___となります。
もちろん、受け取るデータ型とメソッドが合っていなければデータを受け取ることができません。
それぞれのデータ型に応じてメソッドは用意されていますので、適宜使い分けていきます。getObject()
で受け取ってからjava上で振り分けていくこともできます。
また、getXX()の引数の整数ですが、これは補足しておくと"結果セットのカラムのインデックス"です。今回はカラムの指定をしていないので、2番目のカラムということでgetString(2)
としました。
ですが、もしSQLがSELECT name FROM human
だった場合、nameしかありませんからこの数字は"1"になります。
(0から数えません。1が始まりです。注意です。)