这两天尝试了Spring提供的JdbcTemplate,感觉比hibernate还坑,记录一下,顺便聊一聊自己对ORM框架一些认识。
关于查询对象时,JdbcTemplate提供了queryForObject方法,很自然地,我理解按着传入参数(String sql, MyEntity.class)就可以了,结果报了这样的错误:
Incorrect column count: expected 1, actual 18
跟一下呢,发现spring并没有自动注入,需要entity实现RowMapper<>接口,项目里的代码是这么写的:
@Override
public SpecialEmployeeEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
SpecialEmployeeEntity employeeEntity = new SpecialEmployeeEntity();
employeeEntity.setUpdate_time(rs.getTime("update_time"));
employeeEntity.setCreate_time(rs.getTime("create_time"));
employeeEntity.setValid(rs.getBoolean("valid"));
employeeEntity.setTitle(rs.getString("title"));
employeeEntity.setGroup(rs.getString("group"));
employeeEntity.setArea(rs.getString("area"));
employeeEntity.setCurrent_max(rs.getInt("current_max"));
employeeEntity.setHistory_max(rs.getInt("history_max"));
employeeEntity.setMobile(rs.getString("mobile"));
employeeEntity.setName(rs.getString("name"));
employeeEntity.setEmployee_num(rs.getString("employee_num"));
return employeeEntity;
}
本来以为这样就完事了,结果项目跑着跑着又报错了,错误如下:
Incorrect column count: expected 1, actual 0
错误原因是sql没有查出返回的结果,讲道理,框架应该考虑这样的情况,如果sql结果为空,返回空对象,遗憾的是JdbeTemplete并没有这么做。
找到的替代方案呢,是使用queryForList方法,不过这个也不是一个很好的方案。