autoMapping和autoMappingBehavior的区别及说明
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中映射的别名必须以设置好的前缀相同,同时保证别名和类属性名符合映射规则。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot+springsecurity如何实现动态url细粒度权限认证
这篇文章主要介绍了springboot+springsecurity如何实现动态url细粒度权限认证的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06springboot docker jenkins 自动化部署并上传镜像的步骤详解
这篇文章主要介绍了springboot docker jenkins 自动化部署并上传镜像的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-05-05Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)
查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。本文介绍了常见的数据查找算法:顺序查找、二分查找、插值查找和斐波那契查找等以及相应的Java代码实现。需要的可以参考一下2022-01-01
最新评论