九点钟☆方向

记录成长点滴

欢迎来到我的个人博客~


Mybatis笔记(九) Mybatis延迟加载策略

目录

什么是延时加载

延迟加载:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.

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

坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。

延时加载

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

可以通过在Mybatis的主配置文件中配置,显示相关的执行信息,来测试延迟加载

<setting name="logImpl" value="STDOUT_LOGGING"/>

使用 association实现延迟加载

  1. 账户类Account

    public class Account implements Serializable {
        private Integer id;
        private Integer uid;
        private Double money;
        //加入User类的引用,单个关系
    	private User user;
        //生成set/get
    }
    
  2. 账户的持久层 DAO 接口

    public interface IAccountMapper {
    /**
    * 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
    * @return
    */
    List<Account> findAll();
    }
    
  3. 账户的持久层映射文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mg.dao.IAccountMapper">
        <!-- 建立对应关系 -->
        <resultMap type="account" id="accountMap">
            <id column="aid" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
            <!-- 这里通过select和column属性,指定调用哪个方法,并且传递什么参数 -->
            <association property="user" javaType="user" select="com.mg.dao.IUserMapper.findById" 			column="uid">
            </association>
        </resultMap>
           
        <select id="findAll" resultMap="accountMap">
        	select * from account
        </select>
    </mapper>
    select: 填写我们要调用的 select 映射的 id。   值为namespace+id
    column : 填写我们要传递给 select 映射的参数。也就是那一列作为参数进行传递
    
  4. 用户类User

    public class User implements Serializable {
            private Integer id;
            private String username;
            private Date birthday;
            private String sex;
            private String address;
        	//生成set/get
    }
    
  5. 用户的持久层接口

    public interface IUserMapper {
        /**
        * 根据 id 查询
        * @param userId
        * @return
        */
        User findById(Integer userId);
    }
    
  6. 用户映射配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mg.dao.IUserMapper">
        <!-- 根据 id 查询 -->
        <select id="findById" resultType="user" parameterType="int" >
        	select * from user where id = #{uid}
        </select>
    </mapper>
    
  7. 开启 Mybatis 的延迟加载策略

    我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置

    <!-- 开启延迟加载的支持 -->
    <settings>
        <!--延迟加载的全局开关,开启时所有关联对象都会延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--开启时任何方法的调用都会加载该对象的所有属性,3.4.1版本后默认为false-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    

使用 Collection 实现延迟加载

同样我们也可以在一对多关系配置的collection结点中配置延迟加载策略。collection节点中也有 select 属性, column 属性。

  1. 用户类User

    public class User implements Serializable {
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;
        private List<Account> accounts;
        //生成set/get
    }
    
  2. 用户dao接口

    public interface IUserMapper {
        List<User> findAll();
    }
    
  3. 用户持久层配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mg.dao.IUserMapper">
        <resultMap type="user" id="userMap">
            <id column="id" property="id"></id>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
            <!-- collection 是用于建立一对多中集合属性的对应关系
            ofType 用于指定集合元素的数据类型
            select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
            column 是用于指定使用哪个字段的值作为条件查询
            -->
            <collection property="accounts" ofType="account"
            select="com.mg.dao.IAccountMapper.findByUid" column="id">
            </collection>
        </resultMap>
        <!-- 配置查询所有操作 -->
        <select id="findAll" resultMap="userMap">
            select * from user
        </select>
    </mapper>
       
    collection标签:主要用于加载关联的集合对象
    select 属性:用于指定查询 account 列表的 sql 语句,值是该sql映射的namespace+id
    column 属性:用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一个字段名了
    
  4. 账户类Account

    public class Account implements Serializable {
        private Integer id;
        private Integer uid;
        private Double money;
        //生成set/get
    }
    
  5. 账户Dao接口

    public interface IAccountMapper {
    	List<Account> findByUid(Integer uid);
    }
    
  6. 账户映射配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mg.dao.IAccountMapper">
        <!-- 根据用户 id 查询账户信息 -->
        <select id="findByUid" resultType="account" parameterType="int">
            select * from account where uid = #{uid}
        </select>
    </mapper>
    
  7. 开启 Mybatis 的延迟加载策略

    我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置

    <!-- 开启延迟加载的支持 -->
    <settings>
        <!--延迟加载的全局开关,开启时所有关联对象都会延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--开启时任何方法的调用都会加载该对象的所有属性,3.4.1版本后默认为false-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦