MyBatis从入门到精通(十三):使用discriminator鉴别器映射

简介: MyBatis从入门到精通(十三):使用discriminator鉴别器映射最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸!本篇博客主要讲解鉴别器映射discriminator标签的简单用法。

MyBatis从入门到精通(十三):使用discriminator鉴别器映射
最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸!

本篇博客主要讲解鉴别器映射discriminator标签的简单用法。

  1. 明确需求
    在设计之初,sys_role表的enabled字段有2个可选值,其中1代表启用,0 代表禁用,当状态启用时就有对应的权限信息,当状态禁用时就没有对应的权限信息,只需查询出角色信息即可。

所以我们的需求为:根据用户id查询用户拥有的角色列表,如果角色是启用的,就继续查询出角色对应的权限列表,如果角色是禁用的,就不需要查询对应的权限列表。

  1. 实现方式
    首先,我们需要在SysRoleMapper.xml中新建角色表的映射roleMapExtend,注意这里我们使用的是之前新建的扩展类SysRoleExtend:

<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="enabled" column="enabled"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>


然后回顾下上篇博客中使用到的rolePrivilegeListMapSelect映射,因为接下来会用到:

       type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
<collection property="sysPrivilegeList" fetchType="lazy"
            column="{roleId=id}"
            select="com.zwwhnly.mybatisaction.mapper.SysPrivilegeMapper.selectPrivilegeByRoleId"/>


接下来新建本篇博客的主人公映射rolePrivilegeListMapChoose和对应的查询语句:

       type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
<discriminator column="enabled" javaType="int">
    <case value="1" resultMap="rolePrivilegeListMapSelect"/>
    <case value="0" resultMap="roleMapExtend"/>
</discriminator>


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}


discriminator标签常用的2个属性讲解:

column:设置要进行鉴别比较值的列名。
javaType:指定列的类型,保证使用相同的Java类型来比较值。
discriminator标签可以有1个或多个case标签,case标签包含以下3个属性:

value:该值为discriminator标签column属性用来匹配的值。
resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射。
case标签下面可以包含的标签和resultMap一样,用法也一样。

然后在SysRoleMapper接口中添加如下方法:

/**

  • 根据用户id获取用户的角色信息
    *
  • @param userId
  • @return
    */

List selectRoleByUserIdChoose(Long userId);

  1. 单元测试
    在SysRoleMapperTest测试类中添加如下测试方法:

@Test
public void testSelectRoleByUserIdChoose() {

SqlSession sqlSession = getSqlSession();

try {
    SysRoleMapper sysRoleMapper = sqlSession.getMapper(SysRoleMapper.class);

    // 将id=2的角色的enabled赋值为0
    SysRole sysRole = sysRoleMapper.selectById(2L);
    sysRole.setEnabled(0);
    sysRoleMapper.updateById(sysRole);

    // 获取用户id为1的角色
    List<SysRoleExtend> sysRoleExtendList = sysRoleMapper.selectRoleByUserIdChoose(1L);
    for (SysRoleExtend item : sysRoleExtendList) {
        System.out.println("角色名:" + item.getRoleName());
        if (item.getId().equals(1L)) {
            // 第一个角色存在权限信息
            Assert.assertNotNull(item.getSysPrivilegeList());
        } else if (item.getId().equals(2L)) {
            // 第二个角色的权限为null
            Assert.assertNull(item.getSysPrivilegeList());
            continue;
        }
        for (SysPrivilege sysPrivilege : item.getSysPrivilegeList()) {
            System.out.println("权限名:" + sysPrivilege.getPrivilegeName());
        }
    }
} finally {
    sqlSession.close();
}

}
运行测试代码,测试通过,输出日志如下:

DEBUG [main] - ==> Preparing: SELECT id,role_name,enabled,create_by,create_time FROM sys_role WHERE id = ?

DEBUG [main] - ==> Parameters: 2(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2019-06-27 18:21:12.0

DEBUG [main] - <== Total: 1

DEBUG [main] - ==> Preparing: UPDATE sys_role SET role_name = ?,enabled = ?,create_by=?, create_time=? WHERE id=?

DEBUG [main] - ==> Parameters: 普通用户(String), 0(Integer), 1(Long), 2019-06-27 18:21:12.0(Timestamp), 2(Long)

DEBUG [main] - <== Updates: 1

DEBUG [main] - ==> 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 = ?

DEBUG [main] - ==> Parameters: 1(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 1, 管理员, 1, 1, 2019-06-27 18:21:12.0

TRACE [main] - <== Row: 2, 普通用户, 0, 1, 2019-06-27 18:21:12.0

DEBUG [main] - <== Total: 2

角色名:管理员

DEBUG [main] - ==> Preparing: SELECT p.* FROM sys_privilege p INNER JOIN sys_role_privilege rp ON rp.privilege_id = p.id WHERE rp.role_id = ?

DEBUG [main] - ==> Parameters: 1(Long)

TRACE [main] - <== Columns: id, privilege_name, privilege_url

TRACE [main] - <== Row: 1, 用户管理, /users

TRACE [main] - <== Row: 2, 角色管理, /roles

TRACE [main] - <== Row: 3, 系统日志, /logs

DEBUG [main] - <== Total: 3

权限名:用户管理

权限名:角色管理

权限名:系统日志

角色名:普通用户

从日志可以看出,角色1是启用的,所以又执行了一次查询获取角色的权限列表,角色2是禁用的,所以没有执行。

  1. 源码及参考
    源码地址:https://github.com/zwwhnly/mybatis-action.git,欢迎下载。

刘增辉《MyBatis从入门到精通》
原文地址https://www.cnblogs.com/zwwhnly/p/11212396.html

相关文章
|
1月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
13 1
|
1月前
|
SQL Java 数据库连接
|
2月前
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
50 0
|
3月前
|
SQL Java 数据库连接
MyBatis映射文件深入
MyBatis映射文件深入
62 0
|
3月前
|
关系型数据库 Java 数据库连接
MyBatis-Plus简介和入门操作
【1月更文挑战第5天】 一、MyBatis-Plus简介 二、 MyBatis-Plus操作 1、准备数据库脚本 2、准备boot工程 3、导入依赖 4、配置文件和启动类 5、功能编码 6、测试和使用
105 1
|
3月前
|
SQL Java 数据库连接
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
90 0
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
|
3月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
203 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
1月前
|
XML Java 数据库连接
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
51 0
|
1月前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
15 1
|
1月前
|
SQL JavaScript Java
mybatis-flex入门体验(一)
`shigen`,一个专注于Java、Python、Vue和Shell的博主,分享成长和认知。近期探索了`mybatis-flex`,通过官网学习了代码生成和编码体验。配置数据源和依赖后,利用示例代码生成了符合Lombok+MyBatis Plus规范的实体和Mapper。此外,展示了如何配置SQL打印,并用测试代码演示了查询、多条件查询和更新操作。`mybatis-flex`的亮点在于流畅的查询语法和连表查询功能。后续将分享更多关于连表查询的实践。一起学习,每天进步!
35 0
mybatis-flex入门体验(一)