浅谈BeanPropertyRowMapper的实现过程

笔者最近在学习JdbcTemplate时,对数据库进行查询一条或者多条数据时用到了下图这个方法
其有三个参数:

- sql --即为所要抒写的语句
- rowMapper --本文所探究的类
- args --多个参数

在这里插入图片描述
RowMapper是Spring里的一个接口,用来把我们从数据库中查询到的数据封装成用户自定义的类,从而省下了传统的JDBC需要从结果集中再去一一和我们的对象类对应的过程。而BeanPropertyRowMapper是一个实现了RowMapper接口的类,但BeanPropertyRowMapper有一个点需要注意:从数据库中查询出的数据列名要和我们自定义的实体类的名字一样,但是顺序可以不一样。例如我数据库定义的表中列名为username,那么我相应的实体类中的属性名也必须是username。如果我们想自定义规则实现映射,那么我们可以自定义一个类去实现RowMapper接口。比如我可以定义BeanUser去实现RowMapper接口。具体实现过程见下面分析。

 @Override
    public User queryOne(int id) {
        String sql="select * from t_user where id=?";
        User user = jdbcTemplate.queryForObject(sql,
                new BeanPropertyRowMapper<User>(User.class), id);
        return user;
      
    }

通过查看BeanPropertyRowMapper的其中一个构造方法,可以看到先调用了initialize方法;

在这里插入图片描述

initialize方法中主要是把通过 PropertyDescriptor获取的属性值插入到mappedFields Map中,lowerCaseName是把属性名转换为小写插入到*mappedFields 中;
在这里插入图片描述
underscoreName首先把第一个属性名中的字母转为小写追加到result中然后从第二个开始进行遍历,如果name中的字母与转化为的小写字母不一样就追加一个"_"下划线然后再追加其小写字母(即如果原name中为大写就执行上述操作,否咋就追加s)
在这里插入图片描述

最后通过红框中的语句把遍历的结果一一加入到set集合即mappedProperties中去,而有set集合的属性我们知道1、一次只存一个元素; 2、不能存储重复的元素; 3、存储顺序和取出来的顺序不一定一致。 从而我们也就知道为什么BeanPropertyRowMapper规定必须数据库表中的列名要和我们自定义的实体类中的列名一样,否则找不到对应的元素,并且其顺序可以不一致。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐