[TOC]
*****
# 6.1.3 鑒別器查詢
有時一個查詢會根據列的值不同返回不同的結果集。
**例子:** 角色的屬性enable值為1的時候表示狀態可用,為0的時候表示狀態不可用。enable=1時可以獲取到該角色下詳細的權限信息。 當enable=0時只能獲取角色的基息。
**1. 在SysRole.java中**
```
package tk.mybatis.simple.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import tk.mybatis.simple.type.Enabled;
/**
* 角色表
*/
public class SysRole implements Serializable {
private static final long serialVersionUID = 6320941908222932112L;
/**
* 角色ID
*/
private Long id;
/**
* 角色名
*/
private String roleName;
private int enabled;
/**
* 創建人
*/
private String createBy;
/**
* 創建時間
*/
private Date createTime;
/**
* 用戶信息
*/
private SysUser user;
/**
* 角色包含的權限列表
*/
List<SysPrivilege> privilegeList;
}
```
**2 在RoleMapper.java中**
```
/**
* 根據用戶 ID 獲取用戶的角色信息
*
* @param userId
* @return
*/
//xml中的sql用#{userId}從方法的入參取值
List<SysRole> selectRoleByUserIdChoose(Long userId);
```
**3. 在RoleMapper.xml中**
```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="tk.mybatis.simple.mapper.RoleMapper">
<cache/>
<!-- 基礎映射 -->
<resultMap id="roleMap" type="tk.mybatis.simple.model.SysRole">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="enabled" column="enabled"/>
<!-- <association property="createInfo" javaType="tk.mybatis.simple.model.CreateInfo"> -->
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
<resultMap id="rolePrivilegeListMapSelect" extends="roleMap" type="tk.mybatis.simple.model.SysRole">
<collection property="privilegeList"
fetchType="lazy"
select="tk.mybatis.simple.mapper.PrivilegeMapper.selectPrivilegeByRoleId"
column="{roleId=id}"/>
</resultMap>
<!--3 鑒別器查詢,根據返回的值不同,選擇不同的映射結果-->
<resultMap id="rolePrivilegeListMapChoose" type="tk.mybatis.simple.model.SysRole">
<discriminator column="enabled" javaType="int">
<!-- 根據sql查詢出的enabled-->
<case value="1" resultMap="rolePrivilegeListMapSelect"/>
<case value="0" resultMap="roleMap"/>
</discriminator>
</resultMap>
<!--3 鑒別器查詢,根據返回的值不同,選擇不同的映射結果-->
<select id="selectRoleByUserIdChoose" resultMap="rolePrivilegeListMapChoose">
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>
</mapper>
```
javaType: 該屬性用于指定列的類型, 保證使用相同的Java類型來比較值
**4 在RoleMapperTest.java中**
```
public class RoleMapperTest extends BaseMapperTest{
@Test
public void testSelectRoleByUserIdChoose(){
//獲取 sqlSession
SqlSession sqlSession = getSqlSession();
try {
//獲取 RoleMapper 接口
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
//由于數據庫數據 enable 都是 1,所以我們給其中一個角色的 enable 賦值為 0
SysRole role = roleMapper.selectById(2L);
role.setEnabled(0);
roleMapper.updateById(role);
//獲取用戶 1 的角色
List<SysRole> roleList = roleMapper.selectRoleByUserIdChoose(1L);
for(SysRole r: roleList){
System.out.println("角色名:" + r.getRoleName());
if(r.getId().equals(1L)){
//第一個角色存在權限信息
Assert.assertNotNull(r.getPrivilegeList());
} else if(r.getId().equals(2L)){
//第二個角色的權限為 null
Assert.assertNull(r.getPrivilegeList());
continue;
}
for(SysPrivilege privilege : r.getPrivilegeList()){
System.out.println("權限名:" + privilege.getPrivilegeName());
}
System.out.println();
}
} finally {
sqlSession.rollback();
//不要忘記關閉 sqlSession
sqlSession.close();
}
}
}
```


**5 鑒別器的其他使用方法**
