Javaプログラムの作成

Javaプログラムからデータベースに対してアクセスするためには、 JDBC を利用します。
JDBCとは、Javaからデータベースに対してアクセスするための標準APIです。
パッケージ java.sql にインタフェースおよび抽象クラスが用意してあり、 データベース付属のライブラリからその実装が提供されます。

JDBCコードの基本

JDBCは基本的に以下のように処理を記述します。

  1: import java.sql.Connection; 
  2: import java.sql.DriverManager; 
  3: import java.sql.ResultSet; 
  4: import java.sql.SQLException; 
  5: import java.sql.Statement; 
  6: 
  7: ...
  8: 
  9: // 下準備 
 10: Class.forName("org.h2.Driver"); 
 11: Connection connection = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", ""); 
 12: Statement statement = connection.createStatement(); 
 13: 
 14: // データベースからデータを取得する場合
 15: ResultSet resultSet = statement.executeQuery("SQL文"); 
 16: // 後始末
 17: resultSet.close();
 18: 
 19: // データベースのデータを操作する場合
 20: int updateCount = statement.executeUpdate("SQL文");
 21: 
 22: // 後始末
 23: statement.close();
 24: connection.close();

10~11行目:
データベース付属のJDBCドライバを初期化し、java.sql.Connectionオブジェクトを取得します。
ここで指定するパラメータは接続対象のデータベースにより異なります。
H2 Databaseの場合は以下のようになります。

項目名
ドライバクラス名 org.h2.Driver
接続先URL名 jdbc:h2:tcp://localhost/~/test
接続ユーザ名 sa
接続パスワード (空文字列)
12~20行目:
java.sql.ConnectionオブジェクトからStatementオブジェクトを取得し、SQL文を実行します。
一般的にはデータを取得する場合はexecuteQueryメソッドを、 データを操作する場合はexecuteUpdateメソッドを呼び出します。
23~25行目:
データベースの操作が完了したら、各オブジェクトのcloseメソッドを呼び出し、処理を完了します。


Javaプロジェクトの作成

では実際にデータベース操作アプリケーションのコードを記述し、デバッグ・動作確認してみましょう。

ここでは以下のような動作をするアプリケーションを作成します。


  1. まずEclipseワークスペース内に プロジェクト を作成します。
    プロジェクトとは、Eclipse上でのアプリケーションの単位です。
    Eclipseの「Package Explorer」上で右クリックし、「New」-「Project...」を選択します。

  2. 以下のようなダイアログが表示されるので、「Java」-「Java Project」を選択します。

    アプリケーション作成(1)

  3. 以下のようなダイアログが表示されるので、「Project name」に「userdb」と入力し、「Next」を押します。

    アプリケーション作成(2)

  4. 「Libraries」タブを選択し、「Add External JARs」を押します。

    アプリケーション作成(3)

  5. ファイルダイアログで「C:\Program Files\H2\bin」ディレクトリ内の「h2-1.1.108.jar」を選択し、「Finish」ボタンを押します。
    この作業により、H2 Databaseにアクセスするためのクラス群をuserdbプロジェクトから呼び出せるようになります。

    アプリケーション作成(4)


Javaクラスの作成

データベースにアクセスするプログラムをtest.Userクラスとして作成してみましょう。

  1. testパッケージにUserDBクラスを作成します。

    アプリケーション作成(5)

  2. UserDB.javaとして以下のようなコードを作成します。
    コードのうち、重要な部分をいくつか抜粋すると以下のようになります。

    ダウンロード UserDB.java

    23~38行目:
     23: public static void main(String[] args) {
     24:     UserDB userDB = new UserDB();
     25:     
     26:     try{
     27:         // オブジェクトを生成
     28:         userDB.create();
     29:         
     30:         // データ操作
     31:         userDB.execute(args);
     32:     }catch(Throwable t) {
     33:         t.printStackTrace();
     34:     }finally{
     35:         // オブジェクトを破棄
     36:         userDB.close();
     37:     }
     38: }

    コンソールアプリケーションとして実行するため、main関数を定義。
    61~67行目:
     61: public void create()
     62:     throws ClassNotFoundException, SQLException{
     63:     // 下準備
     64:     Class.forName("org.h2.Driver");
     65:     _connection = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
     66:     _statement = _connection.createStatement();
     67: }

    JDBD接続を初期化するコードを定義。
    113~131行目:
    113: private void executeSelect()
    114:     throws SQLException{
    115:     ResultSet resultSet = _statement.executeQuery("SELECT * FROM " + TABLE_NAME);
    116:     try{
    117:         boolean br = resultSet.first();
    118:         if(br == false) {
    119:             return;
    120:         }
    121:         do{
    122:             String id = resultSet.getString("ID");
    123:             String name = resultSet.getString("NAME");
    124:             String password = resultSet.getString("PASSWORD");
    125:             
    126:             System.out.println("id: " + id + ", name: " + name + ", password: " + password);
    127:         }while(resultSet.next());
    128:     }finally{
    129:         resultSet.close();
    130:     }
    131: }

    テーブルの内容を取得するコードを定義。
    139~144行目:
    139: private void executeInsert(String id, String name, String password)
    140:     throws SQLException{
    141:     // SQL文を発行
    142:     int updateCount = _statement.executeUpdate
    ("INSERT INTO " + TABLE_NAME + " (ID,NAME,PASSWORD) VALUES ('"+id+"','"+name+"','"+password+"')"); 143: System.out.println("Insert: " + updateCount); 144: }

    テーブルにデータを追加するコードを定義。


ここまでのファイル

ここまででプロジェクトディレクトリの内容は以下のようになります。
正しく作成できているか、確認してください。

ダウンロード userdb_1.zip


デバッグ・動作確認

では、UserDB.javaをデバッグしましょう。

  1. 「Package Explorer」の「UserDB.java」アイコン上で右クリックし、「Debug As」-「Java Application」を選択します。

    まだコマンドラインオプションを指定していないので、以下のようなエラーが出力されるはずです。
    異なるエラーメッセージが出力された場合は、ソースコード(特にUserDB.create())が間違っていないか、 H2 Databaseが起動しているかどうかを確認してください。

    java.lang.ArrayIndexOutOfBoundsException: 0
        at test.UserDB.execute(UserDB.java:98)
        at test.UserDB.main(UserDB.java:31)

  2. 次に、コマンドラインオプションを指定します。
    「Package Explorer」の「UserDB.java」アイコン上で右クリックし、「Debug As」-「Debug Configurations...」を選択します。

  3. 以下のようなダイアログボックスが表示されますので、「Arguments」タブを選択し、「Program Arguments」に「select」と入力してください。

    デバッグ(1)

  4. 「Apply」ボタンを押し入力内容を保存した後、「Close」ボタンを押しダイアログを閉じます。

  5. コードの動作確認のために、ブレークポイントを設定しましょう。
    コードを停止したい行の左端を左ダブルクリックすると、以下のようにブレークポイントを示す印が表示されます。

    デバッグ(2)

  6. では、改めてUserDB.javaをデバッグしましょう。
    「Package Explorer」の「UserDB.java」アイコン上で右クリックし、「Debug As」-「Java Application」を選択します。

  7. 以下のようなデバッグ画面が表示されますので、各機能を利用して順次実行します。
    変数ビューでの変数確認もおこなうようにしてください。


    デバッグ画面

    各機能の役割は以下の通りです。

    名称 説明
    Resume 実行を続行します。
    Terminate 終了します。
    Step Into 関数内部を実行します。
    Step Over 1行実行します。(関数内部には入らない)
    Step Return 関数から脱出します。
    Code デバッグ中のコードを表示します。
    Debug 表示中のコードの呼び出しスタックを表示します。
    Variables 表示中のコードの変数一覧を表示します。

    以下のような出力がおこなわれればデバッグ成功です。
    同じ要領で、insert、update、deleteも動作確認をしてください。

    id: TEST2, name: テスト2, password: TEST2PASSWORD