Java の本来の getter setter を作成する方法とは少しずれますが、少なくとも Microsoft の言語では一般的に『プロパティ』が使用されます。Microsoft でも実際の中身はメソッド( getter と setter ) ではありますが、public で変数を定義する事によって、処理を一箇所に集約する事は初歩的なアプリケーション作成では有用です。 ここではまず、データベースに接続するクラスを作成し、そのクラスに public なフィールドを定義してデーベース処理を簡潔にしています。 Rdbms.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class Rdbms {
public Connection con = null;
public Statement stmt = null;
public ResultSet rset = null;
private String connectionString = null;
public Rdbms(String connectionString) {
this.connectionString = connectionString;
}
public boolean getConnect() {
boolean connect_result = true;
String targetDbc = null;
if ( connectionString.substring(0, 3).equals("jdbc") ) {
targetDbc = "JDBC";
}
else {
targetDbc = "ODBC";
}
// *********************************************
// ODBC 用接続文字列サンプル
// *********************************************
// // SQLServer
// connectionString = "Provider=MSDASQL"
// + ";Driver={SQL Server Native Client 11.0}"
// + ";SERVER=.\\sqlexpress" + ";DATABASE=lightbox"
// + ";UID=sa" + ";PWD=" + pass + ";";
// // MySQL
// connectionString = "Provider=MSDASQL"
// + ";Driver={MySQL ODBC 5.3 Unicode Driver}"
// + ";SERVER=localhost" + ";DATABASE=lightbox"
// + ";UID=root" + ";PWD=" + pass + ";Charset=cp932";
// // MDB
// connectionString = "Provider=MSDASQL"
// + ";Driver={Microsoft Access Driver (*.mdb)}"
// + ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
// // Oracle
// connectionString = "Provider=MSDASQL"
// + ";Driver={Oracle in XE}" + ";DBQ=localhost:1521/XE"
// + ";UID=lightbox" + ";PWD=" + pass + ";";
// // PostgreSQL
// connectionString = "Provider=MSDASQL"
// + ";Driver={PostgreSQL ODBC Driver(UNICODE)}"
// + ";Servername=localhost" + ";Port=5432"
// + ";Database=lightbox" + ";UID=postgres"
// + ";PWD=" + pass + ";";
try {
if (targetDbc.equals("ODBC")) {
Properties prop = new Properties();
prop.put("charSet", "MS932");
con = DriverManager.getConnection("jdbc:odbc:"+connectionString, prop);
}
else {
con = DriverManager.getConnection(connectionString);
// *********************************************
// JDBC 用接続文字列サンプル
// *********************************************
// MySQL
// mysql-connector-java-5.1.30-bin.jar
// con = DriverManager.getConnection("jdbc:mysql://localhost/lightbox?" +
// "user=root&password="+pass);
// Oracle
// ojdbc6.jar
// con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","lightbox",pass);
// SQLServer
// sqljdbc4.jar
// String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
// "databaseName=lightbox;user=sa;password="+pass+";";
// con = DriverManager.getConnection(connectionUrl);
// PostgreSQL
// postgresql-9.3-1100.jdbc4.jar
// String connectionUrl = "jdbc:postgresql://localhost:5432/lightbox" +
// "?user=postgres&password="+pass+"&charSet=utf-8;";
// con = DriverManager.getConnection(connectionUrl);
}
} catch (Exception ex) {
// TODO
ex.printStackTrace();
connect_result = false;
}
return connect_result;
}
public void close() {
try {
if ( rset != null ) {
rset.close();
rset = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
try {
if ( stmt != null ) {
stmt.close();
stmt = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
try {
if ( con != null ) {
con.close();
con = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
コメント部分は他の RDBMS や jdbc ドライバを使ったり、jdbc-odbc ブリッジを使ったりする場合のサンプルとなっており。主たる処理は、DB に接続して con にインスタンスをセットする事と、終了時の処理を close として集約しているところです このクラスはアプリケーションの初期化時に、対象となる RDBMS の接続文字列を使ってインスタンスを作成します。( ここでは MS Access )
addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent arg0) {
MainWindow.this.setLocationRelativeTo(null);
// 接続文字列を作成して、Rdbms のインスタンスを作成
currentDir = System.getProperty("user.dir");
String connectionString = "Provider=MSDASQL"
+ ";Driver={Microsoft Access Driver (*.mdb)}"
+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
rdbms = new Rdbms( connectionString );
System.out.println(connectionString);
}
});
後は、DB アクセスの処理開始イベントで接続、読込み、接続解除の処理を行います。 但し、ここではまだアプリケーションとしてユーザとの会話をコントロールする為の処理は実装されておらず、ただ以下のように disable 状態のフィールドに内容が表示されるだけです![]()
private class CheckAction extends AbstractAction {
public CheckAction() {
putValue(NAME, "確認");
putValue(SHORT_DESCRIPTION, "Some short description");
}
public void actionPerformed(ActionEvent e) {
System.out.println("確認ボタンがクリックされました");
if ( !rdbms.getConnect() ) {
JOptionPane.showMessageDialog(
contentPane,
"データベースに接続できませんでした\nシステム管理者に連絡してください",
"エラー",
JOptionPane.ERROR_MESSAGE);
syainCode.requestFocusInWindow();
syainCode.selectAll();
return;
}
try {
rdbms.stmt = rdbms.con.createStatement();
String scode = syainCode.getText();
String query = "";
query += "select 社員マスタ.*,";
query += " Format(社員マスタ.生年月日,'yyyy/MM/dd') as 生年月日2,";
query += " コード名称マスタ.名称,";
query += " 管理者参照.氏名 as 管理者名";
query += " from (社員マスタ left join コード名称マスタ on 社員マスタ.所属 = コード名称マスタ.コード)";
query += " left join 社員マスタ 管理者参照 on 社員マスタ.管理者 = 管理者参照.社員コード";
query += " where コード名称マスタ.区分 = 2";
query += " and 社員マスタ.社員コード = '" + scode + "'";
System.out.println(query);
rdbms.rset = rdbms.stmt.executeQuery ( query );
if ( rdbms.rset.next() ) {
syainName.setText(rdbms.rset.getString( "氏名" ));
syainFuri.setText(rdbms.rset.getString( "フリガナ" ));
syainSyozoku.setText(rdbms.rset.getString( "所属" ));
syainSyozokuName.setText(rdbms.rset.getString( "名称" ));
syainSex.setSelectedIndex(rdbms.rset.getInt("性別"));
syainKyuyo.setText(rdbms.rset.getString( "給与" ));
syainTeate.setText(rdbms.rset.getString( "手当" ));
syainKanri.setText(rdbms.rset.getString( "管理者" ));
syainKanriName.setText(rdbms.rset.getString( "管理者名" ));
syainBirth.setText(rdbms.rset.getString( "生年月日2" ));
}
else {
JOptionPane.showMessageDialog(
contentPane,
"入力したコードは存在しませんでした",
"エラー",
JOptionPane.ERROR_MESSAGE);
syainCode.requestFocusInWindow();
syainCode.selectAll();
rdbms.close();
return;
}
} catch (Exception ex) {
ex.printStackTrace();
}
rdbms.close();
}
}
データベースは、販売管理C.MDB です。以下からダウンロードできますEclipse のプロジェクト内に data フォルダを作成してその中に置いて、パッケージエクスプローラから F5 で再表示すると以下のようになるはずです。
SELECT 構文について ここで使用している SELECT 構文は、left join を二回行って、二つの他の表と結合しています。そのうちの一つは『コード名称マスタ』という、比較的件数の少ないシステム上のコード定義を行っているテーブルです。このテーブルの主キーは、区分とコードと言う二つの列から成り立っており、社員マスタの所属と、区分2 の行のコード部分が結合されます。 もう一つの結合する表は社員マスタであり、このような結合は『自己結合』と呼ばれます。この場合は、社員マスタに対して別名を定義し、(ここでは 管理者参照 )、かつ全ての列に対してテーブル名の修飾を行って一意な列名として参照するようにしています。 日付の編集を行っている関数は、MS Access のものです。この部分は RDBMS 毎に記述が変わるので注意して下さい。
select 社員マスタ.* , Format(社員マスタ.生年月日,'yyyy/MM/dd') as 生年月日2 , コード名称マスタ.名称 , 管理者参照.氏名 as 管理者名 from (社員マスタ left join コード名称マスタ on 社員マスタ.所属 = コード名称マスタ.コード) left join 社員マスタ 管理者参照 on 社員マスタ.管理者 = 管理者参照.社員コード where コード名称マスタ.区分 = 2 and 社員マスタ.社員コード = '0006'
関連する記事
|
|
【Javaの最新記事】
- Java : Apache POI で最低限の処理を標準化( ここではワークブックは新規作成 )
- Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン
- Java のコンソールで NAVER の RSS を取得して、title 部分を正規表現で加工して表示するサンプル
- Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法
- Java : Google gson 2.3.1 で JSON 文字列を定義済みのクラスを使ってオブジェクト化
- Java : Google gson 2.3.1 で、JSON 文字列のフォーマットが解らなくてもなんとかなる『ベタ』な処理方法
- Eclipse のホバーで追加したライブラリの javadoc を表示させる手順
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の更新(データ修正)処理
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の入力チェック
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の二会話画面制御
- Eclipse+WindowBuilder : ボタンイベント(AbstractAction) の作成
- Eclipse+WindowBuilder : データベースアプリケーション(社員マスタメンテ)の画面作成
- Eclipse + WindowBuilder : JDBC と ODBC を使った、オールマイティなデータベース接続サンプル( MySQL / SQLServer / Oracle / Postgr..
- Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処
- Eclipse のパンくずリスト(breadcrumb) をワークスペースの設定ファイルで非表示にする
- Java : Eclipse 実行の System.in.read(buff) でコンソール入力
- iText( itextpdf-5.4.3 / Java ) で簡単に PDF 出力をする。
- SQL 文へのデータバインド用 public class GetSQL
- ADT( Android Development Tools ) Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(2)
- Java : Windows の環境変数の列挙( 含ソート )



SELECT 構文について
ここで使用している SELECT 構文は、left join を二回行って、二つの他の表と結合しています。そのうちの一つは『コード名称マスタ』という、比較的件数の少ないシステム上のコード定義を行っているテーブルです。このテーブルの主キーは、区分とコードと言う二つの列から成り立っており、社員マスタの所属と、区分2 の行のコード部分が結合されます。
もう一つの結合する表は社員マスタであり、このような結合は『自己結合』と呼ばれます。この場合は、社員マスタに対して別名を定義し、(ここでは 管理者参照 )、かつ全ての列に対してテーブル名の修飾を行って一意な列名として参照するようにしています。
日付の編集を行っている関数は、MS Access のものです。この部分は RDBMS 毎に記述が変わるので注意して下さい。




