2020-01-24に投稿

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

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

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

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

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

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

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

ライブラリの追加

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

外部 JARの追加

「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/USER01@localhost: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();
                }
        }

起動してみる

起動した画面

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

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

ではでは。

Originally published at www.doraxdora.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント