Spring 5中使用JdbcTemplate的queryForObject()方法查询数据库表中对象时无法创建对象以及对象有的属性值为null的原因

在使用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方法!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dame'Seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值