美文网首页
用户,角色,资源,联合查询(使用xml)

用户,角色,资源,联合查询(使用xml)

作者: hekirakuno | 来源:发表于2020-04-22 11:11 被阅读0次

向xml低头,没错,我向xml低头了。
前文:
用户,角色,资源,联合查询(使用注解SQL)

注解sql的那种provider的文件格式,可能真的不是mybatis主推的模式,场景欠缺的很多,而当你硬把改场景用这种方式实现时,反倒不优雅了。还是回归传统吧,或许这就是xml这么多年屹立不倒的秘诀。

开始开始。

一段时间不见,gemini的表结构被我改了改,结合各种方面优化考虑,现在的他们是这样的。
用户表:

CREATE TABLE `g_user` (
  `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(32) NOT NULL COMMENT '用户编号(业务id)',
  `identity_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '账号',
  `nick_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '昵称',
  `phone` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系方式',
  `email` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮箱',
  `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
  `lock` tinyint(1) DEFAULT '0' COMMENT '是否锁定',
  `create_user_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
  `update_user_id` bigint(32) DEFAULT NULL COMMENT '更新人id',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `rev` tinyint(8) DEFAULT '1' COMMENT '版本号',
  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '删除标记',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

角色表:

CREATE TABLE `g_role` (
  `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `role_id` bigint(32) NOT NULL COMMENT '角色id',
  `role_code` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色编码',
  `role_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
  `create_user_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
  `update_user_id` bigint(32) DEFAULT NULL COMMENT '更新人id',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `rev` tinyint(8) DEFAULT '1' COMMENT '版本号',
  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '删除标记',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

用户角色表:

CREATE TABLE `g_user_role` (
  `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `role_id` bigint(32) NOT NULL COMMENT '角色编码',
  `user_id` bigint(32) NOT NULL COMMENT '用户编码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

资源表:

CREATE TABLE `g_resource` (
  `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `resource_id` bigint(32) NOT NULL COMMENT '资源id',
  `resource_code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '资源编码',
  `resource_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '资源名称',
  `create_user_id` int(32) DEFAULT NULL COMMENT '创建人id',
  `update_user_id` int(32) DEFAULT NULL COMMENT '更新人id',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `rev` tinyint(8) DEFAULT '1' COMMENT '版本号',
  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '删除标记',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

角色资源表:

CREATE TABLE `g_res_role` (
  `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `role_id` bigint(32) NOT NULL COMMENT '角色id',
  `resource_id` bigint(32) NOT NULL COMMENT '资源id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

总体模式同过去没有区别,只是加了一些字段,改了一些名字,变化了一些规则。
首先,过去我的表主键都是自增id,但我在映射关系中,也是使用的自增id,其实是不科学的。过去也不是没想到给它一个主键自增id,一个业务id,一个编码,一个名字。所有的业务表都这么设计的模式。只是觉得有必要吗?但是实际的项目探索之后,其实还是很有必要的。粒度越细,其实可变化性就越多,分工也越明确。只是略有复杂需要处理,具体还是看个人和项目吧。总之我改成了现在的这样。

开始切入正题。

我们现在需求的返回格式同过去一般无二。
1、用户信息中带角色列表,角色列表中再带资源列表。
2、用户信息中直接带角色列表与资源列表。

对于vo文件我也没有怎么改动。除了字段更名和添加字段以外,格式,模式,基本同过去一致。

主要看xml。
其实本质是类似的。还是使用resultMap进行调控。
只是在注解sql中,用的是many=@Many()这样的格式,在这里使用的就是collection标签。需要注意的是,所有的关联字段(column)都必须显式地被写出来,也就是不能依赖通配符(*)的查询结果。

直接贴图吧。

资源持久化类
ResourceMapper.java:

public interface ResourceMapper {

    /**
     * 根据roleId获取资源信息
     */

    List<ResourceVo> selectByRoleId(Long roleId);
}

ResourceMapper.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="com.hekiraku.gemini.mapper.ResourceMapper">
    <resultMap id="resourceInfo" type="com.hekiraku.gemini.domain.vo.ResourceVo">
    </resultMap>
    <select id="selectByRoleId" resultMap="resourceInfo">
        select gr.*
        from g_resource gr
        left join g_res_role grr on gr.resource_id = grr.resource_id
        where grr.role_id = #{roleId}
    </select>
</mapper>

接下来看角色
角色持久化类
RoleMapper.java

public interface RoleMapper {
/**根据userId获取所有角色信息*/
    List<RoleVo> selectByUserId(Long userId);
}

RoleMapper.xml
<注意:这里的关联字段是role_id,因此在下面的sql中就显式地把它查了出来。>

<?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="com.hekiraku.gemini.mapper.RoleMapper">
    <resultMap id="roleInfo" type="com.hekiraku.gemini.domain.vo.RoleVo">
        <collection property="resources" column="role_id" javaType="java.util.List" select="com.hekiraku.gemini.mapper.ResourceMapper.selectByRoleId"/>
    </resultMap>
    <!--根据userId获取相关角色信息-->
    <select id="selectByUserId" resultMap="roleInfo">
        select gr.*,grr.role_id as roleId
        from g_role gr
        left join g_user_role grr on gr.role_id = grr.role_id
        where grr.user_id = #{userId}
    </select>
</mapper>

用户映射类
userMapper.java:

public interface UserMapper {
/**根据身份编码获取所有信息*/
    UserInfoVo selectByIdentityCode(String identityCode);
}

userMapper.xml:
<注意:这里的关联字段是user_id,因此在下面的sql中就显式地把它查了出来。>

<?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="com.hekiraku.gemini.mapper.UserMapper">

    <resultMap id="userInfo" type="com.hekiraku.gemini.domain.vo.UserInfoVo">
        <collection property="roles" column="user_id" ofType="com.hekiraku.gemini.domain.vo.RoleVo" javaType="java.util.List" select="com.hekiraku.gemini.mapper.RoleMapper.selectByUserId"/>
    </resultMap>
    <select id="selectByIdentityCode" resultMap="userInfo">
        select gu.user_id as userId,gu.*
        from g_user gu
        where gu.identity_code = #{identityCode}
    </select>
</mapper>

关联字段是什么呢?就是两个sql关联在一起的那个共同的字段。所以在写关联查询的时候,一定一定要注意的事,关联字段一定要作为B的条件。

结果集

end

相关文章

  • 用户,角色,资源,联合查询(使用xml)

    向xml低头,没错,我向xml低头了。前文:用户,角色,资源,联合查询(使用注解SQL) 注解sql的那种prov...

  • 用户,角色,资源,联合查询(使用注解SQL)

    这个地方就是血泪,我一定要记录一下。 首先我们的表,有五张表。 用户表,角色表,资源表,用户-角色表,角色-资源表...

  • mybatis plus之自定义SQL查询

    注解查询 使用XML查询 maven 资源 默认只有resources 中的文件最终会解析到target/clas...

  • Restful风格

    使用RESTful操作资源 【GET】 /users # 查询用户信息列表 【GET】 /users/1001 #...

  • Oracle 用户管理

    用户信息查询 查询当前用户被赋予的角色 查看某个角色拥有的权限 查看当前用户拥有的权限 新建用户 新建用户 给用户赋权限

  • 一、权限设计概览

    1、权限设计 主要是用户、角色、资源进行权限分配。即对用户赋予某个角色,角色能访问操作不同资源范围 通过建立角色系...

  • 老开发眼里的权限设计

    1 基于角色的权限设计(RBAC) 目的:判断用户能否操作资源表现:用户、角色、资源之间的连线 用户,特指“人”。...

  • Hibernater学习笔记(五)

    上次学习一对多查询,今天学习多对多查询场景:用户和角色的关系,一个用户可以是多个角色,一个角色可以有多个用户 po...

  • Spring Security判断用户是否已经登录

    方法一、JSP中检查user principal 方法二、检查角色 和这个 方法三、 还是查询用户 方法四、 使用...

  • 数据库-联表查询

    SQL使用(一)——联合查询 1.联合查询分类 内连接(inner Join 或 Join) 外连接(outer ...

网友评论

      本文标题:用户,角色,资源,联合查询(使用xml)

      本文链接:https://www.haomeiwen.com/subject/elmbihtx.html