公司源码分析 之jdbcTemplate的封装

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

 

你可能感兴趣的:(DAO,spring,sql,框架)