一.简介
sql中返回的是自定义的列或者一些统计的列,直接用hibernate无法处理;
此时,可以使用RowMapper,将数据中的每一行数据封装成用户定义的类
二.RowMapper
1、方法:
建立内部类实现RowMapper接口;
RowMapper中有一个mapRow方法,所以实现RowMapper接口一定要实现mapRow方法;
对自定义类的包装就在mapRow方法中实现.
2、例子:
public class TestDao {
private JdbcTemplate jt;
public void setJt(JdbcTemplate jt) {
this.jt = jt;
}
public List<TNpc> getAll(){
String sql = "select * from t_npc";
//使用
List list = jt.query(sql, new NpcRowMapper());
return list;
}
/**
* 定义内部类实现RowMapper接口
*/
public class NpcRowMapper implements RowMapper{
//实现mapRow方法
public Object mapRow(ResultSet rs, int num) throws SQLException {
//对类进行封装
TNpc npc = new TNpc();
npc.setId(rs.getLong("id"));
npc.setName(rs.getString("name"));
return npc;
}
}
}
三.相同效果的其他方法:map映射
用map映射相对rowMapper更简单,且无需建接口
List<Object> args = new ArrayList<Object>();
args.add(before);
args.add(today);
//sql获取需要的统计字段
String sql = "select cur_week_answer_count,cur_week_answer_score from t_answer where create_time>? and create_time<? and is_best_answer!=1";
//queryForList,然后把获取到的数据放到map中
List<Map<String,Object>> ids = EnvUtils.getEnv().getSimpleJdbcTemplate().queryForList(sql.toString(), args.toArray());
if(ids != null && !ids.isEmpty()){
for(Map<String,Object> map : ids){
//从map中获取数据
long answerCount = Long.parseLong(String.valueOf(map.get("cur_week_answer_count")));
long answerScore = Long.parseLong(String.valueOf(map.get("cur_week_answer_score ")));
Answer answer = answerService.load(answerCount,answerScore);
Question question = answer.getQuestion();
if(answer != null && question != null && answer.getId() == question.getBestAnswerId()){
qustionRaltionZhidaoService.setBestAnswerToZhidao(answer);
}
}
}
来源:oschina
链接:https://my.oschina.net/u/1394041/blog/176507