kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

JDBCでのNULLかどうかの判定

とあるところで、jdbcAPIを直接使うことがあり調べた。

ResultSet rs で rs.getInt("カラム名") とすると、NULLであっても 0が取得される。

これは、getInt() が JDBCとして実装するインターフェイス側が

public int getInt() 

となっていて
基本データ型(プリミティブ型)を返却せざるをえないため、0が返却される。

NULLとして取得(intでなくInteger として取得)するならば、 wasNull() を使う。
was という語からして、is(現在かどうかの判定)ではない。過去(was)がnullということ。
wasNull()は1つ前に、rs.getしたカラムが Nullかどうかを返却する。

ORマッパ使わない緊急回避なら、ラッパークラスを作成して、そこを経由してrs.get することかな。

適当に書きました。

public void  hoge(){
  ・・・・
  Statement stmt = conn.createStatement();
  String sql = "SELECT * FROM kabukatable";
  ResultSet rs = stmt.executeQuery(sql);
  
  XxxResultSetWrapper rsW = new XxxResultSetWrapper(rs);
  Integer retValue = rsW.getinteger("colname");
  
}

public XxxResultSetWrapper implements ResultSet{
   private XxxResultSet xxxResultSet  
   public XxxWrapper(XxxxResultSet){
     this. xxxResultSet  =xxxResultSet  ;
   }
   public Integer getInteger(String colname){
      int a = xxxResultSet.getInt(colname);
      if(xxxResultSet.wasNull){
        return null:;
      }else{
        return new Integer(a);
      }
   }  
}

参考

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#wasNull()

Reports whether the last column read had a value of SQL NULL. Note that you must first call one of the getter methods on a column to try to read its value and then call the method wasNull


public static void main(String[] args) throws Exception {
    String url = "jdbc:odbc:technical_library";
    String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    String theStatement =
     "SELECT authid, lastname, firstname, email FROM authors ORDER BY authid";

    try {
      Class.forName(driver);
      Connection connection = DriverManager.getConnection(url, "guest", "guest");
      Statement queryAuthors = connection.createStatement();
      ResultSet results = queryAuthors.executeQuery(theStatement);

      String lastname, firstname, email;
      int id;
      while(results.next()) {
        id = results.getInt(1);
        lastname = results.getString(2);
        firstname = results.getString(3);
        email = results.getString(4);

        if(results.wasNull()) {
          email = "no email";
        }
        System.out.println(Integer.toString(id) + ", " +
                           lastname.trim() + ", " +
                           firstname.trim() +", " +
                           email.trim());
      }
      queryAuthors.close();
    } catch (Exception e) {
      System.err.println(e);
    }
  }
新しいAPI では

http://d.hatena.ne.jp/tkzwtks/20110802/1312250526

によると、isNull ができたらしい。