PreparedStatementのSELECT文には’(シングルクォート)は不要です
JDBCのよくある間違い
よくある度:★★★★★
状況:PreparedStatement使用時
PreparedStatementのSELECT文には’(シングルクォート)は不要です
String sql = "SELECT * FROM EMP WHERE NAME = '?'";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "山田太郎");
では検索できません。
主キーが重複すれば追加できません
JDBCのよくある間違い
よくある度:★★★☆☆
状況:登録時
・ 主キーが重複するデータの追加
主キーを固定値としているINSERT文を実行すると、2回目以降は実行時エラーになります。
DuplicateKey...
などのメッセージが出るはずです。
当たり前の話ですが、はじめは気づきにくいみたいです。
ResultSetは1つのみ保持が標準の動作です
JDBCのよくある間違い
よくある度:★☆☆☆☆
状況:検索時
・ ResultSetオブジェクトは1つのみ保持
1つのStatementオブジェクトが保持できるResultSetオブジェクトは1つのみである。
Statement stmt = con.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT ...... ");
ResultSet rs2 = stmt.executeQuery("SELECT ...... ");
while(rs1.next()){
}
while(rs2.next()){
}
とした場合、2回目のexecuteQuery実行時にrs1は自動的にclose()されます。
従って、「while(rs1.next()){」のタイミングで例外が発生します。
※ドライバによっては可能な複数ResultSetが保持できます。
以下の2通りの対処方法が考えられます。
===その1:rs1のデータを取り出した後で2回目の検索を行う。
Statement stmt = con.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT ...... ");
while(rs1.next()){
}
ResultSet rs2 = stmt.executeQuery("SELECT ...... ");
while(rs2.next()){
}
===その2:別のStatementオブジェクトを生成する。
Statement stmt1 = con.createStatement();
Statement stmt2 = con.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT ...... ");
ResultSet rs2 = stmt2.executeQuery("SELECT ...... ");
while(rs1.next()){
}
while(rs2.next()){
}