JDBCでのNULLかどうかの判定
とあるところで、jdbcのAPIを直接使うことがあり調べた。
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
- 参考 http://docstore.mik.ua/orelly/java-ent/servlet/ch09_02.htm
- 参考 http://d.hatena.ne.jp/ocs/20101113/1289588072
- 参考 http://blogs.yahoo.co.jp/yosuke_free/41251424.html
- 参考 http://www.java2s.com/Code/JavaAPI/java.sql/ResultSetwasNull.htm
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); } }