mybatis教程之延迟加载详解

延迟加载

1 使用延迟加载意义

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。

如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

2 配置mybatis支持延迟加载

在 SqlMapConfig.xml中配置全局参数:

<!-- 全局配置参数 --> 

<settings> 

<!-- 延迟加载总开关 --> 

<setting name="lazyLoadingEnabled" value="true" /> 

<!-- 设置按需加载 --> 

<setting name="aggressiveLazyLoading" value="false" /> 

</settings> 

3 延迟加载实现

3.1 实现思路

需求:

查询订单及用户的信息,一对一查询。

刚开始只查询订单信息

当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。

3.2 mapper.xml

<!-- 一对一查询延迟加载
   开始只查询订单,对用户信息进行延迟加载
   -->
   <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">
     SELECT
     orders.*
    FROM
     orders
   </select>

3.3 resultMap 

<!-- 一对一查询延迟加载 的配置 -->
  <resultMap type="orders" id="orderCustomLazyLoading">
    <!-- 完成了订单信息的映射配置 -->
    <!-- id:订单关联用户查询的唯 一 标识 -->
    <id column="id" property="id" />
    <result column="user_id" property="userId" />
    <result column="number" property="number" />
    <result column="createtime" property="createtime" />
    <result column="note" property="note" />
    <!-- 配置用户信息的延迟加载 select:延迟加载执行的sql所在的statement的id,如果不在同一个namespace需要加namespace
      sql:根据用户id查询用户信息 column:关联查询的列 property:将关联查询的用户信息设置到Orders的哪个属性 -->
    <association property="user"
      select="com.sihai.mybatis.mapper.UserMapper.findUserById" column="user_id"></association> 

  </resultMap>

 3.4 mapper.java

//一对一查询,延迟加载
  public List<Orders> findOrderUserListLazyLoading() throws Exception; 

3.5 测试代码

// 一对一查询延迟加载
  @Test
  public void testFindOrderUserListLazyLoading() throws Exception { 

    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 创建mapper代理对象
    OrdersMapperCustom ordersMapperCustom = sqlSession
        .getMapper(OrdersMapperCustom.class); 

    // 调用方法
    List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading(); 

    //这里执行延迟加载,要发出sql
    User user = list.get(0).getUser();
    System.out.println(user); 

  }

4 resultType、resultMap、延迟加载使用场景总结

4.1 延迟加载:

延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。
mybatis提供延迟加载的功能用于service层。

4.2 resultType:

作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

4.3 resultMap:

使用association和collection完成一对一和一对多高级映射。

4.4 association:

作用:将关联查询信息映射到一个pojo类中。

场合:为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。

4.5 collection:

作用:将关联查询信息映射到一个list集合中。

场合:为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis中的延迟加载案例解析

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

  • Mybatis查询延迟加载详解及实例

    Mybatis查询延迟加载详解及实例 1.1     启用延迟加载 Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来.Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来.开启延迟加载有两种方式. 第一种是在对应的<collection>或<association>标签上指定fetchType属性值为"lazy".如下示例中我们

  • mybatis教程之延迟加载详解

    延迟加载 1 使用延迟加载意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载. mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载. 2 配置mybatis支持延迟加载 在 SqlMapConfig.xml中配置全局参数: <!-- 全局配置参数 --> <settings> <

  • Mybatis中 XML配置详解

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <

  • MyBatis 中 SqlMapConfig 配置文件详解

    0x00:文件介绍 在 WEB 工程中,对于 MyBatis 最核心的全局配置文件是 SqlMapConfig.xml 文件,其中包含了数据库的连接配置信息.Mapper 映射文件的加载路径.全局参数.类型别名等. 0x01:配置项详解 configuration:包裹所有配置标签,是整个配置文件的顶级标签. properties:属性,该标签可以引入外部配置的属性,也可以自己配置.该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性. setting:全局配置参数,用来配置一些改变

  • MyBatis的foreach语句详解

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collectio

  • mybatis分页插件pageHelper详解及简单实例

    mybatis分页插件pageHelper详解及简单实例 工作的框架spring springmvc mybatis3 首先使用分页插件必须先引入maven依赖,在pom.xml中添加如下 <!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5

  • Mybatis映射文件实例详解

     一.输入映射 parameterType 指定输入参数的Java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.传递简单类型 根据用户ID查询用户信息: <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id

  • springmvc与mybatis集成配置实例详解

    简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.ve

  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    一.添加所需依赖,当前完整的pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&q

  • es6系列教程_ Map详解以及常用api介绍

    ECMAScript 6中的Map类型是一种存储着许多键值对的有序列表.键值对支持所有的数据类型. 键 0 和 '0'会被当做两个不同的键,不会发生强制类型转换. 如何使用Map? let map = new Map(); 常用方法: set( 键,值 ): 添加新的键值对元素 get( 键 ): 获取键对应的值,如果这个值不存在,返回undefined let map = new Map(); map.set( '0', 'ghostwu' ); map.set( 0, 'ghostwu' )

随机推荐