このページでは,Eclipse を使って,Java 言語の JDBC プログラムを作る手順を, 見本となるプログラムと説明する. JDBC は,Java 言語でリレーショナルデータベースを操作するための手段として使う.
⇒ SQL とは,リレーショナルデータベースを扱うためのプログラミング言語です. Java と SQL を組み合わせて動かすために,JDBC を使う. このとき,Java のプログラムが,SQL のプログラムをリレーショナルデータベースに送りつけて,結果を待つ,という振る舞いになる. 変数を使って、Java と SQL との間のデータのやり取りを行う.
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 他のリレーショナルデータベースソフトウェアでも動く.
インストールしていないときは,下記の Web ページを参考に,インストールを済ませておくこと.
設定内容について.この Web ページに掲載するプログラムは,下記の設定である. 設定が違う場合には,プログラムを書き換える(書き換えは難しくは無い).
データベース名と, PostgreSQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)を決めておくこと. このページでは,次のように書く.
使用するデータベースの名前のことを,「データベース名」と呼ぶことにする. データベース名は,自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, すでに存在するデータベースを使ってもいい(つまり,既存のデータベースのデータベース名を使う)し,新しいデータベースを作ることにしてもいいです.
データベース名 testdb の権限を持ったユーザにして下さい.(そうで無いとエラーが出ます).
この Web ページの手順を試すために,新しいデータベースと,新しい一般ユーザのアカウントを作りたいという場合は, phpPgAdmin などを使ってください.
psql のようなコマンドライン・クライアントを使う場合には,次のようになります(エンコーディングについて調べきっていません.まだ不完全です.参考情報ということでご理解下さい).
CREATE ROLE testuser LOGIN PASSWORD 'hoge$#34hoge5' NOINHERIT VALID UNTIL 'infinity'; CREATE DATABASE testdb WITH ENCODING='UTF8' OWNER=testuser;
パスワードは,説明を簡単にするために hoge$#34hoge5 と書いているが,実際には,これとは違うものを,必ず適切に設定してください.
PostgreSQL の利用 を使うために,次の設定を行うことになるので,確認しておく.
PostgreSQL 用 JDBC の Java ファイルが存在するディレクトリ C:\Program Files\psqlJDBC を探すとすぐに見つかります.
データベース名と,MySQL にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)を, このページでは,次のように書く.
使用するデータベースの名前のことを,「データベース名」と呼ぶことにする. データベース名は,自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, すでに存在するデータベースを使ってもいい(つまり,既存のデータベースのデータベース名を使う)し,新しいデータベースを作ることにしてもいいです.
データベース名 testdb の権限を持ったユーザにして下さい.(そうで無いとエラーが出ます).
この Web ページの手順を試すために,新しいデータベースと,新しい一般ユーザのアカウントを作りたいという場合は, MySQL コマンドライン・クライアントの主な機能 や MySQL GUI Tools などを使い,次のコマンドを実行してください.
* それぞれのツールの操作法(起動法,ログインの方法など)は,MySQL コマンドライン・クライアントの主な機能 や MySQL GUI Tools の Web ページを見てください.
create database 'testdb' default character set cp932 collate cp932_japanese_ci; create user testuser identified by 'hoge$#34hoge5'; grant all on testdb.* to 'testuser';
パスワードは,説明を簡単にするために hoge$#34hoge5 と書いているが,実際には,これとは違うものを,必ず適切に設定してください.
MySQL の利用 を使うために,次の設定を行うことになるので,確認しておく.
JDBC で MySQL を使うために必要になるので、 https://dev.mysql.com/downloads/connector/ から Connector/J をダウンロードして、解凍しておく(展開(解凍)するディレクトリは何でもよい。この資料では上記のディレクトリにあるものとして説明する)。
ダウンロードの手順は, 「MySQL コネクタ (Connector) Java のダウンロード」の Web ページで説明している.
次の設定を確認しておく.
Java DB のデータベースファイルが置かれるディレクトリのことです. これは自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと, データベース名と Java DB データベースディレクトリとは別ものです.混同しないこと.
なお,Java DB データベースディレクトリは,「dbdir」 のように,相対パス形式で書く場合と,「C:\hoge\dbdir」のように,絶対パス形式で書く場合があります. 今回は,相対パス形式で書く.
データベース・ロケーションとは, データベースファイルが置かれる実際のディレクトリのことです.
Java DB データベースディレクトリを,「dbdir」のような相対パス形式にする場合, データベース・ロケーションは,Eclipse インストールディレクトリである C:\Program Files\eclipse3.5\eclipse のサブディレクトリになる. (一方で,絶対パス形式の場合は,データベース・ロケーションは,Eclipse インストールディレクトリと無関係になります). このデータベース・ロケーションは, Eclipse インストールディレクトリと,Java DB データベースディレクトリ(相対)を連結したものになる.
Java DB (Derby) インストールのときに,Eclipse プラグインもインストールしますが,その中に Java DB 用 JDBC の jar ファイルが含まれています.
データベースファイル名と,Firebird にログインするために使うデータベース・一般ユーザのアカウント(ユーザ名とパスワード)を, このページでは,次のように書く.
上記のデータベースファイル C:\firebird21\testdb.fdb の権限を持ったユーザにして下さい.(そうで無いとエラーが出ます).
この Web ページの手順を試すために,新しいデータベースと,新しい一般ユーザのアカウントを作りたいという場合は, Firebird コマンドライン・クライアント を使い,次のコマンドを実行してください.
C:\firebird21\bin\gsec -user sysdba -pass masterkey -add testuser -pw hoge$#34 create database 'C:\firebird21\testdb.fdb' page_size 8192 user 'testuser' password 'hoge$#34';
パスワードは,説明を簡単にするために hoge$#3 と書いているが,実際には,これとは違うものを,必ず適切に設定してください.
Firebird を使うために,次の設定を行うことになるので,確認しておく.
JDBC で Firebird を使うために必要になるので、 「Firebird 用の JDBC のjar ファイルのダウンロード」の Web ページ に説明されている手順でダウンロードしておくこと.
CLASS_PATH に C:\firebird21\Jaybird-2.1.6JDK_1.6\lib を含める必要があるかも.
* DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:E:\\database\\carwash.gdb", "testuser", "password"); のように書いて使うことになる.
テスト用データベースとして,下記の 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 を使う. プロジェクトの作成,クラスの定義と実行という一連の操作を,図解で説明する.
Eclipse のプロジェクト等を作る. このページでは,プロジェクト名,パッケージ名,メインとなるクラス名は次のように記述します. (すでに同じ名前のプロジェクトがある,といったときは,プロジェクト名を変えてください).
下記の手順で,プロジェクトを新規に作成する.
「ウインドウ (Window)」→「ビューの表示 (Show View)」→「プロジェクト・エクスプローラ (Project Explorer)」 と操作する.
「ファイル」→「新規 (New)」→「プロジェクト (Project)」
または,プロジェクト・エクスプローラ内で,右クリック→「新規 (New)」→「プロジェクト (Project)」
新規プロジェクトのウインドウが開くので, 「Java」を展開する.
展開した「Java」の下にある 「Java プロジェクト」を選び,「次へ」をクリック.
新規Javaプロジェクトのウインドウが開くので,プロジェクト名を付ける(1行目). プロジェクト名には好きにつけて良いが,全角文字は避ける.分かりやすい名前が良い.
Java 設定はデフォルトのままでよい.「終了」をクリック
もし,「関連付けられたパースペクティブを開きますか?」というウインドウが開いたら,パースペクティブを開きたいので,「はい」をクリック.
Java DB (Derby) を使うときに限り,プロジェクトへのApache Derby ネーチャーの追加 と,Java DB (Derby) サーバの開始を行う. これは, Java DB (Derby) を使うための追加的な設定です.
「Apache Derby」が候補として現れないときは, Java DB (Derby) インストール の手順に従って,インストールと設定を行う.
ポート1527 で Derby サーバが起動します.
「Derby ネットワーク・サーバの開始」が選べない状態になっているときは, すでに開始済みなので,この手順は不要.
リレーショナルデータベース・ソフトウェアとして,Java DB (Derby) 以外を使う場合は,上記は不要です.
JDBC を使いリレーショナルデータベース・ソフトウェアと接続できるようにするため,リレーショナルデータベース・ソフトウェアに付属の JDBC ファイルを,外部 jar として設定する必要がある. (JDBC ファイルは,使用するリレーショナルデータベース・ソフトウェアごとに違う,ということ).
C:\Program Files\psqlJDBC\postgresql-8.3-603.jdbc4.jar を追加する.
C:\Program Files\Java\mysql-connector-java-5.1.7\mysql-connector-java-5.1.7-bin.jar を追加する.
JDBC の jar ファイルが無い,というときは,MySQL Connector Java のダウンロードの Web ページを見てください.
C:Program Files\eclipse3.5\eclipse\plugins\org.apache.derby.core_10.5.1\derby.jar を追加する.
外部 JAR システムを確認したいときは,プロジェクト・エクスプローラで,「Java リリース; src」の下の,「ライブラリー」を展開する.
Eclipse のプロジェクト・エクスプローラを使って, パッケージを作成します. パッケージ名には hoge.hoge.com のようなドメイン名を付ける習慣があることに注意してください. このページでは,作成するパッケージ名は,hoge.hoge.com と書く. (パッケージ名を変えるときは,読み替えてください).
「ウインドウ」→「ビューの表示」→「プロジェクト・エクスプローラ」 と操作する.
パッケージの作成,クラスの作成などの作業は,プロジェクト・エクスプローラで行う.
プロジェクト・エクスプローラに,プロジェクト一覧が表示されているはずです. パッケージを新規作成したいプロジェクト名 HelloWorld を右クリックして, 「新規」→「パッケージ」と操作する.
名前のところに,パッケージ名 hoge.hoge.com を設定し,「終了」をクリックする.
プロジェクト・エクスプローラにおいて, パッケージ hoge.hoge.com が増えていることを確認する.
クラス定義の手順は次の通りです. 前準備として,パッケージ hoge.hoge.com を作成済みであること.
プロジェクト・エクスプローラにおいて, クラスを定義したいパッケージ名 hoge.hoge.com を右クリック.その後, 「新規」→「クラス」と操作する.
* 「新規」を選んだとき,「クラス」が現れないことがあります. そのときは, 「新規」→「その他」→「Java」→「クラス」と操作する.
プロジェクト・エクスプローラで, パッケージ名 hoge.hoge.comが表示されていないときは, プロジェクト名の下の 「Java リソース; src」または「src」の下を展開して下さい.
Java パッケージ名,クラス名を入力できるウインドウが開くので,設定を行う.
プロジェクト・エクスプローラで, パッケージ名 hoge.hoge.com の左横の「+」をクリックすると, クラスファイル一覧が表示されます.
HelloWorld クラスを定義したいので, プロジェクト・エクスプローラの パッケージ名 hoge.hoge.com の下にあるクラスファイル一覧の中から, 「HelloWorld.java」をダブルクリックします. すると,エディタが開きます.
このように,Eclipse のプロジェクト・エクスプローラで,定義したいクラスの「クラス名.java」 をダブルクリックすると,エディタが開くことになっています.
なお,別のクラスを追加したいときは, パッケージ名を右クリックして「新規」→「クラス」です.
下記のクラス定義をカットアンドペーストしてみて下さい(テスト用に作ったクラス定義です). (パッケージ名を「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 ) );
----------------------ここから--------------------- 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; } } } ----------------------ここまで----------------------
「ファイル」→「保管」または CTRL+S で保存される. 保存時にコンパイルされる
コンパイル時のエラーや警告があれば, Eclipse 内の問題・ビューに表示されるので確認する.
プロジェクト・エクスプローラで,パッケージ名の下にクラスファイル一覧が出ているので,実行したいクラスの「クラス名.java」 (つまり,HelloWorld.java) を右クリック.
もしくはAlt+Shift+Xを押し,J を押すという操作でもよい.
1 apple 50円 2 orange 20円 3 strawberry 100円 4 watermelon 150円 5 melon 200円 6 banana 100円
他で「接続しっぱなし」という可能性があるので,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