Mybatisでの1対1、1対多、および多対多の関係の構成と実装により、オブジェクトの関連付けクエリを実現できます。 実際の開発プロセスでは何度も、ユーザー情報をロードするときに彼のアカウント情報を常にロードする必要はありません。 これを遅延読み込みと呼びます。
1.1遅延読み込みとは何ですか?
遅延読み込み:
データが必要な場合にのみ読み込まれ、データが不要な場合は読み込まれません。 遅延読み込みは遅延読み込みとも呼ばれます。
利点:最初に単一のテーブルからクエリを実行し、必要に応じて関連テーブルからクエリを実行します 。 単一のテーブルのクエリは、クエリに関連する複数のテーブルよりも高速であるため、データベースのパフォーマンスが大幅に向上します 。
短所:データベースクエリはデータが必要な場合にのみ実行されるため、大量のデータをクエリする場合、クエリの作業にも時間がかかるため、ユーザーの待機時間が長くなり、ユーザーエクスペリエンスが低下する可能性があります。
1.2実装要件
要件:
アカウント情報をクエリし、ユーザー情報を関連付けます。 要件を満たすためにアカウント情報を照会できる場合は、ユーザー情報を照会する必要はありません。ユーザー情報を照会する必要がある場合は、ユーザー情報が照会されます。 オンデマンドでユーザー情報を照会するのは遅延読み込みです。
mybatisが3日目にマルチテーブル操作を実装したとき、私たちは以前 resultMap
、1対 1、1対多 、および多対多の関係操作を実装していました。 主に、 association、collection
1対1および1対多のマッピングを実装します。 関連とコレクションには遅延読み込み機能があります。
1.3関連付けを使用して遅延読み込みを実装する
要件:アカウント情報とユーザー情報をクエリします。
アカウント永続化レイヤーDAOインターフェイス
public interface IAccountDao {
List< Account> findAll ( ) ;
}
アカウント永続化レイヤーマッピングファイル
< 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のフィールド名として書き込まれます
ユーザーの永続化レイヤーインターフェイスとマッピングファイル
public interface IUserDao {
User findById ( Integer userId) ;
}
< mapper namespace = " cn.myp666.dao.IUserDao" >
< select id = " findById" resultType = " user" parameterType = " int" >
select * from user where id = #{uid}
</ select>
</ mapper>
Mybatisの遅延読み込み戦略をオンにする
Mybaitsの公式ドキュメントを入力し、設定の説明を見つけます。
Mybatis構成ファイルのSqlMapConfig.xmlファイルに遅延読み込み構成を追加する必要があります。
< settings>
< setting name = " lazyLoadingEnabled" value = " true" />
< setting name = " aggressiveLazyLoading" value = " false" />
</ settings>
遅延読み込みにコレクションを使用する
同様に、1対多の関係構成のノードで遅延読み込み戦略を構成することもできます。 <collection>
ノードには選択属性と列属性もあります。
要件:ユーザーオブジェクトが読み込まれたときに、ユーザーが所有するアカウント情報をクエリします。
リスト<アカウント>属性をユーザーエンティティクラスに追加する
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;
ユーザーとアカウントの永続化レイヤーインターフェイスを作成する方法
List< User> findAll ( ) ;
List< Account> findByUid ( Integer uid) ;
ユーザー永続性レイヤーマッピング構成の記述
< 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 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フィールド名として書き込まれます。
アカウント永続性レイヤーマッピング構成の記述
< select id = " findByUid" resultType = " account" parameterType = " int" >
select * from account where uid = #{uid}
</ select>