多くのでは、我々はユーザーを持って、彼は100個のアカウントを持っている:最初に、問題、仮説について考えてみましょう。
質問1:ユーザーのクエリは、関連するアカウントがチェックアウトする必要があるのでしょうか。
質問2:クエリアカウントに関連するユーザーがチェックアウトしたいですか?
ANSWER:ときにユーザーのクエリ、クエリを実行するとき、我々は、使用する必要がありますどのような時にユーザーのアカウント情報。
場合は、チェックアカウント、ユーザーアカウント情報は時に一緒に口座照会としてチェックアウトする必要があります。
これらの2つの簡単な質問を考え出すした後、我々はすぐに遅延ロードおよび負荷特性につながることができます。
レイジーロード:データのみを使用してリアルタイムで問い合わせが開始し、データが関連付けられていないときも、遅延ロードの需要クエリ(遅延ロード)として知られていないクエリ、
負荷は今:使用しているか否か、限りメソッドが呼び出されるよう、直ちに調査を開始します。
使用シナリオ:対応関係テーブル4、1対多数の一般的な一に、多くの遅延ローディングを使用し、一方は通常、直ちにロードを使用します。
MyBatisの設定ファイルでは、MyBatisのクエリメソッドの遅延ロードの負荷特性の後に遅延を達成する方法を理解見てはlazyLoadingEnabledプロパティ設定を設定することにより、真のグローバル遅延読み込みに開いていた、とプロパティをaggressiveLazyLoadingことで、すぐに負荷を開きます。導入の公式サイトを見て、その後の例では、我々はテーブル間の次対多の関係を示し、1つのインスタンスで遅延ロードMyBatisのを実装するために、機能的なアカウント情報の実現を通じて、クエリ、ユーザー情報が同時にユーザに問い合わせることは何遅延を示すことがありますロードとロードの結果の実施を遅らせ、すぐに異なっをロードします。
lazyLoadingEnabled | 遅延グローバルスイッチロード。オンにすると、すべての関連付けは、ロードを遅延されます。特定協会によって提供されていてもよい fetchType 性のスイッチング状態を覆います。 | 真| 偽 | 偽 |
aggressiveLazyLoading | オンにすると、任意のメソッド呼び出しは、すべてのオブジェクトのプロパティをロードします。そうでない場合は、各プロパティには、(参照してください。オンデマンドでロードされます lazyLoadTriggerMethodsを)。 | 真| 偽 | 偽(真のバージョン3.4.1およびそれ以前のデフォルトで) |
そして、ユーザーアカウントクラス1クラス
パブリック クラスユーザーが実装Serializableを{ プライベート整数のIDを、 プライベート文字列のユーザ名。 プライベート日の誕生日。 プライベート文字列のセックス。 プライベート文字列のアドレス。 プライベートリスト<アカウント> accountList。 和集合の方法を取得省略..... } パブリック クラスアカウントが実装Serializableを{ プライベート整数のIDを、 プライベート整数UID。 プライベートダブルお金。 和集合の方法を取得省略..... }
私たちが知る必要があるため、彼らは私たちが戻ったパッケージの結果のためのユーザクラスのアカウントのプロパティのコレクションを増やす必要がある必要がありながら、ユーザーのアカウントを見つけることであることに注意してください。
2. UserDaoは、インターフェイスメソッドで宣言されたのfindAll
/ ** *クエリ、すべてのユーザー * * @return * / リスト <ユーザ>のfindAll();
UserDao.xml 3.のfindAll構成マッピング方法
< このresultMap ID = "userAccountMap" タイプ= "com.example.domain.User" > < IDのプロパティ= "ID" 列= "ID" /> < 結果プロパティ= "ユーザ名" 欄= "ユーザ名" /> < 結果プロパティ=「誕生日」の列=「誕生日」/> < 結果プロパティ=「性別」欄=「セックス」/> < 結果プロパティ=「アドレス」列= "アドレス" /> < コレクションプロパティ= "accountList" ofType = "com.example.domain.Account" カラム= "ID" を選択= "com.example.dao.AccountDao.findAllByUid" /> </ このresultMap > < 選択ID = "のfindAll" このresultMap =」 userAccountMap」> ユーザーからのSELECT *; </ 選択>
主な機能には、アカウントリストの配置<コレクションプロパティ=「accountList」ofType =「com.example.domain.Account」欄=「ID」を選択=「com.example.dao.AccountDao.findAllByUid」/>、情報を実装しましたコレクションをマップのセット、照会する方法を選択することにより指定されたコレクション内の各要素に、本実施形態ではfindAllByUid名前空間com.example.dao.AccountDaoパス法select属性値AccountDao.xmlファイルとマッピングファイルを指定しますユニークなコレクション内の指定した検索要素を特定し、この方法によります。ここでは、ユーザIDに基づいてアカウントを検索する必要がありますので、あなたはfindAllByUid方法は、それを構成する必要が達成することができます。
findAllByUid使用select属性の収集方法を設定します
AccountDaoインターフェイスを追加します ** / ユーザIDのアカウント情報の問い合わせ* * @return * / リスト< アカウント> findAllByUid(整数UID); AccountDao.xml設定ファイル < SELECT ID = "findAllByUid" resultTypeと=「com.example.domain .Account " > SELECT * FROMアカウントWHERE UID UID =#{}; </ SELECT >
グローバル負荷遅延プロファイルMyBatisの上5.電源を入れ
構成> < 設定> <! - グローバル遅延ロードされた有効> - < 設定名= "lazyLoadingEnabled" 値"真の" = /> <! - すぐに閉じる負荷、実際には、何も設定、デフォルトはfalseではありません- > < 設定名= "aggressiveLazyLoading" 値= "偽" /> <! - 印刷関連情報のMyBatisのSQLの実行開く- > < 設定名= "logImpl" 値= "STDOUT_LOGGINGを" /> </ 設定> < typeAliases > < typeAliasのタイプ= "com.example.domain.Account" 別名= "アカウント" /> < typeAliasを入力= "com.example.domain.User" エイリアス= "ユーザー" /> < パッケージ名= "com.example.domain" /> </ typeAliases > < 環境デフォルト= "テスト" > < 環境ID = "テスト" > <! - 配置事务- > < トランザクションマネージャーのタイプ= "JDBC" > </ トランザクションマネージャー> <! - 接続の構成プール- > <データソースのタイプ= "POOLED" > < プロパティ名= "ドライバ" 値= "はcom.mysql.jdbc.Driver" /> < プロパティ名= "URL" 値= "はjdbc:mysqlの:// localhostを:3306 / TEST1" / > < プロパティ名= "ユーザ名" 値= "ルート" /> < プロパティ名= "パスワード" 値= "123456" /> </ のdataSource > </ 環境> </ 環境> <! - パスの設定マッピングファイル- > < マッパー> < マッパー資源= "COM /例/ DAO / UserDao.xml" /> < マッパ資源= "COM /例/ DAO / AccountDao.xml" /> </ マッパー> </ 構成>
6.試験方法
プライベートでのInputStream。 プライベートSQLSESSIONセッション。 プライベートUserDao userDao。 プライベートAccountDao accountDao。 プライベートSqlSessionFactory工場。 @Before 公共 ボイドのinit()がスロー例外{ // 获取配置文件 に= Resources.getResourceAsStream( "SqlMapConfig.xml" )。 // 获取工厂 工場= 新しいSqlSessionFactoryBuilder()(中)を構築。 セッション = factory.openSession()。 userDao = session.getMapper(UserDao。クラス); accountDao = session.getMapper(AccountDao。クラス)。 } @After 公共 ボイド Destoryは()スロー例外{ session.commitを(); session.close(); in.close(); } @Test 公共 ボイドfindAllTest(){ リスト <ユーザー> USERLIST = userDao.findAll()。 // (ユーザーユーザー:ユーザーリスト)のために{ // するSystem.out.println( "每个用户的信息")。 // するSystem.out.println(ユーザー); // するSystem.out.println(user.getAccountList()); // } }
テストの説明:我々は、印刷サイクルのためfindAllTest()メソッドを注釈を付けたとき、我々はプログラムをロードの遅延の特性に応じて、ユーザーの情報を照会し、ユーザーのアカウント情報を必要としませんが、アカウント情報を照会しません。私たちは印刷forループを手放すとき、私たちはユーザーとアカウントに情報を使用して、プログラムは、ユーザーおよび対応するアカウント情報をプリントアウトします。
7.試験結果
(1)ステップ5の構成を特に参照して、MyBatisのプロファイルにlogImpl構成を追加するためであり、この時点で、我々は、コンソールSQLで結果を見ることができ、アカウント情報を確認する必要がない、データを使用していない、リサイクルノート情報
印刷クエリサイクル用(2)データ、データの使用、そのアカウント情報をチェックし、データの使用のため、この時間は、我々はユーザーとアカウントの問い合わせが実行を行っていることがわかりました