【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する
おはようございます。
前回に引き続き、JavaFXです。
今回は Oracle からデータを取得してコンボボックスに設定します。
利用するテーブルや Oracle のインストールなどは次の記事を参照してください。
Oracle Database Express Edition 11g Release 2 のインストールからテーブル作成まで
Swing でやったのとほぼほぼ同じです。
プログラムは前回のものを流用します。
スポンサーリンク
ライブラリの追加
Oracle からデータを取得するために、ライブラリを追加します。
パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。
「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、
「外部 JAR の追加」ボタンをクリックします。
ファイル選択ダイアログが表示されるので、
Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。
デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。
1 | C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib |
ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。
パッケージの作成
次の2つのパッケージを作成します。
1 2 | jp.co.doraxdora.common jp.co.doraxdora.dto |
パッケージ・エクスプローラーで「src」を右クリック>「新規」>「パッケージ」を選択します。
名前に「jp.co.doraxdora.common」を入力して「完了」ボタンをクリックします。
同様に「jp.co.doraxdora.dto」も作成します。
クラスの作成
次の2つのクラスをそれぞれのパッケージに作成します。
1 2 | jp.co.doraxdora.common.DBAccess.java jp.co.doraxdora.dto.MstKind.java |
パッケージ・エクスプローラーでパッケージを右クリック>「新規」>「クラス」を選択します。
名前に「DBAccess」を入力して「完了」ボタンをクリックします。
同様に「MstKind」も作成します。
実装
DBAccess.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | packagejp.co.doraxdora.common; importjava.sql.Connection; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.util.List; importoracle.jdbc.pool.OracleDataSource; /** * @author doraxdora * */ publicclassDBAccess{ privatestaticStringDB_URL="jdbc:oracle:thin:USER01/USER01@localhost:1521:XE"; privatestaticConnection con=null; /** * コンストラクタ. * * @throws Exception */ publicDBAccess()throwsException{ super(); // ドライバのロード OracleDataSource ds=newOracleDataSource(); ds.setURL(DB_URL); // DB接続 con=ds.getConnection(); } /** * SQLを実行して結果を取得します. * @param sql * @return */ publicResultSet executeQuery(Stringsql)throwsException{ PreparedStatement stmt=con.prepareStatement(sql); returnstmt.executeQuery(); } /** * パラメータを指定してSQLを実行し、結果を取得します. * * @param sql * @param param * @return * @throws Exception */ publicResultSet executeQuery(Stringsql,List<Object>param)throwsException{ PreparedStatement stmt=con.prepareStatement(sql); for(inti=0;i<param.size();i++){ if(param.get(i)instanceofString){ stmt.setString(i,(String)param.get(i)); }elseif(param.get(i)instanceofInteger){ stmt.setInt(i,(int)param.get(i)); } } returnstmt.executeQuery(); } } |
MstKind.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /** * */ packagejp.co.doraxdora.dto; importjava.io.Serializable; /** * MST種別クラス. * * @author doraxdora * */ publicclassMstKindimplementsSerializable{ /** 種別コード */ privateStringkindCd; /** 種別名 */ privateStringkindName; /** * @return kindCd */ publicStringgetKindCd(){ returnkindCd; } /** * @param kindCd セットする kindCd */ publicvoidsetKindCd(StringkindCd){ this.kindCd=kindCd; } /** * @return kindName */ publicStringgetKindName(){ returnkindName; } /** * @param kindName セットする kindName */ publicvoidsetKindName(StringkindName){ this.kindName=kindName; } /* (非 Javadoc) * @see java.lang.Object#toString() */ @Override publicStringtoString(){ returnkindName; } } |
JavaFX の ComboBox の実装が、
toString()メソッドを利用して表示文字列を取得しているため、
toString()メソッドをオーバーライドし、表示するメンバーの値を返すようにする必要があります。
コントローラーの修正
インポート文の追加およびメンバー型の変更
SampleController.java(変更箇所のみ抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // インポート文追加 importjp.co.doraxdora.common.DBAccess; importjp.co.doraxdora.dto.MstKind; publicclassSampleControllerimplementsInitializable{ /** コンボボックス:名前 */ // String から MstKind のリストに変更 // アクセサも修正が必要 @FXML //private ComboBox<String> cbKind; privateComboBox<MstKind>cbKind; /** * @return cbKind */ publicComboBox<MstKind>getCbKind(){ returncbKind; } /** * @param cbKind セットする cbKind */ publicvoidsetCbKind(ComboBox<MstKind>cbKind){ this.cbKind=cbKind; } ) |
初期化処理の修正
SampleController.java(メソッドのみ抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* * (非 Javadoc) * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle) */ @Override publicvoidinitialize(URL location,ResourceBundle resources) { try{ DBAccess dba=newDBAccess(); ResultSet rs=dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD"); // 指定なしを追加 MstKind empty=newMstKind(); empty.setKindCd("-1"); empty.setKindName("指定なし"); cbKind.getItems().add(empty); // 取得したデータを追加 while(rs!=null&& rs.next()) { MstKind kind = new MstKind(); kind.setKindCd(rs.getString("KIND_CD")); kind.setKindName(rs.getString("KIND_NAME")); cbKind.getItems().add(kind); } // 初期選択状態を設定 cbKind.getSelectionModel().select(0); }catch(SQLExceptione){ // TODO 自動生成された catch ブロック e.printStackTrace(); }catch(Exceptione){ // TODO 自動生成された catch ブロック e.printStackTrace(); } } |
起動してみる
内容は前回のものと変わりませんが、
無事に表示することができました。
次回は一覧にデータ表示するところまでやってみたいと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません