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 まで。
inserted by FC2 system