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的痛苦。