在使用Spring 5框架时,调用JdbcTemplate进行对数据库的查询:
DaoImpl中的方法:
@Override
public User searchUserById(Integer id) {
String sql = "select * from user where id = ?";
/**
* 返回单个对象使用jdbcTemplate.queryForObject方法
*/
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class),id);
return user;
}
测试方法:
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
UserService userService = context.getBean("userService", UserService.class);
User user = userService.searchUserById(1);
System.out.println(user);
报错:
org.springframework.beans.BeanInstantiationException: Failed to instantiate [pojo.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: pojo.User.()
未能成功创建对象!缺少 default constructor !即空参构造器!!!
加上对应的空参构造器:
public User() {
}
再次执行test方法,获得结果:
其中id值为null,这显然是不对的!
属性值为null原因可能是创建对象后未能成功设置属性,在User类中查找,发现未生成id的set方法!!!
加上set方法之后:
public void setId(Integer id) {
this.id = id;
}
再次运行结果:
底层原理:
jdbcTemplate.queryForObject方法调用了:
而query方法最底层源码为:
即是通过PreparedStatement来实现对对象属性的赋值,而PreparedStatement是通过setObject()方法实现属性的赋值,即:jdbcTemplate.queryForObject()方法是先创建一个空参构造器,再调用对应属性的set方法对属性进行赋值!
所以需要对应的类具有空参构造器以及属性的set方法!!!