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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 补课

学了JAVA WEB应用,补充一下HTML的标签,常用的,不然页面都画不出来了~~test 标题,h1h2h3 3个字号test 段落link 链接 使用 Target 属性,你可以定义被链接的文档在何处显示。下面的这行会在新窗口打开文档:Vi…

python 角度传感器模拟_python树莓派红外反射传感器

本文实例为大家分享了python树莓派红外反射传感器的程序,供大家参考,具体内容如下1、工具rpi3,微雪ARPI600,Infrared Reflective Sensor2、基本原理Infrared Reflective Sensor 输出数字和模拟信号模拟信号通过ARPI600上的AD转换芯…

java构造方法赋值内存图_java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念...

1.构造器(或构造方法):Constructor构造器的作用:* 1.创建对象* 2.初始化对象的信息2.使用说明:* 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器* 2.定义构造器的格式:权限修饰符 类名(形参列表){}…

java 集合modcount_源码|jdk源码之LinkedList与modCount字段

链表是对上一篇博文所说的顺序表的一种实现。与ArrayList思路截然不同,链表的实现思路是:不同元素实际上是存储在离散的内存空间中的。每一个元素都有一个指针指向下一个元素,这样整个离散的空间就被“串”成了一个有顺序的表。从链表的概念来…

idea 新建ssm java ee_IDEA搭建SSM项目实现增删改查

首先打开IDEA,File—>New—>Project创建项目选择左侧导航栏里的Maven,勾上勾,选择webapp按如下图进行填写创建完成后进入项目,右下角弹出的提示点击右边的Enable Auto-Import,自动配置连接数据库,我用…

php mail centos_centos怎么发送邮件

一、安装sendmail与mail1、安装sendmail:1) centos下可以安装命令:yum -y install sendmail2) 安装完后启动sendmail命令:service sendmail start2、安装mail安装命令:yum install -y mailx二、发送邮件1、通过文件内容发送发送命…

php文件的作用,php入口文件的作用-PHP问题

php入口文件的作用php入口文件能够完成主动加载性能。解析PHP入口文件的主动加载性能php的主动加载:正在php5之前,咱们要用某个类或类的办法,那必需include或许require,之后能力应用,每一次用一个类,都需求…

java中随机数边界问题,java 简单Dice问题(随机数的运用)

[java]代码库/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

java单词测试,java单词 - 在线打字测试(dazi.kukuw.com)

java单词贡献者:15533470608类别:英文 时间:2018-08-04 22:32:16 收藏数:20 评分:0返回上页举报此文章请选择举报理由:广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的文章改错字public static…

java vector list,Java基础之:List——ArrayList Vector

Java基础之:List——ArrayList & VectorArrayList简单介绍ArrayList实现了List接口,底层是一个数组,并实现了可变的功能。底层属性(transient Object[] elementData;)在序列化时,忽略该属性。ArrayList实现了List接口&#xf…

钉钉 php 推送,微信模板推送,钉钉信息推送

上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案&#xf…

涡轮机叶片matlab强度分析论文,一种基于MATLAB及Pro_E的涡轮建模方法

自动化与控制与二一种基于MATLAB及Pro/E的涡轮建模方法王智明(中海油服油田技术事业部北京1011&am…