BETA

【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する

投稿日:2020-01-24
最終更新:2020-01-24

前回に引き続き、JavaFXです。
今回は Oracle からデータを取得してコンボボックスに設定します。

利用するテーブルや Oracle のインストールなどは次の記事を参照してください。

Oracle Database Express Edition 11g Release 2 のインストールからテーブル作成まで

Swing でやったのとほぼほぼ同じです。

プログラムは前回のものを流用します。

【JavaFX】コンボボックスに項目を設定する

ライブラリの追加

Oracle からデータを取得するために、ライブラリを追加します。
パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。

「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、
「外部 JAR の追加」ボタンをクリックします。

ファイル選択ダイアログが表示されるので、
Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。

デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib  

ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。

パッケージの作成

次の2つのパッケージを作成します。

jp.co.doraxdora.common  
jp.co.doraxdora.dto  

パッケージ・エクスプローラーで「src」を右クリック>「新規」>「パッケージ」を選択します。

名前に「jp.co.doraxdora.common」を入力して「完了」ボタンをクリックします。
同様に「jp.co.doraxdora.dto」も作成します。

 

クラスの作成

次の2つのクラスをそれぞれのパッケージに作成します。

jp.co.doraxdora.common.DBAccess.java  
jp.co.doraxdora.dto.MstKind.java  

パッケージ・エクスプローラーでパッケージを右クリック>「新規」>「クラス」を選択します。

名前に「DBAccess」を入力して「完了」ボタンをクリックします。
同様に「MstKind」も作成します。

実装

DBAccess.java

    package jp.co.doraxdora.common;  

    import java.sql.Connection;  
    import java.sql.PreparedStatement;  
    import java.sql.ResultSet;  
    import java.util.List;  

    import oracle.jdbc.pool.OracleDataSource;  

    /**  
     * @author doraxdora  
     *  
     */  
    public class DBAccess {  

            private static String DB_URL = "jdbc:oracle:thin:USER01/[email protected]:1521:XE";  

            private static Connection con = null;  

            /**  
             * コンストラクタ.  
             *  
             * @throws Exception  
             */  
            public DBAccess() throws Exception{  
                    super();  
                    // ドライバのロード  
                    OracleDataSource ds = new OracleDataSource();  
                    ds.setURL(DB_URL);  
            // DB接続  
            con = ds.getConnection();  
            }  

            /**  
             * SQLを実行して結果を取得します.  
             * @param sql  
             * @return  
             */  
            public ResultSet executeQuery(String sql) throws Exception {  
                    PreparedStatement stmt = con.prepareStatement(sql);  
                    return stmt.executeQuery();  
            }  

            /**  
             * パラメータを指定してSQLを実行し、結果を取得します.  
             *  
             * @param sql  
             * @param param  
             * @return  
             * @throws Exception  
             */  
            public ResultSet executeQuery(String sql, List<Object> param) throws Exception {  
                    PreparedStatement stmt = con.prepareStatement(sql);  
                    for (int i = 0; i < param.size(); i++) {  
                            if (param.get(i) instanceof String) {  
                                    stmt.setString(i, (String) param.get(i));  
                            } else if (param.get(i) instanceof Integer) {  
                                    stmt.setInt(i, (int) param.get(i));  
                            }  
                    }  

                    return stmt.executeQuery();  

            }  

    }  

MstKind.java

/**  
 *  
 */  
package jp.co.doraxdora.dto;  

import java.io.Serializable;  

/**  
 * MST種別クラス.  
 *  
 * @author doraxdora  
 *  
 */  
public class MstKind implements Serializable {  

        /** 種別コード */  
        private String kindCd;  
        /** 種別名 */  
        private String kindName;  

        /**  
         * @return kindCd  
         */  
        public String getKindCd() {  
                return kindCd;  
        }  

        /**  
         * @param kindCd セットする kindCd  
         */  
        public void setKindCd(String kindCd) {  
                this.kindCd = kindCd;  
        }  

        /**  
         * @return kindName  
         */  
        public String getKindName() {  
                return kindName;  
        }  

        /**  
         * @param kindName セットする kindName  
         */  
        public void setKindName(String kindName) {  
                this.kindName = kindName;  
        }  

        /* (非 Javadoc)  
         * @see java.lang.Object#toString()  
         */  
        @Override  
        public String toString() {  
                return kindName;  
        }  
}  

JavaFX の ComboBox の実装が、
toString()メソッドを利用して表示文字列を取得しているため、
toString()メソッドをオーバーライドし、表示するメンバーの値を返すようにする必要があります。

コントローラーの修正

インポート文の追加およびメンバー型の変更

SampleController.java(変更箇所のみ抜粋)

// インポート文追加  
import jp.co.doraxdora.common.DBAccess;  
import jp.co.doraxdora.dto.MstKind;  

public class SampleController implements Initializable{  

        /** コンボボックス:名前 */  
        // String から MstKind のリストに変更  
        // アクセサも修正が必要  
        @FXML  
        //private ComboBox<String> cbKind;  
        private ComboBox<MstKind> cbKind;  

        /**  
         * @return cbKind  
         */  
        public ComboBox<MstKind> getCbKind() {  
                return cbKind;  
        }  

        /**  
         * @param cbKind セットする cbKind  
         */  
        public void setCbKind(ComboBox<MstKind> cbKind) {  
                this.cbKind = cbKind;  
        }  

)          

初期化処理の修正

SampleController.java(メソッドのみ抜粋)

        /*  
         * (非 Javadoc)  
         * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle)  
         */  
        @Override  
        public void initialize(URL location, ResourceBundle resources)  {  

        try {  
                        DBAccess dba = new DBAccess();  
                        ResultSet rs = dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD");  

                        // 指定なしを追加  
                        MstKind empty = new MstKind();  
                        empty.setKindCd("-1");  
                        empty.setKindName("指定なし");  
                        cbKind.getItems().add(empty);  

                        // 取得したデータを追加  
                        while (rs != null &amp;&amp; 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 (SQLException e) {  
                        // TODO 自動生成された catch ブロック  
                        e.printStackTrace();  
                } catch (Exception e) {  
                        // TODO 自動生成された catch ブロック  
                        e.printStackTrace();  
                }  
        }  

起動してみる

内容は前回のものと変わりませんが、
無事に表示することができました。

次回は一覧にデータ表示するところまでやってみたいと思います。

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう