mybatis入门基础(七)----延迟加载

一、什么是延迟加载

  resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

需求:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

二、使用association实现延迟加载

需要定义两个mapper的方法对应的statement。

1、只查询订单信息

  SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)

2、关联查询用户信息

  通过上边查询到的订单信息中user_id去关联查询用户信息

OrderMapper.xml的延迟加载的核心代码:

  使用association中的select指定延迟加载去执行的statement的id。

    <!-- 查询订单关联查询用户,用户信息按需延迟加载 的 resultMap定义 -->
    <resultMap type="com.mybatis.entity.Orders" id="ordersUserLazyLoading">
                <!--对订单信息进行映射配置  -->
            <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:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
                column:订单信息中关联用户信息查询的列,是user_id
                关联查询的sql理解为:
                 SELECT orders.*,
                    (SELECT username FROM USER WHERE orders.user_id = user.id)username,
                    (SELECT sex FROM USER WHERE orders.user_id = user.id)sex
                 FROM orders
            -->
            <association property="user"  javaType="com.mybatis.entity.User" select="findUserById" column="user_id"/>
    </resultMap>
        <!-- 根据Id查询用户,用于测试延迟加载 -->
        <select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User" >
                select * from t_user where id=#{id}
        </select>
    <!-- 查询订单关联用户,用户信息延迟加载 -->
    <select id="findOrdersUserLazyLoading" resultMap="ordersUserLazyLoading">
            select * from orders
    </select>    

OrderMapper.java的代码:

public interface OrdersCustomMapper {
    /**查询订单,关联查询用户,用户按需延迟加载*/
    public List<Orders>findOrdersUserLazyLoading();
    /**根据Id查询用户(这个方法本应该放在UserMapper类的,测试方便先放在这)*/
    public User findUserById(int id);
}

测试思路及代码:

1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。

2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。

3、延迟加载,去调用findUserbyId这个方法获取用户信息。

// 查询用户关联查询用户,用户信息延迟加载
        @Test
        public void TestFindOrdersUserLazyLoading() {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
            // 调用mapper的方法
            List<Orders> list = oc.findOrdersUserLazyLoading();
            for(Orders order: list){
                //执行getUser()去查询用户信息,这里实现延迟加载
                User user = order.getUser();
                System.out.println(user);
            }
            sqlSession.close();
        }

三、延迟加载在mybatis核心配置文件sqlMapConfig.xml中的配置

mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。

在mybatis核心配置文件中配置:

    lazyLoadingEnabled、aggressiveLazyLoading


设置项


描述


允许值


默认值


lazyLoadingEnabled


全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。


true | false


false


aggressiveLazyLoading


当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。


true | false


true

<!-- 全局参数的配置 -->
    <settings>
            <!--打开延迟加载的开关  -->
        <setting name="lazyLoadingEnabled" value="true"/>
            <!--将积极加载改为消极加载及按需加载  -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

小结:使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

时间: 2024-10-08 10:04:04

mybatis入门基础(七)----延迟加载的相关文章

mybatis入门基础(二)----原始dao的开发和mapper代理开发

阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先苦后甜嘛! 回到顶部 一:原始dao开发方法 概要:1.在上篇中搭建好的框价中编写dao接口和dao实现类 2.向dao接口实现类中注入SqlSessionFactory,在方法体内通过SqlSe

框架 day65 Mybatis入门(基础知识:框架原理,入门[curd],开发dao层,全局与映射配置)

Mybatis 基础知识(一) 第一天:基础知识(重点) mybatis介绍 mybatis框架原理(掌握) mybaits入门程序(掌握) 用户信息进行增.删.改.查 mybatis开发dao层方法:(掌握) 原始dao开发方法(dao接口和实现类需要程序员编写) mapper代理开发方法(程序员只需要编写接口) SqlMapConfig.xml(mybatis全局配置文件)(掌握) mybatis输入映射(掌握) mybatis输出映射(掌握) mybatis动态sql(掌握)   1   

MyBatis入门基础(一)

一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记录于此,方便大家参考,也方便自己查阅. 话不多说,先看看原始的JDBC程序代码,看看这样的代码存在什么问题. package com.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.P

mybatis入门(七)

mybatis入门--添加一个用户 //添加用户 @Test public void insertUserTest() throws IOException { // 通过工厂得到SqlSession SqlSession sqlSession = null; try { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResou

mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT

mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

阅读目录 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 二:properties属性 三:settings全局参数配置 四:typeAiases(别名)--重点掌握 五:typeHandlers(类型处理器) 六:mappers(映射配置) 回到顶部 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器) objectFactor

【入门详解】MyBatis入门基础详解

什么是mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:1. 从配置文件(通常是XML配置文件中)得到 sess

mybatis入门基础(四)----输入映射和输出映射

阅读目录 一:输入映射 二:输出映射 回到顶部 一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 1.1.1.需求描述 完成用户信息的综合查询,需要传入的查询条件可能很复杂(可能包括用户信息,其它信息,比如,商品,订单等等). 1.1.2.定义包装类型的pojo 针对上边的需求,建议使用自定义的包装类型pojo,在包装类型的pojo中将复杂的查询条件包装进去. 包装查询条件的pojo类User

mybatis入门基础----动态SQL

原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询