IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> BeanPropertyRowMapper映射底层原理,与驼峰写法字段映射失效现象重现以及解决方法 -> 正文阅读

[Java知识库]BeanPropertyRowMapper映射底层原理,与驼峰写法字段映射失效现象重现以及解决方法

1. 本文核心内容

  1. 深入了解BeanPropertyRowMapper为什么可以自动帮我们封装实体类。
  2. BeanPropertyRowMapper 是怎么识别 成员变量与列字段进行映射的。
  3. 字段驼峰写法 映射失败 的现象重现以及解决方法。

2. BeanPropertyRowMapper 映射原理

  1. 变量名与字段名完全相同,即可自动完成映射。
  2. 驼峰映射方式。

1. 变量名与字段名相同(代码演示)

  1. 先准备好一张表,如下:
    在这里插入图片描述
    在这里插入图片描述

  2. 实体类代码:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CfgInfo {
    
        private Integer id;
        private String CFG_NAM;
        private String CFG_TYP;
        private String CFG_010;
        private String CFG_020;
    
    }
    
  3. 代码:

    public class demo {
    
        public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
        public static final String URL = "jdbc:mysql://localhost:3306/test_mysql?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
        public static final String USERNAME = "root";
        public static final String PASSWORD = "xxxxxx";
    
        public static void main(String[] args) {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(DRIVER);
            dataSource.setUrl(URL);
            dataSource.setUsername(USERNAME);
            dataSource.setPassword(PASSWORD);
    
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            CfgInfo cfgInfo = jdbcTemplate.queryForObject("SELECT * FROM CFG_TB",
                    new BeanPropertyRowMapper<>(CfgInfo.class));
            System.out.println(cfgInfo);
        }
    }
    

    在这里插入图片描述
    这种情况,怎么样子都可以完美自动映射,不必多说。

2. 驼峰映射方式(错误重现)

  1. 表与上面相同。

  2. 实体类改为驼峰写法(除了id):

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CfgInfo {
    
        private Integer id;
        private String cfgNam;
        private String cfgTyp;
        private String cfg010;
        private String cfg020;
    
    }
    
  3. jdbcTemplate代码不变,重新运行:
    在这里插入图片描述我们发现有些映射成功了,有些映射失败了,具体原因,请看下面的底层源码解析:

3. BeanPropertyRowMapper 底层原理

1. BeanPropertyRowMapper初始化源码

  1. 直接点进源码:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

2. BeanPropertyRowMapper映射源码

在这里插入图片描述
插入小知识点:jdbc元数据相关博客:https://blog.csdn.net/xueyijin/article/details/121456405
在这里插入图片描述

在这里插入图片描述

4. 驼峰映射问题解决

1. 解释上述(驼峰映射方式)代码 原因

  1. 现在来解释一下 上述(驼峰映射方式)代码的问题了,cfg010 与 cfg020 没有办法被映射,
    第一,全部变成小写还是 cfg010,cfg020 没有问题吧,
    第二,驼峰换下划线,结果这tm数字没办法搞,因此等于没有。
    然后字段CFG_010,CFG_020,这边全部去掉空格加变小写,cfg_010,cfg_020 ,这哪里有可以对应上的,所以才映射不上,为null。

2. 解决方法

1. 字段取名字规范

  1. 别取这么奇怪的,还带数字,恶心人啊,规范真正的驼峰。

2. sql语句 使用别名

在这里插入图片描述

3. 继承BeanPropertyRowMapper,重写里面的underscoreName方法

  1. 可以重写里面的underscoreName方法,生成mappedFields的key 条件变成个性化。

    public class MyBeanPropertyRowMapper<T> extends BeanPropertyRowMapper<T> {
    
        public MyBeanPropertyRowMapper(Class<T> mappedClass) {
            super(mappedClass);
        }
    
        @Override
        protected String underscoreName(String name) {
            // 就在name 中 第四个位置加上 下划线
            if (!StringUtils.hasLength(name)) {
                return "";
            }
            // 写的很不规范 别介意 理解意思就行
            // 除掉 id
            if (name.length() < 3) {
                return name;
            }
            StringBuilder result = new StringBuilder();
            result.append(name).insert(3, "_");
            return result.toString().toLowerCase();
        }
    }
    
    

    在这里插入图片描述

4. 自己实现一个implements RowMapper

  1. 也可以自己实现一个映射关系的mapper,这个就不写代码了(有点麻烦,最简单就是copy BeanPropertyRowMapper源码 改一下),大体意思大家都明白的。
  2. 有的人问居然是copy BeanPropertyRowMapper源码,干嘛不直接继承它,一开始我也是这样子想的,但是它里面的属性要么就是private,要么就是private,要么就是private,继承没啥作用呢。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:39:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:04:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码