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 の場合は、対応する属性が読み込まれた場合にのみ、関連付けられたクエリがトリガーされることを意味します