トップページ -> プログラミング -> JDBC によるデータベース・プログラミングと Spring JDBC -> Eclipse を用いた JDBC プログラミング
[サイトマップへ], [サイト内検索へ]

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

この Web ページでは,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で 動く.ごく簡単な設定の変更で、MySQLDB2 Express-C,や Java DBHiRDB など, 他のリレーショナルデータベースソフトウエアでも動く (変更は簡単です).


必要となるソフトウエア

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

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

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

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

      CREATE TABLE commodity (
          type 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;

※ SQL の実行は,Eclipse のデータツール・プラットホーム を使って,簡単にできる. データツール・プラットホームの使用法については, MySQLPostgreSQLJava DB (Derby) の場合に分けて,別のページで説明している.


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

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

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

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

プロジェクトの新規作成

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

  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 のようなドメイン名を付ける習慣があることに注意してください. この Web ページでは,作成するパッケージ名は,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」と書いているので,パッケージ名を別の名前にしている場合には,適切に読み替えてください).

        【要点】

        • PostgreSQL 以外を使う場合には,プログラム中の「コメント」になっている部分を調整
        • フォーマット付き出力を行いたいので,DecimalFormat を使用.
        • データベース名,ユーザ名などが違うときは,プログラムを書き換え
        • localhost (ローカルのマシン)に接続するようなプログラムなので,リモートのマシンに接続したい場合にはプログラムを書き換え

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

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

        			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 にインポートしておく.
        		// http://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 のデータツール・プラットホーム を使って,簡単にできる. データツール・プラットホームの使用法については, MySQLPostgreSQLJava DB (Derby) の場合に分けて,別のページで説明している.


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

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


    本サイトのサイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

    問い合わせ先: 金子邦彦(かねこ くにひこ) [image]