QueryRunner类中的方法参数为什么是反射

QueryRunner类中的方法参数为什么是反射

@Override
public User findById(String id) {
Connection conn = DbUtils.getConnection();
QueryRunner qr = new QueryRunner();
User user = null;
try {
//问题描述:QueryRunner是阿帕奇简化SQL查询的jar包中的类
    //query中的第三个参数为什么要用new BeanHandler<>(User.class),其中的反射(User.class)不明白为什么要用
user = qr
.query(conn, "SELECT * FROM `user` WHERE id = ?", new BeanHandler<>(User.class),
id);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closed(conn);
}
return user;
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,

这里会通过传入的Class类,反射会通过无参构造来创建对象,然后把查询返回的结果封装到创建的对象中去。

祝学习愉快。

  • 森林sng 提问者 #1

    老师,能解释详细点嘛,并且将底层的给我讲一下

    2021-04-02 15:26:16
  • 好帮手慕阿莹 回复 提问者 森林sng #2

    同学你好,QueryRunner中传递的第三个参数是一个ResultSetHandler类型,一般都是创建一个该类型的子类对象然后传进去,常用子类对象分别是:BeanHandler、BeanListHandler、MapHandler、MapListHandler。因为mybatis底层可以自动把从数据库中查询出来的数据封装成对象,查询的时候,我们就可以预估返回值大概会是什么样子的,如果你查询出来的就是一实体类对象,就可以用BeanHandler,如果返回值是实体类的集合,就用BeanListHandler,如果返回的是一个Map,则可以用MapHandler,如果是一Map集合,则可以用MapListHandler。

    当我们使用BeanHandler的时候,传入一个实体类的class类,底层就会根据这个class类,使用反射创建一个对应的对象,例如,我们传入User.class,则底层会通过反射创建一个User对象,然后mybatis底层则会把从数据库中返回的值,封装到这个User对象中了。

    祝学习愉快。


    2021-04-02 15:47:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师