SQLの窓

2014年05月16日


Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)でDBからSELECT構文で行データを読み出す

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の最新記事】
posted by lightbox at 2014-05-16 20:14 | Java | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり