💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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(); } } } ``` ![](https://box.kancloud.cn/f9fd82f14b6fe7e17d9bfe381d7351c0_504x668.png) ![](https://box.kancloud.cn/3c1e3c5f6f2e77d9422da53c8d6f7961_455x170.png) **5 鉴别器的其他使用方法** ![](https://box.kancloud.cn/51e836d4893cd11baa1978b6e4ac4f69_930x554.png)