1. 程式人生 > >【筆記】Mybatis高階查詢(六)--鑑別器discrimiator的使用

【筆記】Mybatis高階查詢(六)--鑑別器discrimiator的使用

<discrimiator>鑑別器標籤用來處理不同資料型別執行不同操作的。與java的switch語句相似。有以下屬性:

  • column:該屬性用於設定要進行鑑別比較值的列。
  • javaType:該屬性用於指定列的資料型別,保證使用相同的java型別來比較值。

<discrimiator>標籤可以有1個或多個<case>標籤,<case>有以下三個屬性:

  • value:該值為<discrimiator>指定column用來匹配的值。
  • resultMap:當column的值與value的值匹配時,可以配置使用resultMap對映,resultMap優先順序高於resultType。
  • resultType:當column的值與value的值匹配時,可以配置使用resultType對映。

<case>標籤下面可以包含標籤與<resultMap>一樣,用法也一樣。

<discrimiator>使用例子:

  • 新建selectRolesByIdChoose方法與rolePrisMapChoose對映,當角色屬性enabled為1時表示狀態可用,然後查詢許可權資訊。當為0不可用時,只查詢角色資訊。

  <!-- 使用resultMap的<discrimiator>標籤進行選擇查詢,相當於java的switch -->
  <resultMap id="rolePrisMapChoose" type="ex.mybatis.rbac.model.SysRole">
    
    <!-- discrimiator鑑別器 -->
    <discriminator column="enabled" javaType="int">
    	<case value="1" resultMap="rolePrisMapSel" />
    	<case value="0" resultMap="roleMap" />
    </discriminator>
  </resultMap>
  
  <!-- 使用resultMap的鑑別器<discrimiator>標籤查詢 -->
  <select id="selectRolesByIdChoose" resultMap="rolePrisMapChoose">
    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>
  • 在RoleMaperTest新增對應的測試方法

	@Test
	public void testSelectRolesByIdChoose() {
		// 獲取SqlSession
		SqlSession sqlSession = openSession();
		try {
			// 獲取SysRoleMapper介面
			SysRoleMapper roleMapper = sqlSession.getMapper(SysRoleMapper.class);
			
			// 呼叫selectRolesByIdChoose方法
			List<SysRole> roles = roleMapper.selectRolesByIdChoose(1L);
			
			System.out.println("角色數:" + roles.size());
			for (SysRole role : roles) {
				System.out.println("角色[" + role.getRoleName() + "]呼叫role.getPrivileges()");
				List<SysPrivilege> privileges = role.getPrivileges();
				if (privileges != null) {
					for (SysPrivilege privilege : privileges) {
						System.out.println("--許可權:" + privilege);
					}
				}
				System.out.println();
			}
			
			System.out.println();
		} finally {
			sqlSession.close();
		}
	}
  • 執行結果1(可以看到角色2的enabled為0,只會查詢角色資訊,許可權資訊為空)

[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==>  Preparing: 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 = ? 
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==    Columns: id, role_name, enabled, create_by, create_time
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 1, 管理員, 1, 1, 2018-10-01 18:27:36.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 2, 普通使用者, 0, 1, 2018-10-01 18:27:37.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==      Total: 2
角色數:2
角色[管理員]呼叫role.getPrivileges()
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==>  Preparing: select id, privilege_name, privilege_url from sys_privilege p inner join sys_role_privilege rp on rp.privilege_id = p.id where rp.role_id = ? 
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==    Columns: id, privilege_name, privilege_url
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 1, 使用者管理, /users
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 2, 角色管理, /roles
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 3, 系統日誌, /logs
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==      Total: 3
--許可權:SysPrivilege [id=1, privilegeName=使用者管理, privilegeUrl=/users]
--許可權:SysPrivilege [id=2, privilegeName=角色管理, privilegeUrl=/roles]
--許可權:SysPrivilege [id=3, privilegeName=系統日誌, privilegeUrl=/logs]

角色[普通使用者]呼叫role.getPrivileges()
  • 執行結果2(把角色2的enabled改為1,許可權資訊有了)

[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==>  Preparing: 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 = ? 
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==    Columns: id, role_name, enabled, create_by, create_time
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 1, 管理員, 1, 1, 2018-10-01 18:27:36.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 2, 普通使用者, 1, 1, 2018-10-01 18:27:37.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==      Total: 2
角色數:2
角色[管理員]呼叫role.getPrivileges()
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==>  Preparing: select id, privilege_name, privilege_url from sys_privilege p inner join sys_role_privilege rp on rp.privilege_id = p.id where rp.role_id = ? 
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==    Columns: id, privilege_name, privilege_url
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 1, 使用者管理, /users
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 2, 角色管理, /roles
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 3, 系統日誌, /logs
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==      Total: 3
--許可權:SysPrivilege [id=1, privilegeName=使用者管理, privilegeUrl=/users]
--許可權:SysPrivilege [id=2, privilegeName=角色管理, privilegeUrl=/roles]
--許可權:SysPrivilege [id=3, privilegeName=系統日誌, privilegeUrl=/logs]

角色[普通使用者]呼叫role.getPrivileges()
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==>  Preparing: select id, privilege_name, privilege_url from sys_privilege p inner join sys_role_privilege rp on rp.privilege_id = p.id where rp.role_id = ? 
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==> Parameters: 2(Long)
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==    Columns: id, privilege_name, privilege_url
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 4, 人員維護, /persons
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 5, 單位維護, /companies
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==      Total: 2
--許可權:SysPrivilege [id=4, privilegeName=人員維護, privilegeUrl=/persons]
--許可權:SysPrivilege [id=5, privilegeName=單位維護, privilegeUrl=/companies]

<case>屬性與resultType使用

  • 把上面的rolePrisMapChoose的對映配置改為如下

<!-- 使用resultMap的<discrimiator>標籤進行選擇查詢,相當於java的switch -->
  <resultMap id="rolePrisMapChoose"  type="ex.mybatis.rbac.model.SysRole">
    
    <!-- discrimiator鑑別器 -->
    <!--  
    <discriminator column="enabled" javaType="int">
    	<case value="1" resultMap="rolePrisMapSel" />
    	<case value="0" resultMap="roleMap" />
    </discriminator>
    -->
    
    <discriminator column="enabled" javaType="int">
    	<case value="1" resultMap="rolePrisMapSel" />
    	<case value="0" resultType="ex.mybatis.rbac.model.SysRole">
    		<id column="id" property="id" />
    		<result column="role_name" property="roleName" />
    	</case>
    </discriminator>
  </resultMap>
  • 再執行測試方法

[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==>  Preparing: 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 = ? 
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==    Columns: id, role_name, enabled, create_by, create_time
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 1, 管理員, 1, 1, 2018-10-01 18:27:36.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==        Row: 2, 普通使用者, 0, 1, 2018-10-01 18:27:37.0
[ex.mybatis.rbac.mapper.SysRoleMapper.selectRolesByIdChoose] - <==      Total: 2
角色數:2
角色[管理員]呼叫role.getPrivileges()
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==>  Preparing: select id, privilege_name, privilege_url from sys_privilege p inner join sys_role_privilege rp on rp.privilege_id = p.id where rp.role_id = ? 
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - ==> Parameters: 1(Long)
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==    Columns: id, privilege_name, privilege_url
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 1, 使用者管理, /users
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 2, 角色管理, /roles
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==        Row: 3, 系統日誌, /logs
[ex.mybatis.rbac.mapper.SysPrivilegeMapper.selectPriByRoleId] - <==      Total: 3
SysRole [id=1, roleName=管理員, enabled=1, createBy=1, createTime=Mon Oct 01 18:27:36 CST 2018]
--許可權:SysPrivilege [id=1, privilegeName=使用者管理, privilegeUrl=/users]
--許可權:SysPrivilege [id=2, privilegeName=角色管理, privilegeUrl=/roles]
--許可權:SysPrivilege [id=3, privilegeName=系統日誌, privilegeUrl=/logs]

角色[普通使用者]呼叫role.getPrivileges()
SysRole [id=2, roleName=普通使用者, enabled=0, createBy=1, createTime=Mon Oct 01 18:27:37 CST 2018]