【笔记】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]