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

xiaoxiao2022-06-11  25

【笔记】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]
转载请注明原文地址: https://www.6miu.com/read-4931502.html

最新回复(0)