MySQL JDBC を使ってみよう

JDBC を利用した MySQL への接続

MySQL への接続を確立するには、 java.sql.DriverManager の getConnection メソッドを呼びます。

getConnection にはデータベースへの URL (データベース名、ユーザー名、パスワードを含んだ接続文字列) を渡すことによって、 これが MySQL への JDBC 接続であることを認識します。

conn = DriverManager.getConnection(
     "jdbc:mysql://localhost/db1?user=usr1&password=urpwd");

getConnection メソッドは何らかの理由でデータベースへ接続できない場合等に、 SQLException を投げます。これをキャッチしてしかるべき処置をとる必要があります。(例えば、ユーザーに正常な処理が行えなかったことを表示するなど)

また、接続語は確実に接続を閉じるために try - finally を利用して、close メソッドを呼び出します。

以上を踏まえると、java.sql.Connection を利用するときは以下のようなコードになります。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySQLTest1 {

     public static void main(String[] args) {

          Connection conn;

          try {

               conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/db1?user=usr1&password=urpwd");

               try {

                    // ここでクエリを実行

               }
               finally {

                    // 直前の try ブロックに入ったら、ここは必ず実行される
                    conn.close();

               }

          } catch (SQLException ex) {

               // 接続できない時

          }

     }

}

クエリの実行

データベースに接続したら、好きなクエリを実行できます。

ここでは、次のスクリーンショットのように、rates というテーブルからデータを取得します。

ちなみに、このスクリーンショットは MySQL の管理ツールである MySQL Administrator の画面です。 MySQL を利用するときはこのツールを利用すると、何かと便利です。

さて、JDBC を用いて、上記スクリーンショットと同様に3件のデータが取得できるか試してみましょう。

クエリを実行するときは、Connection の createStatement メソッドを用いてステートメント (Statement) オブジェクトを作成します。 そして、そのステートメントオブジェクトの executeQuery メソッドを用いてクエリを実行します。

結果は ResultSet オブジェクトとして取得できます。

これらをまとめると、以下のコードになります。

Statement stat;
ResultSet rs;

stat = conn.createStatement();
rs = stat.executeQuery(
     "SELECT * FROM rates WHERE code='JPY' AND 138 < rate" );

while( rs.next() ) {

     System.out.format(
          "%s %.2f\n",
          rs.getDate(2), // 1 based index
          rs.getDouble(3)
     );

}

必要に応じて、次のように import してください。

import java.sql.ResultSet;
import java.sql.Statement;

尚、ResultSet の getXXX (XXX は型の名前) メソッドで結果を取得しますが、上記の例のようにカラムのインデックスを用いる場合には、 インデックスは1始まりです。

インデックスではなく、次のようにカラム名を指定することも可能です。

while( rs.next() ) {

     System.out.format(
          "%s %.2f\n",
          rs.getDate( "date" ),
          rs.getDouble( "rate" )
     );

}

実行例

以上をまとめると、簡単なクエリを行うプログラムは次のように書くことができます。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySQLTest1 {

     public static void main(String[] args) {

          Connection conn;
          Statement stat;
          ResultSet rs;

          try {

               conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/db1?user=usr1&password=urpwd");

               try {

                    stat = conn.createStatement();
                    rs = stat.executeQuery(
                         "SELECT * FROM rates WHERE code='JPY' AND 138 < rate" );

                    while( rs.next() ) {

                         System.out.format(
                              "%s %.2f\n",
                              rs.getDate(2), // 1 based index
                              rs.getDouble(3)
                         );

                    }

               }
               finally {

                    conn.close();

               }

          } catch (SQLException ex) {

               System.out.println("SQLException: " + ex.getMessage());
               System.out.println("SQLState: " + ex.getSQLState());
               System.out.println("VendorError: " + ex.getErrorCode());

          }

     }

}

実行例は次のとおりです。

> java MySQLTest1
2009-06-10 138.03
2009-08-10 138.01
2009-10-26 138.09

ドライバーが CLASSPATH に正しく設定されていない場合などは、コンパイル時あるいは実行時に失敗しますので、 そのときは MySQL のドライバーの設定 を確認してください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門