autoMapping和autoMappingBehavior的区别及说明
作者:Androidbo 发布时间:2023-11-29 06:39:25
autoMapping和autoMappingBehavior的区别
autoMappingBehavior
mybatis核心配置文件中settings中配置,指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。默认是partial,这是一种全局设置
autoMapping
在resultMap或者association,collections中使用,是一个局部开关,开启后会自动设置嵌套查询中的属性,局部开关优先级大于全部开关,当全部开关开启FULL映射时,局部开关关闭,这时候仍然不会进行映射。
例子
配置信息,mybatis的Settings全部为默认配置,我们测试局部自动映射的结果
<select id="findCustomerByIdResultMap" parameterType="int" resultMap="CustomerResultMap">
SELECT
id,
username,
jobs,
phone,
idCard.cardId as cardId,
idcard.address as address
FROM
t_customer ,
idcard
WHERE t_customer.cardId=idcard.cardId and t_customer.id=#{id}
</select>
<resultMap type="cn.edu.huel.po.Customer" id="CustomerResultMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="jobs" property="jobs"/>
<result column="phone" property="phone"/>
<association property="card" javaType="cn.edu.huel.po.IdCard">
<id column="cardId" property="cardId"/>
<result column="address" property="address"/>
</association>
测试结果
DEBUG [main] - ==> Preparing: SELECT id, username, jobs, phone, idCard.cardId as cardId, idcard.address as address FROM t_customer , idcard WHERE t_customer.cardId=idcard.cardId and t_customer.id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
Customer [id=2, username=李四, jobs=采购, phone=222, card=IdCard [cardId=2222, address=安阳]]
去掉restult,不开启autoMapping
<select id="findCustomerByIdResultMap" parameterType="int" resultMap="CustomerResultMap">
SELECT
id,
username,
jobs,
phone,
idCard.cardId as cardId,
idcard.address as address
FROM
t_customer ,
idcard
WHERE t_customer.cardId=idcard.cardId and t_customer.id=#{id}
</select>
<resultMap type="cn.edu.huel.po.Customer" id="CustomerResultMap">
<id column="id" property="id"/>
<association property="card" javaType="cn.edu.huel.po.IdCard">
<id column="cardId" property="cardId"/>
</association>
</resultMap>
结果,可以看出在嵌套查询中,mybatis默认设置嵌套查询不自动映射,必须的有result
DEBUG [main] - ==> Preparing: SELECT id, username, jobs, phone, idCard.cardId as cardId, idcard.address as address FROM t_customer , idcard WHERE t_customer.cardId=idcard.cardId and t_customer.id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
Customer [id=2, username=null, jobs=null, phone=null, card=IdCard [cardId=2222, address=null]]
加上autoMapping为ture进行测试
<select id="findCustomerByIdResultMap" parameterType="int" resultMap="CustomerResultMap">
SELECT
id,
username,
jobs,
phone,
idCard.cardId as cardId,
idcard.address as address
FROM
t_customer ,
idcard
WHERE t_customer.cardId=idcard.cardId and t_customer.id=#{id}
</select>
<resultMap type="cn.edu.huel.po.Customer" autoMapping="true" id="CustomerResultMap">
<id column="id" property="id"/>
<association property="card" autoMapping="true" javaType="cn.edu.huel.po.IdCard">
<id column="cardId" property="cardId"/>
</association>
</resultMap>
结果,没有result,结果照样映射
DEBUG [main] - ==> Preparing: SELECT id, username, jobs, phone, idCard.cardId as cardId, idcard.address as address FROM t_customer , idcard WHERE t_customer.cardId=idcard.cardId and t_customer.id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
Customer [id=2, username=李四, jobs=采购, phone=222, card=IdCard [cardId=2222, address=安阳]]
小结一下
autoMappingBehavior是<settings>里面的,是全局总开关。autoMapping是<resultMap>里面的,是局部select语句映射开关。
局部开关优先级大于全局开关。
如上resultMap配置了autoMapping, 那么mybatis会自动把查询出来的name、id、cartid都赋值给customer, 如果autoMappng设为false, 则不会自动映射, 需要你在resultMap中手动配置result,它的作用在collection和association标签中作用是一样的。
此外, 配置autoMapping这个属性的优先级高于autoMappingBehavior, 也就是即使你autoMappingBehavior配置为FULL, 但是autoMapping配置为false, 那么依旧不会自动映射。
在嵌套影射中通常会同时配置上columnPrefix属性, 这样的话可以在一定程度上避免因为实体属性名相同导致mybatis无法正确赋值的问题。
mybaits collection使用autoMapping注意点
mybaits 在resultMap 中使用autoMapping 时出现以下情况
<collection property="persons" ofType="io.ztx.infra.dto.PersonDTO" autoMapping = "true">
<id property="id" column="person_id"/>
<result property="name" column="person_name"/>
</collection>
在collection 中设置了autoMapping,也指定了映射字段的列和属性名,会出现关联查询时collection返回是null,会直接映射成空对象
id : 1,
persons: [
{
personId:null,
personName:null
}
]
实验几次后发现去掉autoMaping就不会出现这种情况
id : 1,
persons:[]
还有一种方法是把<result/> 换成<id/> 同样能够解决
<collection property="persons" ofType="io.ztx.infra.dto.PersonDTO" autoMapping = "true">
<id property="id" column="person_id"/>
<id property="name" column="person_name"/>
</collection>
一般不会出现同时开启autoMapping 又使用指定列和类属性方式的二者取其一就行。
自动映射可以通过columnPrefix指定前缀以及返回在sql中设置别名的方式来映射。这样就可以用手动去collection中写<id/> <resule/>了。
<collection property="persons" ofType="io.ztx.infra.dto.PersonDTO" autoMapping = "true" columnPrefix="p_">
</collection>
select
a.id as id,
p.id as p_id,
p.name as p_name
fron A a
left Join person p on p.id = a.pid
注意:SQL中映射的别名必须以设置好的前缀相同,同时保证别名和类属性名符合映射规则。
来源:https://blog.csdn.net/qq_34199415/article/details/80584452


猜你喜欢
- 这阵子在做Lephone的适配,测试组提交一个bug:标题栏的文字较长时没有显示完全,其实这并不能算个bug,并且这个问题在以前其他机器也没
- 前言用户注册功能是每一个系统的入口门面功能,很多人可能会以为很简单,不就是一个简单的CRUD吗?其实不然,要把前后端功能都做出来,页面跳转也
- 一、负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞
- using System;namespace Partial{ class Program { &nb
- 本文实例为大家分享了java实现多个文件压缩的具体代码,供大家参考,具体内容如下需要用到的ant.jarpackage util;impor
- 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClie
- 需求分析需求一:图片列表查询,从后台返回数据,将数据展示在页面上需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印说明:此次案例的
- NTP是Android原生通过网络获取时间的机制,其中关键代码逻辑都在NetworkTimeUpdateService,它是Android系
- 一次正常的请求最近别人需要调用我们系统的某一个功能,对方希望提供一个api让其能够更新数据。由于该同学是客户端开发,于是有了类似以下代码。@
- 目录Sonar概述一、 搭建sona服务二、idea配置三、 配置maven的setting.xml文件四、idea中 mvn sonar:
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以
- 1.利用 “+”(加号)运算符:string str = “Hello”+ “World”; console.WriteLine(str);
- 用了多年的Visual Studio,今天才发现这个编码技巧,真是惭愧,分享出来,算是抛砖引玉吧!开发环境: vs2010+C#1、代码重构
- 程序如下: public static string 英汉(string english,翻译结果 一个或多个) { string 英汉辞典
- 一、背景虽然Spring官方给我们提供了很多的启动器供我们使用但有时候我们也会遇到某些特殊场景,这些启动器满足不了这个时候就需要自定义一个启
- 单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。普通泛型单例:public abstract cl
- AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片的效果,采用插件化的框架,代码简单,
- 开篇:我们将前面的springboot整合H2内存数据库,实现单元测试与数据库无关性提供的Restful服务注册到spring cloud的
- 基本要点1、Lombok作用:在我们的实体类中,我们再也不需要声明get、set、有参无参等方法,统统可以通过Lombok注解来实现同样的功
- Java中,for-each循环简化了任何Collection或array的遍历过程,但并不是每个Java程序员都了解本文将要描述的for-