JdbcTemplate中RowMapper的粗浅理解
这篇博客适合第一次使用RowMapper的初学者:
- RowMapper映射Bean容器的用法
- RowMapper映射取整张表数据的用法
RowMapper映射Bean容器的用法
这大概是使用最频繁的用法,甚至也是唯一真正实用的方法。
class UserRowMapper implements RowMapper<User> {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setGender(rs.getString("gender"));
return user;
}
}
如此,完成了一个对User类的RowMapper映射。直接jdbcTemplate.query(sql,new UserRowMapper)即可将查询的信息存入java Bean中,靠的是bean中的get/set方法。
RowMapper映射取整张表数据的用法
查询一行数据时使用
class GenericMapper implements RowMapper<Map<String,String>> {
@Override
public Map<String, String> mapRow(ResultSet rs, int rowNum) throws SQLException {
//List<Map<String, String>> list = new ArrayList<Map<String, String>>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
//while (rs.next()) {
Map<String, String> map = new HashMap<String, String>();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
String value = rs.getString(columnName).replace(" ", "");
map.put(columnName, value);
}
//list.add(map);
//}
return map;
}
}
如上是一个我简单实现的用RowMapper映射出一个Map容器,从ResulSet中获取整行数据并按列名-值的方式放入HashMap中,同样只要用JdbcTemplatejdbcTemplate.query(sql,new GenericMapper)即可完成查询的封装。期间我写的注释即是query()方法所做的工作,它替我们完成了封装List的功能,如javaBean中一样,不用我们手动遍历,只需定义一组RowMapper。
总结:
由此可见,jdbcTemplate.queryForObject(String sql, Object[] args, RowMapper rowMapper)以及jdbcTemplate.queryForList(sql)所做的工作大致如此,前者实际上取的是query结果的第一行,后者则完全一样,并且用query可以随意封装任意格式(替换列名,选择性封装,修改属性值等等),省去后期逻辑中遍历map或list的痛苦。