MyBatis_delay 読み込み関連付けと LazyLoadingEnabled の詳細な説明

1. 遅延読み込み

遅延読み込みの中心原則
は、平たく言えば、クエリ ステートメントが使用されるときに実行するということです。使用していないときはクエリを行わないでください。

役割: パフォーマンスを向上させます。できるだけチェックしない、またはできるだけチェックしない。効率を向上させるために。

2. 遅延読み込みを有効にする 2 つの方法

(1) 部分的な遅延ロード
mybatis の関連タグに fetchType="lazy" を追加します。
注:
遅延ロードはデフォルトでは有効になっていません。設定する必要があります: fetchType="lazy"
関連タグ内の fetchType="lazy" のこの設定はローカル設定であり、現在の関連付けに関連付けられた sal ステートメントでのみ機能します。

2) グローバルな遅延ロード
実際の開発では、ほとんどの開発で遅延ロードを使用する必要があるため、すべての遅延ロード メカニズムを有効にすることをお勧めします。mybatis コア設定ファイルにグローバル設定を追加します
: LazyLoadingEnabled=true

実際の開発のモード:
グローバル遅延読み込みをオンにします。
ステップで遅延読み込みを使用する必要がない場合は、 fetchType="eager" を設定してください。

3. ローカル遅延ロード fetchType="lazy"

関連タグでの fetchType="lazy" の構成はローカル設定であり、
現在の関連付けに関連付けられた sal ステートメントでのみ機能します。

コードは次のとおりです:
StuMapper インターフェイス

public interface StuMapper {
    
    
	public Stu selectBySidStep1(Integer sid);
}

ClazzMapper インターフェース

public interface ClazzMapper {
    
    
    public Clazz selectByCidStep2(Integer cid);
}

StuMapper.xml ファイル

<?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.powernode.mybatis.mapper.StuMapper">
    <!--分步骤查询-->
    <resultMap id="selectBySidStepMap" type="Stu">
        <id property="sid" column="sid"/>
        <result property="name" column="name"/>
        <association property="clazz"
                     select="com.powernode.mybatis.mapper.ClazzMapper.selectByCidStep2"
                     column="cid"
                     fetchType="lazy"
        />
    </resultMap>
    <select id="selectBySidStep1" resultMap="selectBySidStepMap">
        select s.sid,s.name,s.cid from t_stu s
        where s.sid = #{
    
    sid}
    </select>

</mapper>

テストクラスのケース 1: Student クラス オブジェクトの toString() メソッドを呼び出す

@Test
    public void testAdvanceMappingStep(){
    
    
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectBySidStep1(1);
        System.out.println(stu.toString());

操作の結果、2つのインターフェースに対応したSQLが実行されていることが分かりました。

StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
StuMapper.selectBySidStep1 - <==      Total: 1
ClazzMapper.selectByCidStep2 - ==>  Preparing: select * from t_clazz where cid = ?
ClazzMapper.selectByCidStep2 - ==> Parameters: 1000(Integer)
ClazzMapper.selectByCidStep2 - <==      Total: 1
Stu{
    
    sid=1, name='张三', clazz=Clazz{
    
    cid=1000, name='高三一班'}}

テスト クラス ケース 2: Student クラス オブジェクトの getName() メソッドを呼び出す

@Test
    public void testAdvanceMappingStep(){
    
    
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectBySidStep1(1);
        System.out.println(stu.getName());

操作の結果、SQL は 1 つだけ実行されたことがわかり、遅延読み込みが有効になったことを示しています。

StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
StuMapper.selectBySidStep1 - <==      Total: 1
张三

テスト クラス ケース 3: 最初に Student クラス オブジェクトの getName() メソッドを呼び出し、次にクラス属性メソッド getClazz() を呼び出します。

@Test
    public void testAdvanceMappingStep(){
    
    
        SqlSession sqlSession = SqlSessionUtil.openSqlSession();
        StuMapper mapper = sqlSession.getMapper(StuMapper.class);
        Stu stu = mapper.selectBySidStep1(1);
        System.out.println(stu.getName());
        System.out.println(stu.getClazz());

操作の結果、SQL文は呼び出されたときのみ実行されることがわかり、遅延読み込みの設定効果を再度検証しました。

StuMapper.selectBySidStep1 - ==>  Preparing: select s.sid,s.name,s.cid from t_stu s where s.sid = ?
StuMapper.selectBySidStep1 - ==> Parameters: 1(Integer)
StuMapper.selectBySidStep1 - <==      Total: 1
张三
ClazzMapper.selectByCidStep2 - ==>  Preparing: select * from t_clazz where cid = ?
ClazzMapper.selectByCidStep2 - ==> Parameters: 1000(Integer)
ClazzMapper.selectByCidStep2 - <==      Total: 1
Clazz{
    
    cid=1000, name='高三一班'}

4. グローバル遅延ロード LazyLoadingEnabled=true

グローバル遅延ロードを実装したい場合は、 mybatis コア設定ファイルに
グローバル設定を追加するだけです:
LazyLoadingEnabled=true

具体的な構成は次のとおりです。

<?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>
    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.powernode.mybatis.pojo" />
    </typeAliases>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.powernode.mybatis.mapper"/>
    </mappers>
</configuration>

5.lazyLoadingEnabledに関する補足説明

LazyLoadingEnabled はデフォルトで false です。有効にする必要があります

mybatis3.4.1 およびそれ以前のバージョンでは、遅延ロードを有効にしている場合、lazyLoadingEnabled が true である場合、aggressiveLazyLoading のデフォルト値が true であるため、すべてをロードすることが強制されるため、表示されません。 false に設定すると、遅延ロード LayLoadingEnabled が機能しなくなります。

mybatis 3.4.1 以降のバージョンでは、aggressiveLazyLoading のデフォルト値は false であるため、遅延ロード LazyLoadingEnabled を有効にする場合は、lazyLoadingEnabled を true に設定するだけで済み、aggressiveLazyLoading を false に設定する必要はなくなりました。

gressiveLazyLoading が true の場合は、属性呼び出しが関連付けられたクエリをトリガーすることを意味し、
false の場合は、対応する属性が読み込まれた場合にのみ、関連付けられたクエリがトリガーされることを意味します

おすすめ

転載: blog.csdn.net/chuige2013/article/details/129917569