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
