【笔记】Mybatis高级查询(六)--鉴别器discrimiator的使用

本文详细介绍了MyBatis中<discriminator>标签的使用,通过实例展示了如何根据不同条件选择不同的resultMap,实现动态查询逻辑。特别关注了其在处理角色与权限信息时的应用,以及如何结合resultType使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【笔记】Mybatis高级查询(准备)
【笔记】Mybatis高级查询(一)–使用自动映射处理一对一关系
【笔记】Mybatis高级查询(二)–使用resultMap配置一对一映射
【笔记】Mybatis高级查询(三)–使用标签实现嵌套查询及延迟加载
【笔记】Mybatis高级查询(四)–使用resultMap的标签实现一对多和多对多查询
【笔记】Mybatis高级查询(五)–使用resultMap的进行嵌套查询及延迟加载
【笔记】Mybatis高级查询(小结)–嵌套查询及延迟加载
【笔记】Mybatis高级查询(七)–存储过程调用
【笔记】Mybatis高级查询(八)–枚举处理器的使用
【笔记】Mybatis高级查询(九)–Mybatis代码生成器的使用
【笔记】Mybatis高级查询(十)–Mybatis缓存使用

<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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值