Java > JDBCの使い方
更新日
2014-12-31
広告
JDBCの使い方を紹介します。
null値のチェック
JDBCの中には、テーブルにnullが格納されているときに、getIntメソッドを実行すると、0 を返す実装があります。 したがって、null値をチェックするためには、getIntメソッドの後に、wasNullメソッドを使う必要があります。Integer price = resultSet.getInt("price"); if (resultSet.wasNull()) { System.out.println("price is null"); }
INSERT直後の主キー取得
PostgreSQLのserial型や、MySQLのauto incrementなどを使うと、INSERTしたときに、主キーは自動的に割り振られます。 この主キーの値を、INSERT直後に取得する方法を紹介します。
そもそも、JDBCドライバが対応していないと、INSERT直後に取得できません。 以下のように、java.sql.Connectionのメソッドを利用することで、サポート状況を確認できます。
java.sql.Connection conn; if (conn.getMetaData().supportsGetGeneratedKeys()) { // サポートされている。 } else { // サポートされていない。 }対応していれば、PrepareStatementを作成するときに、SQLクエリ文字列に加えて、Statement.RETURN_GENERATED_KEYS を渡せばよいです。
PreparedStatement stmt = conn.prepareStatement("INSERT INTO user_table (name) VALUES (?)", Statement.RETURN_GENERATED_KEYS);これで、INSERT処理(executeUpdate)の後に、getGeneratedKeysメソッドを呼べば、割り当てられた主キーを取得できます。
stmt.setString(1, "hoge"); stmt.executeUpdate(); Long allocatedId = null; try (ResultSet rs = stmt.getGeneratedKeys()) { if (rs.next()) { allocatedId = rs.getLong(1); } }
I/O error occured
JDBCドライバを使っていると、たまに以下のエラーに遭遇します。org.postgresql.util.PSQLException: An I/O error occured while sending to the backend., file /tmp/hoge.dat
上記のエラーは、COPYコマンドでファイルhoge.datの内容をデータベースにロードしようとしたときに、発生したエラーです。 すでに閉じてしまったデータベースへの接続(コネクション)を利用してSQLクエリを発行すると、上記エラーが発生します。
データベースへの接続はjava.sql.Connectionクラスにて表現されます。Connection#closeメソッドを実行すると、接続が閉じられるわけですが、この状態でConnectionオブジェクトからStatementやPreparedStatementを生成し、SQLクエリを実行すると、上記のエラーが発生します。
つまり、上記のエラーが発生した場合は、コネクションを閉じてしまっていないか、確認するとよいと思います。
広告
お問い合わせは sweng.tips@gmail.com まで。