延迟加载和立即加载

基本概念

  1. 问题:在一对多中,当我们有一个用户,它有100个用户
    1. 在查询用户的时候,要不要把关联的账户查出来?
    2. 在查询账户的时候,要不要把关联的用户查出来
  2. 什么是延迟加载
    1. 在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
  3. 什么是立即加载
    1. 不管用不用,只要一调用方法,马上发起查询
  4. 对应的四种关系表中
    1. 一对多,多对多:通常情况下我们都是采用延迟加载
    2. 多对一,一对一:通常情况下我们都是采用立即加载

一对一延迟加载

  1. 在主配置文件SqlMapConfig.xml中添加设置
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  1. 修改Account的resultMap
<?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="dao.AccountDao">
    <resultMap id="accountUserMap" type="domain.Account">
        <id property="id" column="id"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射,配置封装user的内容-->
        <association property="mybatisUser" column="uid" javaType="domain.MybatisUser" select="dao.UserDao.findUserById">
        </association>
    </resultMap>
    <!--查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        SELECT * FROM ACCOUNT ;
    </select>
</mapper>
  1. AccountDao.xml中编写查询所有账户的sql语句
<select id="findAll" resultMap="accountUserMap">
    SELECT * FROM ACCOUNT ;
</select>
  1. UserDao.xml中编写查询账户对应用户的sql语句
<select id="findUserById" parameterType="int" resultType="domain.MybatisUser">
    SELECT * FROM mybatisuser  WHERE id=#{
    
    uid};
</select>
  1. 执行的sql语句

    1. 若只查询账户
    public void testFindAll(){
          
          
        List<Account> accounts = accountDao.findAll();
    }
    

    在这里插入图片描述

    1. 若需要查询账户及账户所属用户信息
    public void testFindAll(){
          
          
        List<Account> accounts = accountDao.findAll();
    
        for (Account account : accounts){
          
          
            System.out.println("账户"+account.getId()+"----------------------------");
            System.out.println(account);
            System.out.println(account.getMybatisUser());
        }
    }
    

    在这里插入图片描述

一对多延迟加载

  1. 修改Account的resultMap
<resultMap id="userAccountMap" type="domain.UserAccount">
    <id property="id" column="id"></id>
    <result property="username" column="username"></result>
    <result property="birthday" column="birthday"></result>
    <result property="sex" column="sex"></result>
    <result property="address" column="address"></result>
    <!--一对多的关系映射,配置UserAccount对象中accounts集合的内容-->
    <collection property="accounts" ofType="domain.Account" column="id" select="dao.AccountDao.findAccountByUid"></collection>
</resultMap>
  1. UseDao.xml中编写查询所有用户的sql语句
<select id="findAll" resultMap="userAccountMap">
    SELECT * FROM mybatisuser;
</select>
  1. AccountDao.xml中编写查询用户下的账户的sql语句
<select id="findAccountByUid" parameterType="int" resultType="domain.Account">
    select * from account where uid=#{
    
    id};
</select>
  1. 执行结果
    1. 只查询所有用户
     public void testFindAll(){
          
          
         List<UserAccount> users = userDao.findAll();
     }
    

在这里插入图片描述

  1. 查询用户,同时获得用户的所有账户信息
 public void testFindAll(){
    
    
     List<UserAccount> users = userDao.findAll();

     for (UserAccount user : users){
    
    
         System.out.println("用户"+user.getId()+"--------------------");
         System.out.println(user);
         System.out.println(user.getAccounts());
     }
 }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40857365/article/details/112849426