ホームページ  >  記事  >  Java  >  MyBatis の遅延読み込みサンプルの詳細な説明

MyBatis の遅延読み込みサンプルの詳細な説明

零下一度
零下一度オリジナル
2017-06-25 10:38:131294ブラウズ

1.遅延ロードとは

resultMapは高度なマッピングを実装できます(アソシエーションとコレクションを使用して1対1および1対多のマッピングを実現します)、アソシエーションとコレクションには遅延ロード機能があります。

要件:

注文をクエリし、クエリのユーザー情報を関連付ける場合。最初に注文情報を照会すると、ユーザー情報を照会する必要がある場合に、ユーザー情報を確認することができます。オンデマンドでのユーザー情報のクエリは遅延読み込みです。

遅延読み込み: 最初に単一テーブルからクエリを実行し、次に必要に応じて関連テーブルから関連クエリを実行します。これにより、単一テーブルのクエリの方が、複数のテーブルを関連してクエリするよりも高速になるため、データベースのパフォーマンスが大幅に向上します。

2. アソシエーションを使用して遅延読み込みを実装する

2.1 要件

アソシエーションによる順序のクエリとユーザー情報のクエリ

2.2mapper.xml

2 つのマッパー メソッドに対応するステートメントを定義する必要があります。

(1) 注文情報のみをクエリ

SELECT * FROM order

注文をクエリするステートメントで関連付けを使用して、次のステートメント(ユーザー情報を関連付けクエリ)の読み込み(実行)を遅らせます。

    <!-- 查询订单关联查询用户  --><select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">SELECT * FROM orders</select>

(2) 関連付けによるユーザー情報のクエリ

上記でクエリした注文情報の user_id を使用してユーザー情報をクエリします

UserMapper.xml の findUserById を使用します

    <select id="findUserById" parameterType="int" resultType="user">select * from user where id=#{value}</select>

必要な場合は、最初に findOrdersUserLazyLoading を実行します。ユーザーにクエリを実行し、fingUserById を実行し、resultMap の定義を通じて遅延読み込みの実行を構成します。

2.3 resultMapの遅延ロード

遅延ロードで実行するステートメントのIDを指定するには、selectを関連付けて使用します。

    <!-- 延迟加载的resultMap  --><resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap"><!-- 1.对订单信息进行映射配置 --><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/><!-- 2.实现对用户信息进行延迟加载 --><!-- select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 
               要使用UserMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,
               如果findUserById不在本mapper中需要前边加namespace。
             column:订单信息中关联用户信息查询的列,是user_id
              关联查询的sql理解为:
             SELECT orders.*,
                (SELECT username FROM USER WHERE orders.user_id = user.id)username,
                (SELECT sex FROM USER WHERE orders.user_id = user.id)sex
             FROM orders--><association property="user" javaType="joanna.yan.mybatis.entity.User"select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id"></association></resultMap>
E42.4Mapper.java
rreee

2.5 テスト
2.5.1 テストのアイデア

(1) Mapper メソッド (FindOrdersuserlazyloading) を実行し、findOrdersUserLazyLoading 内で Joanna.yan.mybatis.OrderscustomMapper を呼び出し、注文情報のみをクエリします (独身テーブル)。

(2) プログラム内で、前のステップでクエリされた List を走査すると、Orders で getUser() が開始されます。

(3) 読み込みを遅らせ、UserMapper.xmlのfindUserByIdメソッドを呼び出してユーザー情報を取得します。

2.5.2 遅延読み込み設定

mybatis はデフォルトでは遅延読み込みを有効にしないため、SqlMapConfig.xml で設定する必要があります。

mybatisコア設定ファイルで設定:

lazyLoadingEnabled、aggressiveLazyLoading

設定項目lazyLoadingEnabledSqlMapConfig.xmlで構成: (2) ユーザーIDに基づいてユーザー情報をクエリします

説明

許可される値

デフォルト値

遅延読み込みをグローバルに設定します。 「false」に設定すると、関連するすべてのものが最初にロードされます。 「true」に設定すると、遅延ロードされたオブジェクトは遅延属性で完全にロードされる可能性があります。それ以外の場合、各プロパティはオンデマンドでロードされます。

tru​​e | false

tru​​e

    //查询订单关联查询用户,用户信息时延迟加载public List<Orders> findOrdersUserLazyLoading() throws Exception;

2.5.3 テストコード
     <!-- 全局配置参数,需要时再设置  --> <settings> <!-- 打开延迟加载的开关  --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载改为消极加载即按需要加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>

2. 遅延読み込みに関する 6 つの考え
提供されていませんby mybatis アソシエーションとコレクションで遅延読み込みを実装するにはどうすればよいですか?

実装方法は以下のとおりです:
2つのマッパーメソッドを定義します:

(1) 注文リストをクエリします
実装のアイデア: 最初に最初のマッパーメソッドをクエリして取得します注文情報リスト

テスト プログラムでは、必要に応じて 2 番目のマッパー メソッドを呼び出して、ユーザー情報をクエリします。
つまり、遅延読み込み方法を使用して、最初に単純な SQL (できれば単一のテーブルですが、関連するクエリも) をクエリし、次に必要に応じて関連するクエリの他の情報を読み込みます。

以上がMyBatis の遅延読み込みサンプルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。