mysql用户权限表join_MyBatis映射利用mysql left join 解决N+1查询问题

1.权限是几乎每个系统都需要的

2.一般在用户请求某个url的时候,都需要验证用户是否拥有该url的访问权限

3.最简单的权限系统需要 用户表,角色表,用户角色表,权限表,角色权限表

f5a6123455c3b42b7ea9bd1c4a451caf.png

4bb9375a4068cea42ea14911ccfc80c3.png

fdcc89faa84ff56535eb5e154bbaec4e.png

c75fec7d8a03d2d9be6ad7c492b822e3.png

7fd0af4ce29c7f76a4d708a6dc8f39b4.png

f010e896aecb92037728df5905c66483.png

# Host: 127.0.0.1 (Version: 5.6.22)

# Date: 2015-04-09 10:52:58

# Generator: MySQL-Front 5.3 (Build 4.13)

/*!40101 SET NAMES utf8 */;

#

# Source for table "privilege"

#

CREATE TABLE `privilege` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

`url` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "privilege"

#

INSERT INTO `privilege` VALUES (1,'产品增加','/product/add'),(2,'产品删除','/product/delete'),(3,'产品修改','/product/update'),(4,'产品查询','/product/query');

#

# Source for table "role"

#

CREATE TABLE `role` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

#

# Data for table "role"

#

INSERT INTO `role` VALUES (1,'admin'),(2,'manager'),(3,'guest');

#

# Source for table "role_priv"

#

CREATE TABLE `role_priv` (

`role_id` int(11) NOT NULL,

`priv_id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "role_priv"

#

INSERT INTO `role_priv` VALUES (1,1),(2,1),(1,3);

#

# Source for table "user"

#

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

#

# Data for table "user"

#

INSERT INTO `user` VALUES (1,'jack'),(2,'jaychang'),(3,'jasaon'),(4,'lucy'),(5,'marry');

#

# Source for table "user_role"

#

CREATE TABLE `user_role` (

`user_id` int(11) NOT NULL DEFAULT '0',

`role_id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#

# Data for table "user_role"

#

INSERT INTO `user_role` VALUES (1,1),(1,3),(3,2),(2,2);

4.表对应的实体类

放在了sample包下

public class Privilege {

private Integer id;

private String name;

private String url;

...省略get,set方法

}

public class User {

private Integer id;

private String name;

private List roles;

...省略get,set方法

}

public class Role {

private Integer id;

private String name;

private List privileges;

...省略get,set方法

}

5.mybatis配置文件

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

6.UserMapper.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select u.id as user_id,u.name as user_name,r.id as role_id,

r.name as role_name,p.id as priv_id,p.name as priv_name,p.url as priv_url

from user u

left join user_role ur on u.id = ur.user_id

left join role r on r.id = ur.role_id

left join role_priv rp on r.id = rp.role_id

left join privilege p on p.id = rp.priv_id

where u.id = #{id}

测试

List users = sqlSession.selectList("selectUserById", 1L);

for (User u : users) {

System.out.println("用户名:" + u.getName());

List roles = u.getRoles();

if (null != roles) {

for (Role role : roles) {

System.out.println(" 拥有角色:" + role.getName());

List privs = role.getPrivileges();

if (null != privs && privs.size() > 0) {

System.out.println(" 该角色【" + role.getName()

+ "】,拥有的权限:");

for (Privilege priv : privs) {

System.out.println(" " + priv.getName()

+ "," + priv.getUrl());

}

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 爬取贝壳网小区名称_如何使用 python 爬取全国小区名称

前言笔者在做一个 NLPNLPNLP 项目时,需要识别小区名,因此想要查询网上是否有相关的数据集。经过一番搜索后一无所获…从而决定自己来爬取这份数据。由于爬取网站的内容信息之后可能会发生变更,因此此处给出具体的爬虫思路,便于应对…

mysql hint 简书_MySQL

为满足不同数据库设计要求,减少数据冗余而指定设计规范,可称为数据库范式数据库范式呈递次规范,即高阶范式必然满足低阶范式越高的数据库范式意味着越严格的设计要求,同时数据冗余越小第一范式(1NF):数据库表的每一列都…

python获取手机通知栏消息_Python编写简单的通知栏脚本启动工具

随着自己编写的脚本与安装的工具越来越多,电脑的桌面和文件夹也越来越乱了。就在前几天因为一个不小心,我把自己的一个项目给删了,所以决定将电脑整理一下。不过这一整理我很多脚本和工具的位置我就忘记了,所以决定写个小工具来快速启动一些常用的脚本或工具这里选择Python是因…

java 圆 继承_java 类的继承(转)

这个星期主要是学习了Java中类的继承问题.继承就是由已有的类创建新类,通过子类继承父类的方法,实现一些功能.下面就是老师布置作业的其中一个:定义父类圆,通过继承,获得子类球、圆锥、圆柱,子类具有计算体积的功能。1)新建文件夹Test1&#…

java爬虫 京东_Java爬虫实现京东物流查询

网上没有免费的接口,只能自己写一套了,参考代码如下public static JSONObject getLastInfo(String no){JSONObject jsonObjectnew JSONObject();jsonObject.put("no", no);Connection connectionJsoup.connect("http://www.jdwl.com/orde…

java list stream avg_Java 8 Stream API中的多个聚合函数

要在没有自定义收集器的情况下执行此操作(不再对结果进行流式传输),您可以这样做.它有点脏,因为它首先收集到Map< String,List< TimePeriodCalc>>然后流式传输该列表并获得平均加倍.由于你需要两个平均值,它们被收集到一个Holder或一对,在这种情况下我使用的是Abst…

java 发送邮件昵称_利用JavaMail发送QQ邮件

一、RFC882文档简单说明RFC882文档规定了如何编写一封简单的邮件(纯文本邮件)&#xff0c;一封简单的邮件包含邮件头和邮件体两个部分&#xff0c;邮件头和邮件体之间使用空行分隔。邮件头包含的内容有&#xff1a;from字段   --用于指明发件人to字段    --用于指明收件…

java没有timer类_Java中的Java.util.Timer类 - Break易站

scheduleAtFixedRate(TimerTask task, long delay, long period): java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)在指定的延迟语法后开始&#xff0c;为重复的固定速率执行调度指定的任务&#xff1a;public void scheduleAtFixedRate(TimerT…

java select下拉标签_java中下拉框select和单选按钮的回显操作

前提&#xff1a;1.下拉框select请选择部门selected"selected">${department.department}2.单选按钮radio的回显checked"checked">checked"checked">补充知识&#xff1a;java使用apache commons-fileupload组件实现文件上传(控制文件上…

java 访问控制权限_Java访问控制权限有哪些?区别是什么?

原标题&#xff1a;Java访问控制权限有哪些&#xff1f;区别是什么?Java中的类和方法等都是有访问控制权限的&#xff0c;用来控制方法、类、属性等的生效范围&#xff0c;Java有四种访问控制权限&#xff0c;其中比较常用的就是public和private&#xff0c;今天华清远见Java学…

java 操作cursor数据库_Java连接各种数据库以及调用存储过程

准备工作&#xff1a;1. 创建表drop table T_TEST_PROCEDURE cascade constraints;/**//*Table: T_TEST_PROCEDURE*//**/createtable T_TEST_PROCEDURE (IDNUMBER(19) not null,NAMEVARCHAR2(40),AGE NUMBER(3),constraintPK_T_TEST_PROCEDURE primary key (ID));2. 创建存储过…

java 规格overview_《Java數據結構和算法》- OverView

Q: 不同數據結構的優缺點&#xff1f;數據結構優點缺點數組(Array)快速訪問&#xff0c;如果知道下標&#xff0c;就可以非常快地存取查找慢&#xff0c; 插入或刪除慢&#xff0c; 大小固定有序數組(OrderedArray)比無序的數組查找快插入或刪除慢&#xff0c;大小固定棧(Stack…

mysql 集群怎么卸载节点_Greenplum移除节点

基于某某原因&#xff0c;我们的Greenplum需要卸载一个节点(测试环境的Greenplum集群)&#xff0c;由于该集群使用了很久&#xff0c;里面有许多开发所需要的数据&#xff0c;所以在卸掉一个节点后&#xff0c;还要保证数据不会丢失。当然&#xff0c;期间也遇到了点问题&#…

mysql2012更改表名_T-SQL入門攻略之13-修改数据表

--> Title : T-SQL入門攻略之13-修改数据表--> Author : wufeng4552--> Date : 2010-07-12修改表名与字段名—sp_rename--1修改表名SQL Server不直接提供修改表名的T-SQL语句&#xff0c;但是可以通过存储过程实现语法格式&#xff1a;sp_rename tablename,newtabl…

python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?

前言相传&#xff0c;就在前几日&#xff0c;在网上闲逛时&#xff0c;刷到了一个猜歌的小程序。这个小程序通过播放歌曲部分片段&#xff0c;然后让用户来猜它的歌名&#xff0c;大概是这样的&#xff1a;作为一个脑热的听歌爱好者&#xff0c;于是他越陷越深&#xff0c;越刷…

java调用oracle存储过程_做一点,记一点 ~ Java调用Oracle存储过程

一、需求传入一个参数&#xff0c;返回一条或多条记录(列表)。二、实现步骤1. 编写Oracle存储过程。-- 声明包和包体的语句应该分两次执行&#xff0c;即使声明在前定义在后&#xff0c;如果一起执行依然会编译出错--调用能够返回多条记录的存储过程需要定义在包内--声明包及包…

java 从控制台读取_转载 java从控制台读取输入的方法

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class MainClass { public static void method1() { //使用Scanner Scanner scannernew Sca…

trace java_使用java动态字节码技术简单实现arthas的trace功能。

参考资料用过[Arthas]的都知道&#xff0c;Arthas是alibaba开源的一个非常强大的Java诊断工具。不管是线上还是线下&#xff0c;我们都可以用Arthas分析程序的线程状态、查看jvm的实时运行状态、打印方法的出入参和返回类型、收集方法中每个代码块耗时&#xff0c;甚至可以监控…

顺时针小球圆周运动Java编程_如何使用CSS实现圆周运动小球的实例

我们时常在页面中见到一些动画效果&#xff0c;这些动画效果&#xff0c;很多可以仅通过CSS来实现。在这里我们用到了CSS3的animation属性。animation 属性是一个简写属性&#xff0c;用于设置六个动画属性&#xff1a;animation-name 规定需要绑定到选择器的 keyframe 名称。a…

java swing 外观框架_【GUI】一、Swing外观框架BeautyEye使用

一、Swing外观框架BeautyEye使用1.1 导包1.2 使用BeautyEye L&Fpublic static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {// 国人牛逼主题&#xff0c;值得学习// 初始化字体InitGlobalFont(new Font("微软雅黑", F…