当前位置:   article > 正文

Mybatis系列第8篇:自动映射,使用需谨慎!_will only auto-map results with no nested result m

will only auto-map results with no nested result mappings defined inside.

什么是自动映射?

介绍自动映射之前先看一下手动映射,如下:

  1. <resultMap id="orderModelMap1" type="com.javacode2018.chat05.demo7.model.OrderModel">
  2.     <id column="id" property="id"/>
  3.     <result column="userId" property="userId" />
  4.     <result column="createTime" property="createTime" />
  5.     <result column="upTime" property="upTime" />
  6. </resultMap>
  7. <select id="getById1" resultMap="orderModelMap1">
  8.     <![CDATA[
  9.     SELECT
  10.         a.id,
  11.         a.user_id userId,
  12.         a.create_time createTime,
  13.         a.up_time upTime
  14.     FROM
  15.         t_order a
  16.     WHERE
  17.         a.id = #{value}
  18.     ]]>
  19. </select>

注意上面的resultMap元素中有4行配置,如下:

  1. <id column="id" property="id"/>
  2. <result column="userId" property="userId" />
  3. <result column="createTime" property="createTime" />
  4. <result column="upTime" property="upTime" />

这4行代码用于配置sql结果的列和OrderModel对象中字段的映射关系。

大家有没有注意到,映射规则中column和property元素的值都是一样,mybatis中支持自动映射配置,当开启自动映射之后,当sql的列名和Model中的字段名称是一样的时候(不区分大小写),mybatis内部会进行自动映射,不需要我们手动去写上面的4行映射规则。

下面我们将上面的示例改成自动映射的方式,如下:

  1. <resultMap id="orderModelMap2" type="com.javacode2018.chat05.demo7.model.OrderModel" autoMapping="true">
  2. </resultMap>
  3. <select id="getById2" resultMap="orderModelMap2">
  4.     <![CDATA[
  5.     SELECT
  6.         a.id,
  7.         a.user_id userId,
  8.         a.create_time createTime,
  9.         a.up_time upTime
  10.     FROM
  11.         t_order a
  12.     WHERE
  13.         a.id = #{value}
  14.     ]]>
  15. </select>

注意上面的resultMap中的autoMapping属性,是否开启自动映射,我们设置为true,这样mybatis会自动按照列名和Model中同名的字段进行映射赋值。

上面两个配置最后查询结果是一样的,都会将查询结果对应的4个字段的值自动赋值给OrderModel中同名的属性。

自动映射开关

mybatis中自动映射主要有2种配置,一种是全局的配置,对应用中所有的resultMap起效,这个是在mybatis配置文件中进行设置的;另外一种是通过resultMapautoMapping属性进行配置。

mybatis判断某个resultMap是否开启自动映射配置的时候,会先查找自身的autoMapping属性,如果这个属性设置值了,就直接用这个属性的值,如果resultMap元素的autoMapping属性没有配置,则走全局配置的自动映射规则。

下面我们来详解介绍一下这款的内容。

mybatis自动映射全局配置

在mybatis全局配置文件中加入下面配置:

  1. <settings>
  2.     <setting name="autoMappingBehavior" value="自动映射规则"/>
  3. </settings>

autoMappingBehavior值来源于枚举:org.apache.ibatis.session.AutoMappingBehavior,源码:

  1. public enum AutoMappingBehavior {
  2.   /**
  3.    * Disables auto-mapping.
  4.    */
  5.   NONE,
  6.   /**
  7.    * Will only auto-map results with no nested result mappings defined inside.
  8.    */
  9.   PARTIAL,
  10.   /**
  11.    * Will auto-map result mappings of any complexity (containing nested or otherwise).
  12.    */
  13.   FULL
  14. }
  • NONE:关闭全局映射开关

  • PARTIAL:对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射,这个也是默认值。

  • FULL:自动映射所有属性。

小提示:settings元素中有很多配置,这些配置最后都会被解析成org.apache.ibatis.session.Configuration的属性,源码位于org.apache.ibatis.builder.xml.XMLConfigBuilder#settingsElement方法中。

下面我们来演示一下autoMappingBehavior每种配置的效果。

NONE

mybatis-config.xml加入配置

  1. <settings>
  2.     <!-- 关闭自动映射开关 -->
  3.     <setting name="autoMappingBehavior" value="NONE"/>
  4. </settings>

OrderMapper.xml

  1. <resultMap id="orderModelMap4" type="com.javacode2018.chat05.demo7.model.OrderModel">
  2. </resultMap>
  3. <select id="getById4" resultMap="orderModelMap4">
  4.     <![CDATA[
  5.     SELECT
  6.         a.id,
  7.         a
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/438434
推荐阅读