利用MyBatisPlus让数据库和实体类字段主动映射

打印 上一主题 下一主题

主题 542|帖子 542|积分 1626

利用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注解映射才有结果,否则的话是没有结果的

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表