公司的框架主要是采用spring的。因为是刚刚进公司前几天一直在看源码。现在写下过程,也算是一种积累。之前用的是hinernate,对jdbcTemplate的东西还是不熟。
先从Dao的父类AbstractJdbcDAO来说起,里面有这样一个方法:
public List queryForList(String sql, Map params, RowMapper mapper) throws DataAccessException {
try {
return getNamedParameterJdbcTemplate().query(sql, params, mapper);
} catch (EmptyResultDataAccessException e) {
return Collections.EMPTY_LIST;
}
}
参数RowMapper用于封装ResultSet。这样得到的list的里面每项都为一个map。公司mapRow默认实现如下:
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map mapOfColValues = createColumnMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
String key = getColumnKey(JdbcUtils.lookupColumnName(rsmd, i));
String otherKey = DynamicBeanUtils.decodeUnderscoreName(key);
int type = rsmd.getColumnType(i);
Object obj = null;
if (type == 1 || type == 12)
obj = getStringValue(rs, i);
else if (type == -1)
obj = getLongStringValue(rs, i);
else if (type == 2005)
obj = getClobStringValue(rs, i);
else
obj = getColumnValue(rs, i);
mapOfColValues.put(key, obj);
mapOfColValues.put(otherKey, obj);
}
return mapOfColValues;
}
这段代码写的不是很好,首先没有用Types中的常量。另外对于key的处理在最后完全可以只保留
mapOfColValues.put(otherKey, obj);
当然更好的方法是将结果封装在bo里面,最简单的方法是每个bo就都定义自己的RowMapper实现,这样有些麻烦。公司提供了一个方法,就是采用的是java的反射机制来实现这部分的。
public Object queryForBean(String sql, Map params, Class _class)
throws DataAccessException {
return queryForObject(sql, params, DynamicBeanRowMapper.getInstance(
_class, getSqlHelper(), sql));
}
DynamicBeanMapper负责生成封装了bo的rowMapper。