使用MyBatisPlus让数据库和实体类字段自动映射

文章目录

使用MyBatisPlus让数据库和实体类字段自动映射

需求场景

数据库表中的字段名字,与实体类中的属性名字不一致,我们想要让二者映射起来的时候,该怎么操作?比如数据库表中的字段名字如下图:

而User实体类中的属性名字如下图:

可以发现名字和年龄这两个字段是不一样的。那么这个时候如果我们想要映射,怎样可以正确的映射呢?

假如没有映射

假如没有映射,看下我们的sql语句,如下图:

看下我们的数据库表信息,如下图:

那么我们查询的结果是什么样的呢?如下图:

可以发现,我们的查询结果中name和age都是null。这也很容易理解,因为数据库表字段和实体类字段没有正确的映射嘛,所以查询结果肯定是空的。

把映射放到sql语句中

因此我们第一种解决方式是把映射写到mapper.xml文件的sql语句中,如下图:

只把名字不同的映射起来就行了,名字相同的address是不用写的。

最后看下查询结果,如下图:

可以发现我们查询结果中的name和age都有值了。

使用MyBatisPlus提供的注解简化映射

但是上面的映射有什么问题呢?就是实现起来过于复杂,要写的东西太多了,因此我们后续又出现了MyBatisPlus提供的映射方式,就是我们可以直接通过注解映射。直接把注解写在User实体类上就可以了,如下图:

本来以为这样写的话应该可以完成自动映射,但是测试的好像还是不行,结果如下图:

并没有完成自动映射。

目前还没有找到原因,不过后面先按照ResultMap映射把还是。

那既然不能映射的话,@TableField注解是干什么用的呢?原来是我搞错了,@TableField注解不是查询时映射的,而是插入时映射的,就是假如我现在使用MyBatisPlus往数据库user表里面插入一条数据,User实体的属性是name和age,而数据库表的属性是user_name和user_age,那么这样就插入不进去了,就会出现异常了,如下图:

因为解析的时候是直接把User实体的name属性当做了插入语句的列名,而实际上我们需要的是user_name,因此这里就会出现异常了。而当我们使用@TableField标记数据库表和属性字段的映射的时候,这个错误就会消失了,如下图:

错误消失如下图:

看一下数据库中的插入结果,如下图:

因此@TableField注解主要是用于插入映射的,而不是查询映射。

注意我们这里使用的插入是MyBatisPlus中自动引入的插入方法insert。那我就突然想到,会不会当我们使用MyBatisPlus自带的查询方法的时候,我们使用@TableField注解的查询也会自动映射呢?

使用MyBatisPlus自带的原生方法,如下图:

看下查询结果,如下图:

发现确实是可以映射的。

因此我就得出一个结论,只有使用的是MyBatisPlus自带的数据库的操作方法的时候,@TableField注解映射才有效果,否则的话是没有效果的

相关推荐
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天8 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺8 小时前
分布式系统架构:服务容错
数据库·架构
独行soc9 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘