遅延読み込みと即時読み込み

基本概念

  1. 問題:1対多では、1人のユーザーがいる場合、100人のユーザーがいます
    1. ユーザーにクエリを実行するときに、関連付けられているアカウントを確認しますか?
    2. アカウントについて問い合わせるときに、関連するユーザーを確認しますか?
  2. 遅延読み込みとは
    1. クエリは、データが実際に使用されているときに開始され、使用されていないときは開始されません。オンデマンド読み込み(遅延読み込み)
  3. 即時読み込みとは
    1. 使用されているかどうかに関係なく、メソッドが呼び出されている限り、クエリはすぐに開始されます
  4. 4つのリレーショナルテーブルに対応
    1. 1対多、多対多:通常は遅延読み込みを使用します
    2. 多対1、1対1:通常は即時読み込みを使用します

1対1の遅延読み込み

  1. メイン構成ファイルSqlMapConfig.xmlに設定を追加します
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  1. アカウントの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対多の遅延読み込み

  1. アカウントの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