mybatis注解版实现多表联查

需求:

用户有角色,角色有权限,需要一次取用户信息包含角色信息及其对应权限

实体类:

package cn.zytao.taosir.common.model.user;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; @Data
@ApiModel(value="用户实体")
public class User implements Serializable{ /**
*
*/
private static final long serialVersionUID = -2389902440625641568L; @ApiModelProperty(name ="id",value = "ID主键")
private String id; @ApiModelProperty(name ="username",value = "用户名")
private String username; @ApiModelProperty(name ="password",value = "密码")
private String password; @ApiModelProperty(name ="nickname",value = "昵称")
private String nickname; @ApiModelProperty(name ="isInsiders",value = "是否内部人员")
private int isInsiders; @ApiModelProperty(name ="phone",value = "联系电话")
private String phone; @ApiModelProperty(name ="email",value = "邮箱")
private String email; @ApiModelProperty(name ="qq",value = "QQ")
private String qq; @ApiModelProperty(name ="wechat",value = "微信")
private String wechat; @ApiModelProperty(name ="question",value = "找回密码问题")
private String question; @ApiModelProperty(name ="answer",value = "找回密码答案")
private String answer; @ApiModelProperty(name ="createTime",value = "创建时间")
private Date createTime; @ApiModelProperty(name ="updateTime",value = "更新时间")
private Date updateTime; @TableField(exist = false)
private Set<Role> roles=new HashSet<>();
}

用户

package cn.zytao.taosir.common.model.user;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; /**
*
* @author taosir
*
*/
@Data
@ApiModel(value="角色实体")
public class Role implements Serializable{ /**
*
*/
private static final long serialVersionUID = 4710406435745633366L; @ApiModelProperty(name ="id",value = "ID主键")
private String id; @ApiModelProperty(name ="roleCode",value = "角色代码")
private String roleCode; @ApiModelProperty(name ="roleName",value = "角色名称")
private String roleName; @TableField(exist = false)
private Set<Permission> permissions=new HashSet<>();
}

角色

package cn.zytao.taosir.common.model.user;

import java.io.Serializable;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; @Data
@ApiModel(value="权限实体")
public class Permission implements Serializable{ /**
*
*/
private static final long serialVersionUID = 1545962188193104351L; @ApiModelProperty(name ="id",value = "ID主键")
private String id; @ApiModelProperty(name ="permissionCode",value = "权限代码")
private String permissionCode; @ApiModelProperty(name ="permissionName",value = "权限名称")
private String permissionName; @ApiModelProperty(name="path",value="映射路径")
private String path;
}

权限

package cn.zytao.taosir.common.model.user;

import java.io.Serializable;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; @Data
@ApiModel(value="用户角色关系表")
public class UserRole implements Serializable{
/**
*
*/
private static final long serialVersionUID = 6163369825048118489L;
@ApiModelProperty(name ="id",value = "ID主键")
private String id;
@ApiModelProperty(name ="username",value = "用户名")
private String username;
@ApiModelProperty(name ="roleCode",value = "角色代码")
private String roleCode;
}

用户角色关系

package cn.zytao.taosir.common.model.user;

import java.io.Serializable;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; @Data
@ApiModel(value="角色权限关系表")
public class RolePermission implements Serializable{ /**
*
*/
private static final long serialVersionUID = -7522662317811377590L;
@ApiModelProperty(name ="id",value = "ID主键")
private String id;
@ApiModelProperty(name ="roleCode",value = "角色代码")
private String roleCode;
@ApiModelProperty(name ="permissionCode",value = "权限代码")
private String permissionCode;
}

角色权限关系

注解是swagger2的,无需关注。另外有个 @TableField(exist = false) 该注解标识这个字段非数据库字段

持久层处理:

@Select("select * from  role where role_code in(select role_code from user_role where username = #{username})")
Set<Role> getUserRoles(String username);
@Select("select * from permission where permission_code in (select permission_code from role_permission where role_code = #{roleCode})")
Set<Permission> getRolePermissions(String roleCode);

第一个sql为获取用户所拥有角色,第二个sql为获取角色所拥有权限

yml的配置上:

mybatis-plus:
type-aliases-package: cn.zytao.taosir.common.model.user
configuration:
map-underscore-to-camel-case: true

映射实体类,开起对下划线转大写的处理

业务处理上:

    public User findByUsername(String username) {
User user = userMapper.findByUsername(username);
Set<Role> roles = userMapper.getUserRoles(username);
for (Role role : roles) {
role.setPermissions(roleMapper.getRolePermissions(role.getRoleCode()));
}
user.setRoles(roles);
return user;
}

这样就可以很方便的解决多表的联查~因为本人比较懒,不想写配置版,也不喜欢在注解上用@Results来标示结果集

仍在不断学习中,如有不妥还望指教~

mybatis-plus注解版实现多表联查(sql)的更多相关文章

  1. SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)

    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...

  2. Spring Boot 实战 —— MyBatis(注解版)使用方法

    原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...

  3. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  4. mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法

    建表SQL: DROP TABLE IF EXISTS person; CREATE TABLE person( person_id serial PRIMARY KEY NOT NULL, pers ...

  5. mybatis plus 一对多,多表联查的使用小记

    阅读本博文需要有基础的mybatis以及mybatis plus知识,如果没有建议您了解相关的内容 本项目使用的是springboot构建的,数据库字段命名不严谨仅做演示测试使用,本文不做相关源码的解 ...

  6. 玩转SSH(五):Struts + Spring + MyBatis(注解版)

    本文将在 玩转SSH(四):Struts + Spring + MyBatis 的基础上进行一些小的改动,将原本是 xml 配置方式的项目,改成注解的配置方式. 要将项目改成注解方式,一般是将在 Sp ...

  7. Spring和MyBatis整合(注解版)

    1.导入所需要的依赖 <!--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis& ...

  8. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  9. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

随机推荐

  1. 出现$ref的原因及解决方案

    $ref的产生原因 (1)重复引用:一个集合/对象中的多个元素/属性都引用了同一个对象 (2)循环引用:集合/对象中的多个元素/属性在相互引用导致循环 针对fastjson的处理 fastjson作为 ...

  2. 在本地生成ssh-key 免密码远程clone GitLab中的项目到本地

    每次项目push.pull都需要输入账号和密码,很烦,方便免密pull与push代码,在本地需要用git bash 创建一个公钥,然后在gitlab中把公钥保存下来. 步骤如下: 1.打开 git b ...

  3. [SharePoint][SharePoint Designer 入门经典]Chapter13 客户端Silverlight编程

    1.使用Silverlight,CAML和Linq取得数据 2.编程性创建更新删除列表数据项 3.修饰列表和库的配置 4.管理文件和文件夹 5.修改快速启动和顶部导航条 [使用Silverlight, ...

  4. POJ 1944

    明天补上... 这道题的思路确实很精致.考虑到连的边肯定不会是一个环,所以至少有一个断点.于是,可以枚举这个断点.断点一确定,那么连边的走向也就确定了.用D[i]表示由i开始可以到达的最远点即可.对于 ...

  5. UML基本架构建模--获取类

     Getting Started 開始 Modeling a system involves identifying the things that are important to your p ...

  6. Hdu 4280 Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  7. POJ 1236 Network of Schools 强连通图

    Description A number of schools are connected to a computer network. Agreements have been developed ...

  8. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  9. [UVALive 6661 Equal Sum Sets] (dfs 或 dp)

    题意: 求从不超过 N 的正整数其中选取 K 个不同的数字,组成和为 S 的方法数. 1 <= N <= 20  1 <= K<= 10  1 <= S <= 15 ...

  10. 2016.02.25,英语,《Vocabulary Builder》Unit 02

    ag:来自拉丁语do.go.lead.drive,an agenda是要做事情的清单,an agent是代表他们做事的人,同时也是为他人做事的机构.拉丁语litigare包括词根lit,即lawsui ...