1.プライマー
主に1および1対多の関係などの特性の複合エンティティ・クラスのデータ・タイプに使用MyBatisの遅延読み込み、。プロパティのこの種は、多くの場合、別のデータテーブルに対応しており、需要は必ずしもオンデマンドでロードされた目的を達成するために、そしてに関してロード・テーブル・クエリ内の時間遅延も大きな利点を持っているために、実際のクエリデータテーブルを必要としません。このコストは、アクセス速度を向上させる上で大きな意義を持っており、システムリソースを減らします。
2.ダブルテーブルクエリ
背景:ユーザエンティティクラスが文字ユーザロールエンティティクラス属性が含まれています
Userエンティティクラス属性
プライベート整数ID; // ID プライベート文字列のUSERCODE; // ユーザーコード プライベート文字列のuserName; // ユーザー名 プライベート文字列のuserPassword; // ユーザーのパスワード プライベート整数USERROLE; // 関連付けられたユーザーIDフィールドの役割、およびロールテーブルsmbms_roleは、対応する プライベートロールロール; // 間の1対1の対応 のプライベート整数性別; // セックス プライベート日誕生日; // 生年月日 プライベート文字列電話; // 電話 プライベート文字列のアドレス; // アドレス プライベート文字列userRoleName; // ユーザの役割名 プライベート整数CREATEDBY; // の生みの親 プライベート日のCreationDate; // 時間を作成する プライベート整数modifyBy; // によって更新された プライベート日付ModifyDate; // 更新時間
エンティティクラスの属性の役割、
プライベート整数は、上記のIDを述べた; // 上記のIDに述べた プライベート文字列roleCodeを; // 文字をエンコードする プライベート文字列のroleNameを; // ロール名 プライベート整数CREATEDBY; // の生みの親 プライベート日のCreationDate; //は時間を作成する プライベート整数modifyBy; // によって更新された プライベート日付ModifyDate ; // 更新
XML SQL文のマッピングファイル
<! - 演示一对一会的连表查询スタート- > < このresultMap タイプ= "役割" ID = "ロールマップ" > < のid プロパティ= "ID" 列= "R_ID" /> < 結果プロパティ= "roleCode " 列=" roleCode " /> < 結果プロパティ= "のroleName" カラム= "のroleName" /> </ このresultMap > < このresultMap タイプ= "ユーザー" ID ="userRoleResult」 > < のid プロパティ= "ID"カラム= "ID" /> < 結果プロパティ= "USERCODE" カラム= "USERCODE" /> < 結果プロパティ= "userNameに" カラム= "userNameに" /> < 関連のプロパティ= "ロール" のJavaType = "ロール" このresultMap =」ロールマップ」 /> </ このresultMap > <! - 根据用户表中角色ID和角色表做联表查询- > < 選択のid = "getUserListByRoleId" のParameterType = "int型"このresultMap = "userRoleResult" > * Uを選択し、R_IDとしてr.id、r.roleCode、r.roleNameから smbms_user Uを、smbms_role R u.userRole =#{userRoleId}とu.userRoleは= r.id </ 選択>
<! - 演示一对一会的连表查询終了- >
試験方法
@Test 公共 ボイドselectUserByIdsAndRoleId() { リスト <ユーザー>ユーザー= sqlSession.getMapper(UserMapper。クラス).selectUserByIdsAndRoleId(3、は、Arrays.asList(4,3、7,12 ))。 用(ユーザuserElement:ユーザ) { のSystem.out.println(userElement)。 } }
3.遅延ロード
レイジーローディングがメインの設定ファイルMyBatisの-config.xmlで構成することができ、ここでの設定はグローバル設定、デフォルトの遅延読み込みプロセスは、すべてのクエリのSQLです。
< 設定> <! - 遅延ロードを有効にします- > < 設定名= "lazyLoadingEnabled" 値= "trueに" /> <! - クローズ積極的にロードされた- > < 設定名= "aggressiveLazyLoading" 値= "false"を / > </ 設定>
また、グローバルに満足の構成は、収集したり、特定のSQL文のマッピングで属性assocationタグfetchType =「遅延」(遅延ローディング)又はfetchType =「イーガー」(即時荷重)を追加するために添加され得る場合、
グローバルコンフィギュレーションのSQLここカバーSQL負荷をロード、擬似コード
< コレクション・プロパティ= "アドレスリスト" ofType = "アドレス" 欄= "ID" fetchType = "怠惰|熱望して" />
マッピングコードのXML SQL
<! - 演示一对多コレクション - > < このresultMap タイプ= "ユーザー" ID = "userAddressResult" > < のid プロパティ= "ID" 列= "ID" /> < 結果プロパティ= "ユーザーコード" 列= "USERCODE " /> < 結果プロパティ="電話」カラム= "電話" /> < 結果プロパティ= "userNameに" カラム= "userNameに" /> <コレクション・プロパティ=「アドレスリスト」ofType= "アドレス" 欄= "上記のID" SELECT = "lazyFindAddressListByUserId" fetchTypeは= "怠惰" /> </ このresultMap > <! - 遅延デマンド負荷SQL文(つまり、このSQLを使用することはできません)- > < SELECTは、上記のid = "lazyFindAddressListByUserId" のParameterType = "INT" resultTypeと= "アドレス" > SELECT *はuserId IDからsmbms_address =#{} </ SELECT > <! - IDは、ユーザによるユーザ複数のアドレスを取得する- > < SELECT ID = "getAddressListByUserId"ParameterType = "整数" このresultMap = "userAddressResult" > SELECT * FROM smbms_userからここID =#{にuserId} </ 選択>
試験方法のAddressListアドレス情報を使用していません
@Test 公共 ボイドgetAddressListByUserId() { リスト <ユーザー>ユーザー= sqlSession.getMapper(UserMapper。クラス).getAddressListByUserId(5 )。 用(ユーザuserElement:ユーザー) { // 不使用アドレスリスト属性 のSystem.out.println(userElement.getPhone()+」「+ userElement.getUserCode())。 // するSystem.out.println(userElement)。 } }
コンソールは、実際には、唯一の1つのSQL文を表示し、ユーザだけがテーブルを照会します
試験方法のAddressListアドレス情報を使用して
@Test 公共 ボイドgetAddressListByUserId() { リスト <ユーザー>ユーザー= sqlSession.getMapper(UserMapper。クラス).getAddressListByUserId(5 )。 用(ユーザuserElement:ユーザー) { // 使用アドレスリスト属性 // するSystem.out.println(userElement.getPhone()+」「+ userElement.getUserCode())。 System.out.println(userElement)。 } }
コンソールは、アドレステーブルを照会するだけで2つのSQL文で、実際には、唯一の最初のクエリ、ユーザーテーブル、そしてユーザIDを表示します