【JaveでDBを扱うときに使用】
・JDBC と ORM
【JDBC (Java DataBase Connectivity)】
JavaプログラムからDBにアクセスするための標準インターフェース(接点)の一つ。
*API(Application Program Interface)・・・プログラミングを効率よく行うためのクラス集り。
【ORM(Object-Relational Mapping)】
DB のレコードと Java オブジェクトを自動 的に紐づける O/R マッピング処理や DB への接続/切断、トランザクション処理など、DB 関連の処理を自動化してくれるフレームワーク
【DB への接続/切断プログラムの作成 】
1. JDBC ドライバの準備
(*今回は「Oracle Database 11g Release 2 用の JDBC ドライバ」をダウンロードした。)
ダウンロードしたら、「jdbc」フォルダの「lib」フォルダ内に「ojdbc6.jar」ってのが作成されてる。
【準備1:「eclipse」を開き、使用するプロジェクトの「libフォルダ」に「ojdbc6.jar」をコピー。】
<libフォルダ>
・静的プロジェクト → プロジェクト直下に「libフォルダ」作成
・動的プロジェクト → 「WebComtent」→「WEB-INF」の中に「libフォルダ」がある。
【準備2:ビルド・パスを通す!】
プロジェクト上で右クリック → [プロパティ] → [Java のビルド・パス] → [ライブラリー] →[Jar 追加] → [lib フォルダーに格納した ojdbc6.jar ファイルを選択]
【DB接続:サンプル】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package jp.co.sss.sample.jdbc.chapter01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBManager { /** * DBと接続する * * @return DBコネクション * @throws ClassNotFoundException * @throws SQLException */ public Connection getConn() throws ClassNotFoundException, SQLException { // JDBCドライバクラスをJVMに登録 Class.forName("oracle.jdbc.driver.OracleDriver"); // DBへ接続:引数の指定(DBの場所, ユーザ名, パスワード) Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:XE", "jdbcuser", "systemsss"); System.out.println("DBに接続しました"); return conn; } /** * DB接続を切断する * * @param conn DBコネクション */ public void close(Connection conn) { try { // 切断処理 if (conn != null) { conn.close(); System.out.println("切断しました"); } } catch (SQLException e) { e.printStackTrace(); } } } |
【Statement クラス 】
Statement クラスのオブジェクト → Connection クラスの createStatement()メソッドで生成。
<検索用の SQL 文の発行>
1 |
Statement クラスの executeQuery()メソッド |
<登録、更新、削除用の SQL 文の発行>
1 |
Statement クラスの executeUpdate()メソッド |
【ResultSet クラス】
・表形式のデータでカーソルを利用(1レコード文を取得)
1 2 |
//カーソルの移動 ResultSet クラスの next()メソッド |
<クラスからDBへ接続&検索:作成例>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package jp.co.sss.sample.jdbc.chapter01; import java.sql.Connection; import java.sql.SQLException; public class Sample01 { public static void main(String[] args) throws SQLException { Connection conn = null; Statement st = null; ResultSet rs = null; // DBManagerのインスタンスを生成 DBManager manager = new DBManager(); try { // 接続する conn = manager.getConn(); st = conn.createStatement(); String sql = "SELECT * FROM employee"; rs = st.executeQuery(sql); System.out.println( "emp_id\temp_pass\temp_name\tgender\taddress\tbirthday"); //レコードの値を取得 while (rs.next()) { System.out.print(rs.getString("emp_id") + "\t"); System.out.print(rs.getString("emp_pass") + "\t"); System.out.print(rs.getString("emp_name") + "\t"); System.out.print(rs.getString("gender") + "\t"); System.out.print(rs.getString("address") + "\t"); System.out.println(rs.getString("birthday")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { System.err.println("Oracleエラーコード:" + e.getErrorCode()); System.err.println("SQLStateコード:" + e.getSQLState()); System.err.println("エラーメッセージ:" + e.getMessage()); e.printStackTrace(); } finally { // 切断処理 manager.close(conn); } } } |
【PreparedStatement による検索】
PreparedStatement クラス
→プレースホルダを用いて、 SQL 構文の動的に変化する箇所をバインド変数「?」で記述可能。
<一部実装例>
1 2 3 |
String sql = "SELECT * FROM employee WHERE emp_id = ?"; PrepareStatement ps = conn.prepareStatement(sql); ps.setString(1, "0001"); rs = ps. executeQuery(); |
<実装例>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package jp.co.sss.sample.jdbc.chapter03; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import jp.co.sss.sample.jdbc.chapter01.DBManager; public class Sample03 { public static void main(String[] args) throws SQLException, IOException { Connection conn = null; //SQL 構文の動的に変化させる場合「PreparedStatementクラス」使用 PreparedStatement ps = null; ResultSet rs = null; // DBManagerのインスタンスを生成 DBManager manager = new DBManager(); try { // 接続する conn = manager.getConn(); // SQL構文を構築 String sql = "SELECT * FROM employee WHERE emp_name LIKE ?"; ps = conn.prepareStatement(sql); // 検索値の入力 System.out.println("社員名を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 入力値をバインド String empName = br.readLine(); //引数の値(何番目の「?」に代入するか指定, 代入する値) ps.setString(1, "%" + empName + "%"); rs = ps.executeQuery(); System.out.println( "emp_id\temp_pass\temp_name\tgender\taddress\tbirthday"); while (rs.next()) { SystemShared All Rights Reserved. System.out.print(rs.getString("emp_id") + "\t"); System.out.print(rs.getString("emp_pass") + "\t"); System.out.print(rs.getString("emp_name") + "\t"); System.out.print(rs.getString("gender") + "\t"); System.out.print(rs.getString("address") + "\t"); System.out.println(rs.getString("birthday")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { System.err.println("Oracleエラーコード:" + e.getErrorCode()); System.err.println("SQLStateコード:" + e.getSQLState()); System.err.println("エラーメッセージ:" + e.getMessage()); e.printStackTrace(); } finally { // ResultSetをクローズ if (rs != null) { rs.close(); } // PreparedStatementをクローズ if (ps != null) { ps.close(); } // 切断する manager.close(conn); } } } |
【SQL インジェクション】
DB に対し、想定していない SQL コマンドを不正に実行する攻撃手法。
*後日記載
【トランザクション管理】
・一連のデータ処理を 1 つの単位として管理すること。
一連の流れの中でエラーが起き たら、全ての処理を実行前に戻す。
【ACID 特性 】
・トランザクション処理に求められる特性
*後日記載