1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

はじめてのGOLD「JDBC」

Last updated at Posted at 2019-01-14

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が始まりです。注意です。)

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?