原创文章,转载时请注明出处。
最近公司在优化代码,把基础的JDBCsql语句转为JDBCTemplate,自己在网上找了很久,大多都是query()方法的延伸,比如queryForObject(),queryForInt(),queryForString(),queryForList(),queryForMap()等等的介绍,反而没有根源方法query()的说明,于是请教了公司里的前辈,瞬间感觉豁然开朗。
首先是代码
JdbcTemplate jdbcTemplate = new JdbcTemplate();
List list;
list = jdbcTemplate.query(sql,new Object[] { args1,args2 }, new RowMapper()
{
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException
{
//statements...
}
});
先从参数讲起:
sql是已经写好的sql查询语句,args1,args2是需要替换sql语句占位符的参数,注意必须按照顺序一一对应,其他部分都可以不用修改,这样的话已经可以达成一个基础的sql语句查询并返回结果的功能。
然后是返回类型:
默认的话query返回的是一个Map的集合,这里我用List作为这个集合,于是返回的是List
对于这个Map而言,它会把查询出来的数据按照<列名称,对应列的值>作为键值对存入Map,每条属性一个键值对。比如我查出来有一条数据是name=sample, status=active,那么对应Map就会存入
然而,spring还提供了一个可扩展的方法mapRow,这个方法可以自定义集合中返回的数据类型,如上文所述,默认返回是Map,但是用户可以自定义,如以下代码:
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException
{
String s = { rs.getString("name") + " is "+ rs.getString("status") };
return s;
}
这样的话我就自定义了结果集数据的返回类型,格式是 name is status
如果我有两条数据分别是
name = lucien, status = active
name = simon, status = inactive
那么query返回出来的最终结果就是[ "lucien is active", "simon is inactive" ]