SQLの窓

2014年05月10日


Eclipse + WindowBuilder : JDBC と ODBC を使った、オールマイティなデータベース接続サンプル( MySQL / SQLServer / Oracle / Postgres / MS Access)

2014/05/10
■ 更新処理を追加
■ キャンセル処理を追加
■ MDB を同梱( 初期選択を ODBC + MS Access )
■ 変数名整備、その他ユーザインターフェイスの基本機能を装備
インポートは、Java プロジェクトを作成して、src フォルダの一つ上位のフォルダを選択します。( 最初にクリーンして、WindowBuilder でメインソースを選択して、Design タブを開きます ) 前提条件 ワークスペースのキャラクタセットが UTF-8 である事 ( Eclipse.ini に、-Dfile.encoding=utf-8 を設定すると常にワークスペースが UTF-8 になります ) キャラクタセットについて 細かい話をすると、RDBMS 単位に実装が違うので、サンプルの内容で解ると思いますが、基本的には JDBC で接続する場合は特に意識する必要無く接続できると思います。ソースを UTF-8 にしているのは、Pleiades の日本語化で、Java のドキュメントも日本語化されますが、それを正しく見るために UTF-8 である必要があるからです。 ODBC 接続は少しやっかいで、古い アプリケーションが内部コードを持たずにそのまま SHIFT_JIS で作成されている場合でも正しく接続できるように設計しているので、UTF-8 環境から実行する場合いろいろ RDBMS 毎に設定が違ったりしますが、JDBC-ODBC ブリッジ の場合、キャラクタセットのパラメータが拡張で用意されているので、たいていはそれで調整されます( ソースを見ていただくと、RDBMS 側の設定が必要な例外があるのが解ると思いますが ) JLabel2 と JButton2 について これは、コントロールのフォントをプロパティから変更するのが面倒な理由で作成したものです。WindowBuilder のパレットに単純に追加してもダメだったので実装はフォントのみです。 いろいろやっているうちに、WindowBuilder のコンポーネントとしてインポートしても存在できるようになりました。 結局、JButton2 と JLable2 の設定がプロパティの初期値として反映されています( 内容を変更した後は一旦終了しないとうまくいかないような気もします )。コンポーネントの追加は、Custom category を右クリックすると可能ですが( Add Component )、Custom category を定義する為の『org.eclipse.wb.swing.wbp-palette.xml』は、WindowBuilder の以下のツールで雛形を作成します( Swing toolkit ) これで作成すると、フォルダを作成して自動的にファイルも作成してくれます。但し、内容はあくまでサンプルなので、自分のクラスとして書き換える必要があります。そして、正しく書き換えてから、右クリックの Add Component で実際のクラスを登録します。 さらに詳細はこちらの PDF に記述されています その他 更新ボタンの内容は実装していません。アクションの切り替えを WindowBuilder からできるので、テストの為に枠組みのみ実装しています。 2014/05/10 : 更新処理を追加しました 関連する重要な記事 Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処 コンポーネントのテキスト定義部分はこのソースでは日本語になっていますが、実際は 『\u793E\u54E1\u540D』というような Unicode の 16進表現になります。( ソースとして解りにくいので書き換えてあります )
// import は省略しています

public class Main extends JFrame {

	private JPanel contentPane;
	private JTextField codeData;
	private JTextField nameData;
	private JTextField txtPassword;
	private final Action actionCheck = new SwingActionCheck();
	private final Action actionUpdate = new SwingActionUpdate();
	private JComboBox<String> jdbc_odbc;
	private JComboBox<String> rdbms;
	
	private String currentDir = null;
	private JButton2 check_button;
	private JButton2 update_button;
	private JButton2 cance_button;
	private final Action actionCancel = new SwingActionCancel();

	private Connection con = null;
	private Statement stmt = null;
	private ResultSet rset = null;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable e) {
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		
		// Enter キーで次のフォーカスへ移動する
		KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(focusManager.getDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
		forwardKeys.add(KeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
		focusManager.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
			
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowActivated(WindowEvent arg0) {
				// ウインドウを中央に
				Main.this.setLocationRelativeTo(null);
				
				// 初期コンボボックスの内容
				rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
						{"MySQL", "Oracle", "SQLServer", "MS Access", "Postgres"}));
				// MS Access を選択
				rdbms.setSelectedIndex(3);
				
				// フォーカスを入力フィールドに
				codeData.requestFocusInWindow();
				
				currentDir = System.getProperty("user.dir");
				System.out.println("プロジェクトのフォルダ : " + currentDir);				
			}
		});
		setTitle("JDBC / ODBC / \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u63A5\u7D9A\u30B5\u30F3\u30D7\u30EB");
		setResizable(false);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		codeData = new JTextField();
		codeData.addFocusListener(new FocusAdapter() {
			// フォーカスを失った時に入力内容を編集する
			@Override
			public void focusLost(FocusEvent arg0) {
				String save_string;
				String edited_string;
				try {
					edited_string = String.format("%04d", Integer.parseInt(codeData.getText()) );
					codeData.setText(edited_string);
				} catch (NumberFormatException e) {
					//e.printStackTrace();
				}
			}
		});
		codeData.setBounds(107, 71, 68, 19);
		contentPane.add(codeData);
		codeData.setColumns(10);
		
		nameData = new JTextField();
		nameData.setEnabled(false);
		nameData.setBounds(107, 124, 270, 19);
		contentPane.add(nameData);
		nameData.setColumns(10);
		
		check_button = new JButton2();
		check_button.setAction(actionCheck);
		check_button.setText("確認");
		check_button.setBounds(201, 68, 69, 27);
		contentPane.add(check_button);
		
		update_button = new JButton2();
		update_button.setAction(actionUpdate);
		update_button.setEnabled(false);
		update_button.setText("更新");
		update_button.setBounds(280, 188, 96, 27);
		contentPane.add(update_button);
		
		cance_button = new JButton2();
		cance_button.setAction(actionCancel);
		cance_button.setText("\u30AD\u30E3\u30F3\u30BB\u30EB");
		cance_button.setEnabled(false);
		cance_button.setBounds(280, 225, 96, 27);
		contentPane.add(cance_button);
		
		jdbc_odbc = new JComboBox<String>();
		jdbc_odbc.addPopupMenuListener(new PopupMenuListener() {
			public void popupMenuCanceled(PopupMenuEvent arg0) {
			}
			public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
				rdbms.setSelectedIndex(-1);
			}
			public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
			}
		});
		jdbc_odbc.setModel(new DefaultComboBoxModel<String>(new String[] {"JDBC", "ODBC"}));
		jdbc_odbc.setSelectedIndex(1);
		jdbc_odbc.setBounds(29, 27, 83, 19);
		contentPane.add(jdbc_odbc);
		
		rdbms = new JComboBox<String>();
		rdbms.addPopupMenuListener(new PopupMenuListener() {
			public void popupMenuCanceled(PopupMenuEvent arg0) {
			}
			public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
			}
			// コンボボックスを開いた時に発生するイベント
			public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
				rdbms.removeAllItems();
				if (jdbc_odbc.getSelectedItem().equals("JDBC")){
					// JDBC では、MS Access は存在しない
					rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
							{"MySQL", "Oracle", "SQLServer",  "Postgres"}));
				}
				if (jdbc_odbc.getSelectedItem().equals("ODBC")){
					rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
							{"MySQL", "Oracle", "SQLServer", "MS Access", "Postgres"}));
				}
			}
		});
		rdbms.setBounds(124, 27, 110, 19);
		contentPane.add(rdbms);
		{
			txtPassword = new JTextField();
			txtPassword.setText("password");
			txtPassword.setBounds(336, 27, 96, 19);
			contentPane.add(txtPassword);
			txtPassword.setColumns(10);
		}
		
		JLabel2 label2_0 = new JLabel2();
		label2_0.setText("パスワード");
		label2_0.setBounds(265, 28, 68, 19);
		contentPane.add(label2_0);
		
		JLabel2 label2_1 = new JLabel2();
		label2_1.setText("コード");
		label2_1.setBounds(29, 72, 52, 19);
		contentPane.add(label2_1);
		
		JLabel2 label2_2 = new JLabel2();
		label2_2.setText("社員名");
		label2_2.setBounds(29, 125, 52, 19);
		contentPane.add(label2_2);
	}

	// 会話用 ボタンアクション 1
	private class SwingActionCheck extends AbstractAction {
		public SwingActionCheck() {
			putValue(NAME, "確認");
			putValue(SHORT_DESCRIPTION, "社員コードを入力して下さい");
		}

		public void actionPerformed(ActionEvent e) {
		
			getConnect();
			
			try {
				
				stmt = con.createStatement();
				String scode = codeData.getText();
				rset = stmt.executeQuery ( "select * from 社員マスタ where 社員コード = '" + scode + "'" );
				if ( rset.next() ) {
					nameData.setText(rset.getString( "氏名" ));
					
					update_button.setEnabled(true);
					nameData.setEnabled(true);
					cance_button.setEnabled(true);
					
					check_button.setEnabled(false);
					codeData.setEnabled(false);
					jdbc_odbc.setEnabled(false);
					rdbms.setEnabled(false);
					txtPassword.setEnabled(false);
					
					nameData.requestFocusInWindow();
					nameData.selectAll();
					
				}
				else {
					JOptionPane.showMessageDialog(contentPane, "入力した社員コードは存在しません");
					codeData.requestFocusInWindow();
					codeData.selectAll();
				}
				
				rset.close();
				stmt.close();
				con.close();
				
			} catch (Exception e1) {
				// TODO 
				e1.printStackTrace();
			}
			
		}

	}
	
	private boolean getConnect() {
		
		boolean connect_result = true;
		
		String pass = txtPassword.getText();
		
		// TODO 自動生成されたメソッド・スタブ
		// JDBC か ODBC か
		String targetDbc = (String)jdbc_odbc.getSelectedItem();
		String targetRdbms = (String)rdbms.getSelectedItem();

		
		String connectionString = "";

		// *********************************************
		// ODBC 用接続文字列
		// *********************************************

		if (targetDbc.equals("ODBC")) {
			if (targetRdbms.equals("SQLServer")) {
				// SQLServer
				connectionString = "Provider=MSDASQL"
						+ ";Driver={SQL Server Native Client 11.0}"
						+ ";SERVER=.\\sqlexpress" + ";DATABASE=lightbox"
						+ ";UID=sa" + ";PWD=" + pass + ";";
			}
			if (targetRdbms.equals("MySQL")) {
				// MySQL
				connectionString = "Provider=MSDASQL"
						+ ";Driver={MySQL ODBC 5.3 Unicode Driver}"
						+ ";SERVER=localhost" + ";DATABASE=lightbox"
						+ ";UID=root" + ";PWD=" + pass + ";Charset=cp932";
			}
			if (targetRdbms.equals("MS Access")) {
				// MDB
				connectionString = "Provider=MSDASQL"
						+ ";Driver={Microsoft Access Driver (*.mdb)}"
						+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
			}
			if (targetRdbms.equals("Oracle")) {
				// Oracle
				connectionString = "Provider=MSDASQL"
						+ ";Driver={Oracle in XE}" + ";DBQ=localhost:1521/XE"
						+ ";UID=lightbox" + ";PWD=" + pass + ";";
			}
			if (targetRdbms.equals("Postgres")) {
				// 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");
				System.out.println(connectionString);
				con = DriverManager.getConnection("jdbc:odbc:"+connectionString, prop);
			}
			else {

				// *********************************************
				// JDBC 用接続文字列
				// *********************************************
				
				if (targetRdbms.equals("MySQL")) {
					// MySQL
					// mysql-connector-java-5.1.30-bin.jar
					con = DriverManager.getConnection("jdbc:mysql://localhost/lightbox?" +
						"user=root&password="+pass);
				}

				if (targetRdbms.equals("Oracle")) {
					// Oracle
					// ojdbc6.jar
					con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","lightbox",pass);
				}
				
				if (targetRdbms.equals("SQLServer")) {
					// SQLServer
					// sqljdbc4.jar
					String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
						"databaseName=lightbox;user=sa;password="+pass+";";
					con = DriverManager.getConnection(connectionUrl);
				}

				if (targetRdbms.equals("PostgreSQL")) {
					// 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 e1) {
			// TODO 
			e1.printStackTrace();
			connect_result = false;
		}
		
		return false;
	}
	
	// 会話用 ボタンアクション 2
	private class SwingActionUpdate extends AbstractAction {
		public SwingActionUpdate() {
			putValue(NAME, "更新");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			
			int result = JOptionPane.showConfirmDialog(contentPane, "更新してよろしいですか?", "更新確認", JOptionPane.OK_CANCEL_OPTION);
			if ( result == JOptionPane.CANCEL_OPTION) {
				return;
			}

			getConnect();
			
			try {
				
				stmt = con.createStatement();
				String scode = codeData.getText();
				String sname = nameData.getText();
				String sql = "update 社員マスタ set 氏名 = '" + sname + "' where 社員コード = '" + scode + "'";
				result = stmt.executeUpdate(sql);
				
				actionCancel.actionPerformed(null);
				
				stmt.close();
				con.close();
				
				JOptionPane.showMessageDialog(contentPane, "更新処理が実行されました");
				
				
			} catch (Exception e1) {
				// TODO 
				e1.printStackTrace();
			}
			
			
		}
	}
	private class SwingActionCancel extends AbstractAction {
		public SwingActionCancel() {
			putValue(NAME, "キャンセル");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			
			update_button.setEnabled(false);
			nameData.setEnabled(false);
			cance_button.setEnabled(false);
			
			check_button.setEnabled(true);
			codeData.setEnabled(true);
			jdbc_odbc.setEnabled(true);
			rdbms.setEnabled(true);
			txtPassword.setEnabled(true);
			
			nameData.setText("");
			
			codeData.requestFocusInWindow();
			codeData.selectAll();
			
		}
	}
}



関連する記事


【Javaの最新記事】
posted by lightbox at 2014-05-10 22:37 | Java | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり