Javaプログラミング初心者のためのページ -43ページ目

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()){

}