Jdbc常用操作まとめ

2772 ワード

一、照会
データベースからデータをクエリーする場合、jdbcを使用するには、SqlRowSet、Listなど、さまざまな方法があります.
Listの使い方は以下の通りです.
String sql = "SELECT * FROM TAB_TEST";
MapSqlParameterSource params = new MapSqlParameterSource();
List<Map<String, Object>> ret = this.namedParameterJdbcTemplate.queryForList(sql, params);
Iterator<Map<String, Object>> iter = ret.iterator();
while (iter.hasNext()) {
     Map<String, Object> item = iter.next();
     String dataId = (String)item.get("DATA_ID");
     String dataName = (String)item.get("DATA_NAME");
     //       
}
上記のコードでは、OracleタイプをJavaタイプに変換すると、NUMBER->Integerなどのいくつかのタイプで例外が発生するという問題があります.
SqlRowSetの使い方は以下の通りです.
String sql = "SELECT * FROM TAB_TEST";
MapSqlParameterSource params = new MapSqlParameterSource();
SqlRowSet rs = this.namedParameterJdbcTemplate.queryForRowSet(sql, params);
while (rs.next()) {
	try {
		String dataId = rs.getString("DATA_ID");
                if(rs.wasNull) {
                      dataId = null;
                }
                
                String dataName = rs.getString("DATA_NAME");
                if(rs.wasNull) {//                getXXX    
                      dataName = null;
                }
                //       
	} catch (InvalidResultSetAccessException e) {
		e1.printStackTrace();
		logger.error(e.getMessage());
	} catch (SQLException e) {
		e1.printStackTrace();
		logger.error(e.getMessage());
	}
}

上記のコードは、第1セグメントのコードにおける異常な問題を回避することができ、rs.getXXX(key)のみを使用し、その後のwasNull判断を行わないと、フィールドがnullであってもデフォルト値が得られる(この場合は有利で弊害があり、通常は弊害が利益より大きいと考えられる)、もう1つは、re.wasNullはgetXXXの後に呼び出され、そうでなければrs.wasNullは無効である.
上記のコードの値取り部分をツールメソッドにカプセル化します.
public static <T> T getDbValue(Class<T> type, T t, SqlRowSet rs) throws SQLException {
	return (rs.wasNull()) ? null : t;
}

最適化されたコードは次のとおりです.
String sql = "SELECT * FROM TAB_TEST";
MapSqlParameterSource params = new MapSqlParameterSource();
SqlRowSet rs = this.namedParameterJdbcTemplate.queryForRowSet(sql, params);
while (rs.next()) {
	try {
		String dataId = getDbValue(String.class, rs.getString("DATA_ID"), rs); 
                String dataName = getDbValue(String.class, rs.getString("DATA_NAME"), rs);
                //       
	} catch (InvalidResultSetAccessException e) {
		e1.printStackTrace();
		logger.error(e.getMessage());
	} catch (SQLException e) {
		e1.printStackTrace();
		logger.error(e.getMessage());
	}
}

全体的な感覚では、SqlRowSetを使用するとListより優れています.