Liuzengホイ先生は最近、「マスターへのエントリからMyBatisの、」本を読んであなたを助けるために、光栄として書籍、やりがいので、ブログ形式で自分出力の学習プロセスは、間違っている場合、私を修正してください!
主に収集タグの使用についてこのブログは、ネストされたクエリを実行します。
1.需要のアップグレード
ブログ記事では、我々は需要を実現:ユーザーは、ユーザーID情報ながら、役割ベースのユーザーのクエリを取得しています。
役割は、複数の権限を持つことができますので、このブログでは、我々は要件をアップグレードするので:取得許可の役割には役割が含まれると同時に、ユーザーの情報を照会するには、ユーザーIDに基づいて、ユーザーが所有しています。
2.実装
私たちは、マッピングテーブルのアクセス許可を使用する必要があるため、私たちは、以下のマッピングSysPrivilegeMapper.xmlを追加する必要があります。
<resultMap id="sysPrivilegeMap" type="com.zwwhnly.mybatisaction.model.SysPrivilege">
<id property="id" column="id"/>
<result property="privilegeName" column="privilege_name"/>
<result property="privilegeUrl" column="privilege_url"/>
</resultMap>
通常の状況下の表に対応するデータベースのエンティティクラスを修正することを提案しているではないので、ここで我々は新しいクラスSysRoleExtendを作成し、それがSysRoleクラスを継承し、次のフィールドを追加します。
package com.zwwhnly.mybatisaction.model;
import java.util.List;
public class SysRoleExtend extends SysRole {
/**
* 角色包含的权限列表
*/
private List<SysPrivilege> sysPrivilegeList;
public List<SysPrivilege> getSysPrivilegeList() {
return sysPrivilegeList;
}
public void setSysPrivilegeList(List<SysPrivilege> sysPrivilegeList) {
this.sysPrivilegeList = sysPrivilegeList;
}
}
次に、新しいマッピングは次のようにSysRoleMapper.xml:
<resultMap id="rolePrivilegeListMap" extends="roleMap"
type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
<collection property="sysPrivilegeList" columnPrefix="privilege_"
resultMap="com.zwwhnly.mybatisaction.mapper.SysPrivilegeMapper.sysPrivilegeMap"/>
</resultMap>
:ここでは、次のようにそれは、定義されている私たちの以前のブログでロールマップ
<resultMap id="roleMap" type="com.zwwhnly.mybatisaction.model.SysRole">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="enabled" column="enabled"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
com.zwwhnly.mybatisaction.mapper.SysPrivilegeMapper.sysPrivilegeMap
新しくSysPrivilegeMapper.xmlマッピングsysPrivilegeMapに建立されました。
その後、userRoleListMapでブログの記事に次のように改正する必要があります
<resultMap id="userRoleListMap" type="com.zwwhnly.mybatisaction.model.SysUserExtend" extends="sysUserMap">
<collection property="sysRoleList" columnPrefix="role_"
resultMap="com.zwwhnly.mybatisaction.mapper.SysRoleMapper.rolePrivilegeListMap">
</collection>
</resultMap>
関連するロールと権限テーブルの権限テーブルであることをするので、部品のブログを修正するために、IDタグコードselectAllUserAndRolesを選択します。
<select id="selectAllUserAndRoles" resultMap="userRoleListMap">
SELECT u.id,
u.user_name,
u.user_password,
u.user_email,
u.create_time,
r.id role_id,
r.role_name role_role_name,
r.enabled role_enabled,
r.create_by role_create_by,
r.create_time role_create_time,
p.id role_privilege_id,
p.privilege_name role_privilege_privilege_name,
p.privilege_url role_privilege_privilege_url
FROM sys_user u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.id
INNER JOIN sys_role_privilege rp ON rp.role_id = r.id
INNER JOIN sys_privilege p ON p.id = rp.privilege_id
</select>
注意事項:
ここでエイリアス列名sys_privilegeテーブルプレフィックスrole_privilege_
columnPrefixプロパティのコレクション内のuserRoleListMapためrole_
、および指定されたcom.zwwhnly.mybatisaction.mapper.SysRoleMapper.rolePrivilegeListMap
columnPrefixプロパティのコレクションにprivilege_
ので、ここでは、接頭辞必要なオーバーレイで、それはなりrole_privilege_
。
3.ユニットテスト
パートのブログ構築されtestSelectAllUserAndRoles()のコードのテストメソッドを変更します。
@Test
public void testSelectAllUserAndRoles() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
List<SysUserExtend> sysUserList = sysUserMapper.selectAllUserAndRoles();
System.out.println("用户数:" + sysUserList.size());
for (SysUserExtend sysUser : sysUserList) {
System.out.println("用户名:" + sysUser.getUserName());
for (SysRoleExtend sysRoleExtend : sysUser.getSysRoleList()) {
System.out.println("角色名:" + sysRoleExtend.getRoleName());
for (SysPrivilege sysPrivilege : sysRoleExtend.getSysPrivilegeList()) {
System.out.println("权限名:" + sysPrivilege.getPrivilegeName());
}
}
}
} finally {
sqlSession.close();
}
}
テストコードを実行し、テストは次のログを出力し、渡します。
DEBUG [メイン] - ==>準備:u.id SELECT、u.user_name、u.user_password、u.user_email、u.create_time、r.id ROLE_ID、r.role_name role_role_name、r.enabled role_enabled、r.create_by role_create_by 、r.create_timeのrole_create_time、p.idのrole_privilege_id、p.privilege_nameのrole_privilege_privilege_name、uはINNER sys_user_role UR ON u.id = ur.user_id INNER JOIN sys_role R ON ur.role_id = r.id INNER JOIN sys_role_privilegeをJOIN sys_user FROM p.privilege_urlのrole_privilege_privilege_url rp.role_id = r.id INNER JOINをsys_privilege Pにp.id = rp.privilege_id ON RP
DEBUG [メイン] - ==>パラメータ:
TRACE [メイン] - <==列:ID、USER_NAME、USER_PASSWORD、USER_EMAIL、CREATE_TIME、ROLE_ID、role_role_name、role_enabled、role_create_by、role_create_time、role_privilege_id、role_privilege_privilege_name、role_privilege_privilege_url
TRACE [メイン] - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0、1、管理者、1、1、2019年6月27日18:21 :12.0、1、ユーザ管理、/ユーザー
TRACE [メイン] - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0、1、管理者、1、1、2019年6月27日午後06時21分:12.0、2、ロール管理、/役割
TRACE [メイン] - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0、1、管理者、1、1、2019年6月27日午後06時21分:12.0、3、システムログ、/ログ
TRACE [メイン] - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0、2、普通のユーザ、1、1、2019年6月27日午後06時21分:12.0、4、保守要員、/人物
TRACE [メイン] - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0、2、普通のユーザ、1、1、2019年6月27日午後06時21分:12.0、5、ユニットのメンテナンス、/企業
TRACE [メイン] - <==行:1001試験、123456、[email protected]、2019年6月27日18:21:07.0、2、普通のユーザ、1、1、2019年6月27日午後06時21分:12.0、4、保守要員、/人物
TRACE [メイン] - <==行:1001試験、123456、[email protected]、2019年6月27日18:21:07.0、2、普通のユーザ、1、1、2019年6月27日午後06時21分:12.0、5、ユニットのメンテナンス、/企業
DEBUG [メイン] - <==合計:7
ユーザー数:2
ユーザー名:管理者
ロール名:管理者
パーミッションの名前:ユーザー管理
パーミッションの名前:ロール管理
パーミッションの名前:システムログ
ロール名:普通のユーザー
パーミッションの名前:メンテナンス要員
パーミッションの名前:ユニットのメンテナンス
ユーザー名:テスト
ロール名:普通のユーザー
パーミッションの名前:メンテナンス要員
パーミッションの名前:ユニットのメンテナンス
ログからわかるように、役割に含まれる権限情報の確認も、だけでなく、ユーザが所有する情報の役割をチェックしてください。
4.遅延ロード
私はsysRoleList財産を取得したロール情報を使用するときに言うかもしれないが、一部の学生、私は必ずしもああ使用していない情報や許可情報の役割の復帰、非常に多くのクエリのデータベーステーブル、良好な衝撃性能に関連したそれぞれが、ああ、行くことができませんデータベースクエリそれ?当然の答えは、それを達成するためにどのようにして、エネルギーのですか?
コレクション属性タグfetchTypeを達成するために必要な遅延読み込み、熱心と怠惰このプロパティは、正の負荷と遅延ロードを表す、2つの値を持っています。
なぜなら役割に基づいた役割に対応するすべての権利情報を取得する必要がありますのID、私たちは最初にSysPrivilegeMapper.xmlで次のクエリを定義する必要があります。
<select id="selectPrivilegeByRoleId" resultMap="sysPrivilegeMap">
SELECT p.*
FROM sys_privilege p
INNER JOIN sys_role_privilege rp ON rp.privilege_id = p.id
WHERE rp.role_id = #{roleId}
</select>
その後にSysRoleMapper.xmlで次のクエリを追加します。
<resultMap id="rolePrivilegeListMapSelect" extends="roleMap"
type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
<collection property="sysPrivilegeList" fetchType="lazy"
column="{roleId=id}"
select="com.zwwhnly.mybatisaction.mapper.SysPrivilegeMapper.selectPrivilegeByRoleId"/>
</resultMap>
<select id="selectRoleByUserId" resultMap="rolePrivilegeListMapSelect">
SELECT
r.id,
r.role_name,
r.enabled,
r.create_by,
r.create_time
FROM sys_role r
INNER JOIN sys_user_role ur ON ur.role_id = r.id
WHERE ur.user_id = #{userId}
</select>
上記のcolumn="{roleId=id}"
内、roleIdは、パラメータを選択selectPrivilegeByRoleId指定の方法を指し、IDは、クエリselectRoleByUserIdクエリロールIDを指します。
その後にSysUserMapper.xmlで次のクエリを追加します。
<resultMap id="userRoleListMapSelect" extends="sysUserMap"
type="com.zwwhnly.mybatisaction.model.SysUserExtend">
<collection property="sysRoleList" fetchType="lazy"
select="com.zwwhnly.mybatisaction.mapper.SysRoleMapper.selectRoleByUserId"
column="{userId=id}"/>
</resultMap>
<select id="selectAllUserAndRolesSelect" resultMap="userRoleListMapSelect">
SELECT
u.id,
u.user_name,
u.user_password,
u.user_email,
u.create_time
FROM sys_user u
WHERE u.id = #{id}
</select>
上にcolumn="{userId=id}"
は、ユーザーIDは、パラメータを選択selectRoleByUserId指定の方法を指し、IDは、ユーザID、クエリ、クエリselectAllUserAndRolesSelectアウト指します。
その後、SysUserMapperインターフェイスで、次のメソッドを追加します。
/**
* 通过嵌套查询获取指定用户的信息以及用户的角色和权限信息
*
* @param id
* @return
*/
SysUserExtend selectAllUserAndRolesSelect(Long id);
最後に、以下の試験方法SysUserMapperTestクラスを追加します。
@Test
public void testSelectAllUserAndRolesSelect() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
SysUserExtend sysUserExtend = sysUserMapper.selectAllUserAndRolesSelect(1L);
System.out.println("用户名:" + sysUserExtend.getUserName());
for (SysRoleExtend sysRoleExtend : sysUserExtend.getSysRoleList()) {
System.out.println("角色名:" + sysRoleExtend.getRoleName());
for (SysPrivilege sysPrivilege : sysRoleExtend.getSysPrivilegeList()) {
System.out.println("权限名:" + sysPrivilege.getPrivilegeName());
}
}
} finally {
sqlSession.close();
}
}
次のように試験方法、ログ出力を実行します:
DEBUG [メイン] - ==>準備:u.id SELECT、u.user_name、u.user_password、u.user_email、u.create_time sys_user U WHERE u.id = FROM?
DEBUG [メイン] - ==>パラメータ:1(ロング)
TRACE [メイン] - <==列:ID、USER_NAME、USER_PASSWORD、USER_EMAIL、CREATE_TIME
[メイン] TRACE - <==行:1、管理、123456、[email protected]、2019年6月27日18:21:07.0
DEBUG [メイン] - <==合計:1
ユーザー名:管理者
DEBUG [メイン] - ==>準備:SELECT r.id、r.role_name、r.enabled、r.create_by、sys_role R INNER FROM r.create_time sys_user_role UR ON ur.role_id = r.id WHERE ur.user_id =をJOIN ?
DEBUG [メイン] - ==>パラメータ:1(ロング)
TRACE [メイン] - <==列:ID、ROLE_NAME、有効、create_by、CREATE_TIME
TRACE [メイン] - <==行:1、管理者、1、1、2019-06-2718:21:12.0
TRACE [メイン] - <==行:2、普通のユーザ、1、1、2019-06-2718:21:12.0
DEBUG [メイン] - <==合計:2
ロール名:管理者
DEBUG [メイン] - 準備==>:pはSELECT * sys_privilegeのP INNER FROM rp.privilege_id = p.id WHERE rp.role_id = ON sys_role_privilege RPを登録しようか。?
DEBUG [メイン] - ==>パラメータ:1(ロング)
TRACE [メイン] - <==列:ID、PRIVILEGE_NAME、privilege_url
TRACE [メイン] - <==行:1、ユーザ管理、/ユーザー
TRACE [メイン] - <==行:2、ロール管理、/役割
TRACE [メイン] - <==行:3、システムログ/ログ
DEBUG [メイン] - <==合計:3
パーミッションの名前:ユーザー管理
パーミッションの名前:ロール管理
パーミッションの名前:システムログ
ロール名:普通のユーザー
DEBUG [メイン] - 準備==>:pはSELECT * sys_privilegeのP INNER FROM rp.privilege_id = p.id WHERE rp.role_id = ON sys_role_privilege RPを登録しようか。?
DEBUG [メイン] - ==>パラメータ:2(ロング)
TRACE [メイン] - <==列:ID、PRIVILEGE_NAME、privilege_url
TRACE [メイン] - <==行:4、保守要員、/人
TRACE [メイン] - <==行:5、メンテナンスユニット、/企業
DEBUG [メイン] - <==合計:2
パーミッションの名前:メンテナンス要員
パーミッションの名前:ユニットのメンテナンス
上記の場合は、ログ慎重な分析は、対応するデータベースクエリの実装前に、情報のみの役割への情報と権限を使用しています。
:協会のラベルを説明するために、以前のブログで、私たちはこれをfalseに設定する必要がありながら、負荷の遅延は、MyBatisのグローバルコンフィギュレーションaggressiveLazyLoadingに依存するため、ここでの結果は我々の期待に沿ったものであることに留意すべきです
<settings>
<!--其他配置-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
参照、パラメータについて詳細に説明したエントリからマスター(X)にMyBatisのを:タグネストされたクエリを達成するための関連付けを使用してください。
5.まとめ
次のような特性が要約されている使用し、ネストされたクエリを実装するラベルのコレクションを使用します。
1)を選択:idは、MyBatisの余分なこのクエリの別のマッピングのクエリの実行結果は、ネストされたオブジェクトを取得します。
2)カラム:メインカラムクエリ結果パラメータとして、カラム=「{PROP1 = COL1、COL2 PROP2 =}」、PROP1パラメータとしてPROP2、およびネストされたクエリのようなネストされたクエリ、構成。
3)fetchType:それぞれデータローディング、熱心及び遅延オプション値は、負荷および遅延ローディングアクティブ。
4)遅延読み込みを使用するように、その怠惰fetchTypeセット以外は、グローバルコンフィギュレーション値が偽であるaggressiveLazyLoadingことに留意されたいです。このパラメータのデフォルトは、デフォルト値の先頭からバージョン3.4.5、バージョン3.4.5より前は、falseに変更されたトゥーレ。
そのような等号()メソッドのようないくつかの方法を、トリガーされたとき5)lazyLoadTriggerMethodsパラメータMyBatisの支持クエリが直接遅延ロードプロパティをトリガ提供しました。
6.ソースとリファレンス
ソースアドレス:https://github.com/zwwhnly/mybatis-action.git、ダウンロードして歓迎。
Liuzengホイ「マスターへのエントリからMyBatisの。」
7.最後に
私たちが一緒に進行するように、Javaテクノロジ乾燥品を共有するために随時「上海ストレンジャー」:少し宣伝を再生する、マイクロチャンネルスキャンコード番号の公衆に焦点を歓迎しました。