JDBC
- Java で RDB にアクセスするための標準的な API です。
接続 (DriverManager)
Class.forName() メソッドでクラスをアプリケーション中に読み込み、 DriverManager.getConnection() メソッドでデータベース接続を取得します。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:odbc:test", "user", "pass");
接続 (DataSource)
JNDI サービスに DataSource を登録し、 DataSource からデータベース接続を取得する方法です。 JNDI サービスが利用できる環境では、この方法が推奨されています。
InitialContext ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test"); Connection conn = ds.getConnection();
切断
Connection#close() メソッドを呼び出して接続を閉じます。ガベージ コレクタでは閉じられないので、確実に閉じる必要があります。一般的には、以下のように try-finally ブロックで囲みます。
Connection conn = DriverManager.getConnection("jdbc:odbc:test", "user", "pass"); try { // 適当な処理 } finally { conn.close(); }
SQL を発行
検索系 (Statement)
- Connection#createStatement() メソッドで Statement を取得、
- Statement#executeQuery() メソッドで ResultSet を取得、
- ResultSet#getXXX() メソッドで結果を取得します。
Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * from foo"); try { while (rs.next()) { System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); } } finally { rs.close(); }
更新系 (Statement)
Statement#executeUpdate() メソッドで更新を行います。
Statement st = conn.createStatement(); int result = st.executeUpdate("insert into foo (id, name) values (1, 'foo')");
検索系 (PreparedStatement)
- Connection#prepareStatement() メソッドで SQL がプリコンパイルされた PreparedStatement を取得、
- PreparedStatement#setXXX() メソッドでパラメータを設定、
- PreparedStatement#executeQuery() メソッドで ResultSet を取得、
- ResultSet#getXXX() メソッドで結果を取得します。
PreparedStatement st = conn.prepareStatement("select * from foo where id = ?"); st.setInt(1, 100); ResultSet rs = st.executeQuery(); try { while (rs.next()) { System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); } } finally { rs.close(); }
- パラメータは ? として埋め込みます。
- パラメータのインデックス番号は 1 から始まります。
- SQL インジェクション対策にもなります。 Statement より PreparedStatement を積極的に活用すべきです。
更新系 (PreparedStatement)
PreparedStatement#executeUpdate() メソッドで更新を行います。
PreparedStatement st = conn.prepareStatement("insert into foo (id, name) values (?, ?)"); st.setInt(1, 100); st.setString(2, "foo"); int result = st.executeUpdate();
トランザクション
- Connection#setAutoCommit() メソッドで自動コミットを抑止します。これでトランザクションが開始されます。自動コミットを抑止しない場合、更新系 SQL は常にコミットされます。
- Connection#commit() メソッドでトランザクションをコミットします。
- Connection#rollback() メソッドでトランザクションをロールバックします。
conn.setAutoCommit(false); try { PreparedStatement st = conn.prepareStatement("insert into foo (id, name) values (?, ?)"); st.setInt(1, 100); st.setString(2, "foo"); st.executeUpdate(); conn.commit(); } catch (SQLException e) { conn.rollback(); throw e; }
参照
2005年12月07日(水) 21:47:44 Modified by uguuxp