金子邦彦研究室プログラミングJDBC によるデータベース・プログラミングと Spring JDBCEclipse を用いた JDBC プログラミング

Eclipse を用いた JDBC プログラミング

このページでは,Eclipse を使って,Java 言語の JDBC プログラムを作る手順を, 見本となるプログラムと説明する. JDBC は,Java 言語でリレーショナルデータベースを操作するための手段として使う.

Java プログラムの主要部分を抜き出すと,次のようになる. Java プログラムの中に SQL プログラムが埋めこまれます.SQL の結果(結果は,複数のレコードになる)が, ループで,Java の変数に格納されていきます.

            ResultSet rs = execute( "select * from commodity" );;
            DecimalFormat dformat = new DecimalFormat ("#,###円");
            while(rs.next()){         
                int t = rs.getInt("type");
                    String n = rs.getString("name");
                    int p = rs.getInt("price");
                    System.out.println(t + " " + n + " " + dformat.format( p ) );

* ここに書いたように,SQL プログラムの結果を Java で扱うために,ちょっとしたプログラムを組む必要がある. このとき,JDBC だけを使うよりも,JDBC と SpringJDBC を組み合わせる方が,簡単に正しく動くプログラムを書けるかも知れません.

この Web ページに書いたプログラムは,PostgreSQL の利用で 動く.ごく簡単な設定の変更で、MySQL の利用Java DB 他のリレーショナルデータベースソフトウェアでも動く

前準備

JDK (Java Development Kit) のインストール

Eclipse のインストール

リレーショナル・データベース管理システムのインストール

インストールしていないときは,下記の Web ページを参考に,インストールを済ませておくこと.

あらかじめ決めておく事項と設定内容

設定内容について.この Web ページに掲載するプログラムは,下記の設定である. 設定が違う場合には,プログラムを書き換える(書き換えは難しくは無い).

テスト用データベースの作成

テスト用データベースとして,下記の SQL コマンドで,テーブル commodity が作られ,データが入っていること.

create table commodity (
    id integer primary key not null,
    name varchar(32) not null,
    price integer );
insert into commodity values( 1, 'apple', 50 );
insert into commodity values( 2, 'orange', 20 );
insert into commodity values( 3, 'strawberry', 100 );
insert into commodity values( 4, 'watermelon', 150 );
insert into commodity values( 5, 'melon', 200 );
insert into commodity values( 6, 'banana', 100 );
select * from commodity;

Eclipse での JDBC プログラムの作成手順

以下,Eclipse を使う. プロジェクトの作成クラスの定義実行という一連の操作を,図解で説明する.

Eclipse の使用にあたって,事前に決めておく事項

Eclipse のプロジェクト等を作る. このページでは,プロジェクト名,パッケージ名,メインとなるクラス名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).

プロジェクトの新規作成

下記の手順で,プロジェクトを新規に作成する.

  1. (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く

    「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作する.

  2. プロジェクトの新規作成の開始

    ファイル」→「新規 (New)」→「プロジェクト (Project)
    または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」

  3. Java」の展開

    新規プロジェクトのウインドウが開くので, 「Java」を展開する.

    [image]
  4. Java プロジェクト」の選択

    展開した「Java」の下にある 「Java プロジェクト」を選び,「次へ」をクリック.

    [image]
  5. プロジェクト名の指定

    新規Javaプロジェクトのウインドウが開くので,プロジェクト名を付ける(1行目). プロジェクト名には好きにつけて良いが,全角文字は避ける.分かりやすい名前が良い.

    [image]
  6. Java 設定

    Java 設定はデフォルトのままでよい.「終了」をクリック

    [image]
  7. パースペクティブ

    もし,「関連付けられたパースペクティブを開きますか?」というウインドウが開いたら,パースペクティブを開きたいので,「はい」をクリック.

    [image]

(Java DB (Derby) を使うときのみ) Apache Derby ネーチャーの追加と,サーバの開始

Java DB (Derby) を使うときに限り,プロジェクトへのApache Derby ネーチャーの追加 と,Java DB (Derby) サーバの開始を行う. これは, Java DB (Derby) を使うための追加的な設定です

  1. プロジェクト・エクスプローラで,プロジェクト名 HelloWorld右クリック
  2. 「Apache Derby」→「Apache Derby ネーチャーの追加」

    「Apache Derby」が候補として現れないときは, Java DB (Derby) インストール の手順に従って,インストールと設定を行う.

  3. 「Apache Derby」→「Derby ネットワーク・サーバの開始」

    ポート1527 で Derby サーバが起動します.

    「Derby ネットワーク・サーバの開始」が選べない状態になっているときは, すでに開始済みなので,この手順は不要.

リレーショナルデータベース・ソフトウェアとして,Java DB (Derby) 以外を使う場合は,上記は不要です.

プロジェクトへの外部 jar の追加 (JDBC)

JDBC を使いリレーショナルデータベース・ソフトウェアと接続できるようにするため,リレーショナルデータベース・ソフトウェアに付属の JDBC ファイルを,外部 jar として設定する必要がある. (JDBC ファイルは,使用するリレーショナルデータベース・ソフトウェアごとに違う,ということ).

  1. プロジェクト・エクスプローラで,プロジェクト名 HelloWorld右クリック
  2. プロパティー」→「Java コンパイラー」→「Java のビルド・パス」→「ライブラリー
    [image]
  3. 外部 JAR の追加」をクリック
    [image]
  4. JDBC の jar ファイルを追加
  5. 外部 JAR の確認

    外部 JAR システムを確認したいときは,プロジェクト・エクスプローラで,「Java リリース; src」の下の,「ライブラリー」を展開する.

パッケージ作成

Eclipse のプロジェクト・エクスプローラを使って, パッケージを作成します. パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. このページでは,作成するパッケージ名は,hoge.hoge.com と書く. (パッケージ名を変えるときは,読み替えてください).

  1. (もし,プロジェクト・エクスプローラが開いていなければ)プロジェクト・エクスプローラを開く

    「ウインドウ」→「ビューの表示」→「プロジェクト・エクスプローラ」 と操作する.

    パッケージの作成,クラスの作成などの作業は,プロジェクト・エクスプローラで行う.

  2. パッケージを新規作成すべきプロジェクトの選択

    プロジェクト・エクスプローラに,プロジェクト一覧が表示されているはずです. パッケージを新規作成したいプロジェクト名 HelloWorld右クリックして, 「新規」→「パッケージ」と操作する.

    [image]
  3. パッケージ名の設定

    名前のところに,パッケージ名 hoge.hoge.com を設定し,「終了」をクリックする.

    [image]
  4. パッケージの確認

    プロジェクト・エクスプローラにおいて, パッケージ hoge.hoge.com が増えていることを確認する.

    [image]

クラス定義

クラス定義の手順は次の通りです. 前準備として,パッケージ hoge.hoge.com を作成済みであること.

  1. クラス定義の開始

    プロジェクト・エクスプローラにおいて, クラスを定義したいパッケージ名 hoge.hoge.com右クリック.その後, 「新規」→「クラス」と操作する.

    *新規」を選んだとき,「クラス」が現れないことがあります. そのときは, 「新規」→「その他」→「Java」→「クラス」と操作する.

    プロジェクト・エクスプローラで, パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト名の下の 「Java リソース; src」または「src」の下を展開して下さい.

    [image]
  2. 定義すべきクラス名等の指定

    Java パッケージ名,クラス名を入力できるウインドウが開くので,設定を行う.

    1. 「パッケージ (package)」(2行目の「パッケージのところ): パッケージ名 「hoge.hoge.com」を設定.(「hoge.hoge.com」になっていなければ修正すること).
    2. 「クラス名」(4行目の「名前」のところ): HelloWorld
    3. 「public static void main(String[] args)」: チェックする
      [image]
  3. クラスファイル一覧の表示

    プロジェクト・エクスプローラで, パッケージ名 hoge.hoge.com の左横の「+」をクリックすると, クラスファイル一覧が表示されます.

    [image]
  4. 定義したいクラスのファイルを開く

    HelloWorld クラスを定義したいので, プロジェクト・エクスプローラの パッケージ名 hoge.hoge.com の下にあるクラスファイル一覧の中から, 「HelloWorld.java」をダブルクリックします. すると,エディタが開きます.

    このように,Eclipse のプロジェクト・エクスプローラで,定義したいクラスの「クラス名.java」ダブルクリックすると,エディタが開くことになっています.

    [image]

    なお,別のクラスを追加したいときは, パッケージ名を右クリックして「新規」→「クラス」です.

  5. エディタでクラス HelloWorld を定義する

    下記のクラス定義をカットアンドペーストしてみて下さい(テスト用に作ったクラス定義です). (パッケージ名を「hoge.hoge.com」と書いているので,パッケージ名を別の名前にしている場合には,適切に読み替えてください).

    【要点】

    【プログラムの主要部分】

    プログラムの主要部分を抜き出すと,次のようになる.

                ResultSet rs = execute( "select * from commodity" );;
                DecimalFormat dformat = new DecimalFormat ("#,###円");
                while(rs.next()){         
                    int t = rs.getInt("type");
                        String n = rs.getString("name");
                        int p = rs.getInt("price");
                        System.out.println(t + " " + n + " " + dformat.format( p ) );
    
    1. SQL の実行結果は,変数 rs に入る.
    2. rs に入っているデータは,たくさんのレコード(行)からなるデータ.これを,Java の変数(変数は,数値などの単純値とする)に入れたい.
    3. そこで,while(rs.next() での繰り返し処理を行う.これは,rs に入っているたくさんのレコード(行)を,1つずつ見ていく,という意味.
    4. 1個のレコード(行)は,複数の単純値の並びである.そこで,getInt("属性名"), getString("属性名") のように書いて,1個のレコード(行)の中から,望みの属性値を取り出す.
    ----------------------ここから---------------------
    package hoge.hoge.com;
    
    import java.sql.*;
    import java.text.DecimalFormat;
    import java.util.Properties;
    
    public class HelloWorld {
        // 決まり文句 (ドライバクラス)
        final private static String PostgresJDBCDriver = "org.postgresql.Driver";
        final private static String MySQLJDBCDriver = "org.gjt.mm.mysql.Driver";
        final private static String JavaDBJDBCDriver = "org.apache.derby.jdbc.EmbeddedDriver";
        final private static String HiRDBDriver = "JP.co.Hitachi.soft.HiRDB.JDBC.PrdbDriver";
    
        // 下記の変数を正しく設定する
        // DBNAME, DBDIR, USER, PASS, JDBCDriver, DBURL
    
    
            // PostgreSQL 用デフォルト
            // Eclipse で PostgreSQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
            //     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
            //     その後インポートすべきファイルとして,次のファイルを指定
            //       C:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar
            final private static String DBNAME = "testdb"; // Database Name
            final private static String USER = "testuser"; // user name for DB.
            final private static String PASS = "hoge$#34hoge5"; // password for DB.
            final private static String JDBCDriver = PostgresJDBCDriver;
            final private static String DBURL = "jdbc:postgresql://localhost/" + DBNAME;
    
    
            // MySQL 用デフォルト
            // Eclipse で MySQL を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
            // https://dev.mysql.com/downloads/connector/ から,Connector/J をダウンロード
            // c:\Program Files\Java\mysql-connector-java-5.1.7\ に置く.
            //     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
            //     その後インポートすべきファイルとして,次のファイルを指定
            //       c:\Program Files\Java\mysql-connector-java-5.1.7\mysql-connector-java-5.1.7-bin.jar を追加
            // final private static String DBNAME = "testdb"; // Database Name
            // final private static String USER = "testuser"; // user name for DB.
            // final private static String PASS = "hoge$#34hoge5"; // password for DB.
            // final private static String JDBCDriver = MySQLJDBCDriver;
            // final private static String DBURL = "jdbc:mysql://localhost/" + DBNAME;   
    
            // JavaDB用デフォルト
            // final private static String DBNAME = "dbdir;create=true"; // Java DB の場合は,Java DB データベースディレクトリ(相対)
            // final private static String DBDIR = "C:\\Program Files\\eclipse3.5\\eclipse\\"; // データベースが存在するディレクトリ
                    // DTP, DBViewer などを使ってデータベースを生成した場合は Eclipse インストールディレクトリ
                    // ij などを使ってデータベースを生成した場合は,c:\\<ワークスペース>\\<プロジェクト名>
            // final private static String USER = ""; // user name for DB. Java DB (Derby) の場合は空
            // final private static String PASS = ""; // password for DB. Java DB (Derby) の場合は空
            // final private static String JDBCDriver = JavaDBJDBCDriver;
            // final private static String DBURL = "jdbc:derby:" + DBDIR + DBNAME;
    
            // HiRDB用デフォルト
            // Eclipse で HiRDB を使いたいときは,次の手順で,WebContent\WEB-INF\lib にインポートしておく.
            //     WebContent\WEB-INF\lib を右クリック.「一般」→「ファイルシステム」
            //     その後インポートすべきファイルとして,次のファイルを指定
            //       C:\win32app\hitachi\hirdb_s\CLIENT\UTL\pdjdbc.jar
            // ユーザ名,パスワード: C:/windows/HiRDB.iniのPDUSER の値を調べておく
            // final private static String USER = "ユーザ名"; // user name for HiRDB. see C:/windows/HiRDB.ini
            // final private static String PASS = "パスワード"; // password for HiRDB. see C:/windows/HiRDB.ini
            // final private static String JDBCDriver = HiRDBDriver;
            // final private static String HiRDBServerName = "hitachi-664320D"; // HiRDB サーバのコンピュータ名
            // final private static String DBURL = "jdbc:hitachi:PrdbDrive://DBID=22200,DBHOST=" + HiRDBServerName + ",ENCODELANG=MS932"; // 'DBID=22200' is in "conf\pdsys";
    
    
        // この先は決まり文句
        private static Statement stmt = null;
        // 問い合わせ結果を System.out.print で,画面に出力
        public static void main(String[] args)
            throws SQLException {
            // Connection
            try {
                connect( USER, PASS );
                // 実行するSQL文と,出力フォーマットを記述する
    
                ResultSet rs = execute( "select * from commodity" );;
                DecimalFormat dformat = new DecimalFormat ("#,###円");
                while(rs.next()){         
                    int t = rs.getInt("type");
                        String n = rs.getString("name");
                        int p = rs.getInt("price");
                        System.out.println(t + " " + n + " " + dformat.format( p ) );
                }
    
                rs.close();
                stmt.close();
                disconnect();
            }
            catch (Exception e) {
                // Error Message and Error Code
                System.out.print(e.toString());
                if (e instanceof SQLException) {
                    System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
                }
                // Print Stack Trace
                e.printStackTrace();
                if (conn != null) {
                    conn.rollback();
                    conn.close();
                }
            }    
        }
        
        /*
         *  Service Functions
         *  ここから先は,決まり文句を関数化したもの.
         */
        static Connection conn = null;
        //
        // database open
        //
        public static void connect( String user, String pass ) 
        throws SQLException, ClassNotFoundException {
            try {
                // JDBC Driver Loading
                Class.forName(JDBCDriver).newInstance();
                System.setProperty("jdbc.driver",JDBCDriver);
            }
            catch (Exception e) {
                // Error Message and Error Code
                System.out.print(e.toString());
                if (e instanceof SQLException) {
                    System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
                }
                // Print Stack Trace
                e.printStackTrace();
            }
            try {
                // Connection
                if ( user.isEmpty() && pass.isEmpty() ) {
                    conn = DriverManager.getConnection(DBURL);            
                }
                else {
                    Properties prop = new Properties();
                    prop.put("user", user);
                    prop.put("password", pass);
                    conn = DriverManager.getConnection(DBURL,prop);    
                }
            }
            catch (Exception e) {
                // Error Message and Error Code
                System.out.print(e.toString());
                if (e instanceof SQLException) {
                    System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
                }
                // Print Stack Trace
                e.printStackTrace();
                if (conn != null) {
                    conn.rollback();
                    conn.close();
                }
            }
        }
        //
        // database close
        //
        public static void disconnect()
            throws SQLException {
            try {
                conn.close();
            }
            catch (Exception e) {
                // Error Message and Error Code
                System.out.print(e.toString());
                if (e instanceof SQLException) {
                    System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
                }
                // Print Stack Trace
                e.printStackTrace();
                if (conn != null) {
                    conn.rollback();
                    conn.close();
                }
            }
        }
        //
        // execute
        //
        public static ResultSet execute( String sql )
            throws SQLException {
            try {    
                conn.setReadOnly(true);
                // Execute 'commit' Automatically after each SQL
                // conn.setAutoCommit(true);         
                // Query Exection          
                stmt = conn.createStatement();
                return stmt.executeQuery(sql);
            }
            catch (Exception e) {
                // Error Message and Error Code
                System.out.print(e.toString());
                if (e instanceof SQLException) {
                    System.out.println("Error Code:" + ((SQLException)e).getErrorCode());
                }
                // Print Stack Trace
                e.printStackTrace();
                if (conn != null) {
                    conn.rollback();
                    conn.close();
                }
                return null;
            }
        }
    }
    ----------------------ここまで----------------------
    
  6. ソースを保存

    「ファイル」→「保管」または CTRL+S で保存される. 保存時にコンパイルされる

    コンパイル時のエラーや警告があれば, Eclipse 内の問題・ビューに表示されるので確認する.

実行

  1. 実行したいクラスを選び,右クリック

    プロジェクト・エクスプローラで,パッケージ名の下にクラスファイル一覧が出ているので,実行したいクラスの「クラス名.java」 (つまり,HelloWorld.java)右クリック

  2. 実行」 → 「Javaアプリケーション (Java Application)」と操作

    もしくはAlt+Shift+Xを押し,J を押すという操作でもよい.

  3. 実行結果は次のようになる.

    1 apple 50円
    2 orange 20円
    3 strawberry 100円
    4 watermelon 150円
    5 melon 200円
    6 banana 100円
    
    [image]
  4. 上記の実行において「接続できない」という意味のエラーが出た場合.

    他で「接続しっぱなし」という可能性があるので,Eclipse を再起動して,もう1度繰り返してみる.

    それでもダメなら,DBNAME, DBDIR 等の変数の値をチェック.

(参考)

Eclipse で データベースの中身を確認したいときは, Eclipse のデータツール・プラットホーム を使って,簡単にできる.


参考Webページ: http://allabout.co.jp/internet/java/closeup/CU20070119A/index4.htm

参考Webページ: http://www.atmarkit.co.jp/fjava/javafaq/jdbc/jdbc01.html