公司的框架主要是采用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。