Mybatis_day4_Mybatisの遅延読み込み

  • Mybatisでの1対1、1対多、および多対多の関係の構成と実装により、オブジェクトの関連付けクエリを実現できます。実際の開発プロセスでは何度も、ユーザー情報をロードするときに彼のアカウント情報を常にロードする必要はありません。これを遅延読み込みと呼びます。


1.1遅延読み込みとは何ですか?

  • 遅延読み込み:
    • データが必要な場合にのみ読み込まれ、データが不要な場合は読み込まれません。遅延読み込みは遅延読み込みとも呼ばれます。
  • 利点:最初に単一のテーブルからクエリを実行し、必要に応じて関連テーブルからクエリを実行します
    単一のテーブルのクエリは、クエリに関連する複数のテーブルよりも高速であるため、データベースのパフォーマンスが大幅に向上します
  • 短所:データベースクエリはデータが必要な場合にのみ実行されるため、大量のデータをクエリする場合、クエリの作業にも時間がかかるため、ユーザーの待機時間が長くなり、ユーザーエクスペリエンスが低下する可能性があります。

1.2実装要件

  • 要件:
  • アカウント情報をクエリし、ユーザー情報を関連付けます。要件を満たすためにアカウント情報を照会できる場合は、ユーザー情報を照会する必要はありません。ユーザー情報を照会する必要がある場合は、ユーザー情報が照会されます。オンデマンドでユーザー情報を照会するのは遅延読み込みです。
  • mybatisが3日目にマルチテーブル操作を実装したとき、私たちは以前resultMap、1対1、1対多、および多対多の関係操作を実装していました。主に、association、collection1対1および1対多のマッピングを実装します。関連とコレクションには遅延読み込み機能があります。

1.3関連付けを使用して遅延読み込みを実装する

  • 要件:アカウント情報とユーザー情報をクエリします。
  1. アカウント永続化レイヤーDAOインターフェイス
public interface IAccountDao {
/**
* 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
* @return
*/
List<Account> findAll();
}

  1. アカウント永続化レイヤーマッピングファイル
<mapper namespace="cn.myp666.dao.IAccountDao">
<!-- 建立对应关系 -->
	<resultMap type="account" id="accountMap">
		<id column="aid" property="id"/>
		<result column="uid" property="uid"/>
		<result column="money" property="money"/>
		<!-- 它是用于指定从表方的引用实体属性的 -->
		<association property="user" javaType="cn.myp666.domain.user"
			select="cn.myp666.dao.IUserDao.findById"
column="uid">
		</association>
	</resultMap>
	
<select id="findAll" resultMap="accountMap">
	select * from account
</select>
</mapper>
  • select属性:
    ユーザーリストをクエリするSQLステートメントを指定するために使用されるため、SQLマップのIDを入力します
  • column属性:
    select属性のsqlステートメントのパラメーターソースを指定するために使用されます。上記のパラメーターはアカウントのuid列から取得されるため、uidのフィールド名として書き込まれます

  1. ユーザーの永続化レイヤーインターフェイスとマッピングファイル
public interface IUserDao {
/**
* 根据 id 查询
* @param userId
* @return
*/
User findById(Integer userId);
}
<mapper namespace="cn.myp666.dao.IUserDao">
<!-- 根据 id 查询 -->
	<select id="findById" resultType="user" parameterType="int" >
		select * from user where id = #{uid}
	</select>
</mapper>

  1. Mybatisの遅延読み込み戦略をオンにする
  • Mybaitsの公式ドキュメントを入力し、設定の説明を見つけます。
    ここに画像の説明を挿入
  • Mybatis構成ファイルのSqlMapConfig.xmlファイルに遅延読み込み構成を追加する必要があります。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>


遅延読み込みにコレクションを使用する

  • 同様に、1対多の関係構成のノードで遅延読み込み戦略を構成することもできます。<collection>ノードには選択属性と列属性もあります。
  • 要件:ユーザーオブジェクトが読み込まれたときに、ユーザーが所有するアカウント情報をクエリします。
  1. リスト<アカウント>属性をユーザーエンティティクラスに追加する
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<Account> accounts;

public List<Account> getAccounts() {
	return accounts;
}
public void setAccounts(List<Account> accounts) {
	this.accounts = accounts;

  1. ユーザーとアカウントの永続化レイヤーインターフェイスを作成する方法
List<User> findAll();
/**
* 根据用户 id 查询账户信息
* @param uid
* @return
*/
List<Account> findByUid(Integer uid);

  1. ユーザー永続性レイヤーマッピング構成の記述
<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="cn.myp666.dao.IAccountDao.findByUid"
		column="id">
	</collection>
</resultMap>

<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
	select * from user
</select>
  • <collection>タグ:
    主に、関連するコレクションオブジェクトをロードするために使用されます
  • select属性:
    アカウントリストをクエリするSQLステートメントを指定するために使用されるため、SQLマップのIDを入力します
  • column属性:
    select属性のsqlステートメントのパラメーターソースを指定するために使用されます。上記のパラメーターはユーザーのid列から取得されるため、idフィールド名として書き込まれます。

  1. アカウント永続性レイヤーマッピング構成の記述
<!-- 根据用户 id 查询账户信息 -->
<select id="findByUid" resultType="account" parameterType="int">
	select * from account where uid = #{uid}
</select>
元の記事94件を公開 称賛された0 2097を訪問

おすすめ

転載: blog.csdn.net/qq_16836791/article/details/104800191