MyBatis 多表嵌套查询中的懒加载和 ResultMap 知识总结

2021-10-28 0 By admin

一、嵌套查询的懒加载

1.1、全局懒加载

修改 MyBatis 的核心配置文件

<settings>
  <setting name="logImpl" value="LOG4J"/>
  <!--
    aggressiveLazyLoading:
      启用时: 有延迟加载属性的对象在被调用时将会完全加载任意属性。
      禁用时: 调用哪个懒载属性就加载哪个属性, 按需加载
   -->
  <setting name="aggressiveLazyLoading" value="false"/>
  <!--
    lazyLoadingEnabled:
      全局启用或禁用延迟加载。
    禁用时: 所有关联对象都会即时加载。
   -->
  <setting name="lazyLoadingEnabled" value="true"/>
</settings>

1.2、局部懒加载

在全局配置中设置了延迟加载的情况下可以将联合属性修改为立即加载

<resultMap id="employee" type="org.hong.pojo.Employee">
  <id property="id" column="id"></id>
  <result property="name" column="name"></result>
  <!--
    association:定义关联对象的封装规则
       select: 表明当前属性是调用select指定的方法查出的结果
       column: 指定将那一列的值传给select
       fetchType: 关联属性的加载策略, 可以覆盖全局的lazyLoadingEnabled, fetchType属性同样可以作用于collection标签
         lazy: 延迟加载
         eager: 即时加载
   -->
  <association property="dept"
         column="did"
         javaType="org.hong.pojo.Dept"
         fetchType="lazy"
         select="org.hong.mapper.DeptMapper.get"></association>
</resultMap>

二、MyBatis 中 Mapper.xml 文件 ResultMap 总结

  1. 嵌套查询的方式在查询时会向数据库发送多次SQL语句。
  2. 联合查询的方式只会向数据库发送一次SQL语句。

2.1、resultMap 配置介绍

resultMap:自定义某个javaBean的封装规则。
resultMap的属性:

  1. id:唯一标识
  2. type:自定义规则的java类型

resultMap包含的标签:

  1. result:指定其余键的封装规则
  2. id:指定主键的封装规则, id定义主键底层会有优化
    1. column:指定数据库的列
    2. property:指定对应的javaBean属性

2.2、association 和 collection 介绍

association:定义关联对象的封装规则
collection:定义关联集合类型的属性的封装规则

  1. property:当前封装的对象的属性
  2. javaType:指定实体类中属性的类型
  3. ofType:指定映射到List或集合中的pojo类型,泛型中的约束类型
  4. select:表明当前属性是调用select指定的方法查出的结果
  5. column: 指定将哪一列的值传给select

2.3、嵌套查询中传递多列的值

column="{key1=column1, key2=column2}"
  key: select指定的查询的#{key}中的key
  colnmn: 列名

流程:使用select指定的方法(传入column指定的列的参数值)查出对象, 并封装给property。