mybatis-plus注解版实现多表联查(sql)
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)的更多相关文章
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- Spring Boot 实战 —— MyBatis(注解版)使用方法
原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...
- Spring Boot整合MyBatis(非注解版)
Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...
- mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法
建表SQL: DROP TABLE IF EXISTS person; CREATE TABLE person( person_id serial PRIMARY KEY NOT NULL, pers ...
- mybatis plus 一对多,多表联查的使用小记
阅读本博文需要有基础的mybatis以及mybatis plus知识,如果没有建议您了解相关的内容 本项目使用的是springboot构建的,数据库字段命名不严谨仅做演示测试使用,本文不做相关源码的解 ...
- 玩转SSH(五):Struts + Spring + MyBatis(注解版)
本文将在 玩转SSH(四):Struts + Spring + MyBatis 的基础上进行一些小的改动,将原本是 xml 配置方式的项目,改成注解的配置方式. 要将项目改成注解方式,一般是将在 Sp ...
- Spring和MyBatis整合(注解版)
1.导入所需要的依赖 <!--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis& ...
- SpringBoot整合Mybatis【非注解版】
接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 选择Spring Initializr,配置JDK版本 输入项目名 选择构建web项目所需的state ...
- SpringBoot + MyBatis(注解版),常用的SQL方法
一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...
随机推荐
- CF787A - The Monster
/* CF787A - The Monster http://codeforces.com/contest/787/problem/A 数学 扩展欧几里得 注意x或y为0的时候要特判 并且结果要大于b ...
- 洛谷——P2657 低头一族
https://www.luogu.org/problem/show?pid=2657 题目描述 一群青年人排成一队,用手机互相聊天. 每个人的手机有一个信号接收指标,第i个人的接收指标设为v[i]. ...
- rabbitMQ学习笔记(五) 消息路由
生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...
- 【树形DP】 HDU 2196 Computer
题意:求节点间的最大距离 先DFS一次 记录下 每一节点的子树下的最大距离(DP[ u ] [ 0 ])和第二大距离(DP[ u ] [ 1 ]) 用DP[ v ] [ 2 ] 表示由v的父节点来的最 ...
- IOS-2-C语言和Objective-C语言衔接学习资料
前言:在IOS学习中.通常会先学习一周的C语言,两周的Objective-C语言,这是今后开发的最基础最重要的部分,以下给大家分享一下培训课上的精简资料: C语言和Objective-C语言衔接学习资 ...
- Android 零基础学习之路
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正則表達式. 3.面向对象的抽象.封装,继承,多态.类与对象.对象初始化 ...
- 源码高速定位工具-qwandry
https://github.com/adamsanderson/qwandry qwandry 能高速定位到我们须要找到 库文件, 项目 的工具. Ruby中实现高速定位的方法有好多种.我知道的有三 ...
- hdoj--3440--House Man(差分约束)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- matlab基本语法
MATLAB基本语法 点乘运算 , 常与其他运算符 点乘运算,常与其他运算符联合使用(如.\) 矩阵生成 矩阵生成 向量生成或子阵提取本节将会介绍一些MATLAB的基本语法的使用. 持续更新... 在 ...
- 阿里云服务器用Docker配置运行nginx并访问
一.Docker拉取nginx镜像 docker pull nginx:1.12.2 这里是下载的是nginx的1.12.2版本,其他版本的镜像请访问https://hub.docker.com/r/ ...