Mybatis进阶4-权限管理

权限管理

1.权限        //相当于 职责

2.用户        //相当于 职员(职员就职于一个职位)

3.角色        //相当于 职位(有多个职责) 

权限管理基础表:权限表,用户表,角色表

问题1:一个用户可以有多个角色吗  y

问题2:一个角色可以被多个用户使用吗 y

问题3:一个角色可以有多个权限吗 y

问题4:一个权限可以被多个角色使用 y

权限管理需要的表:用户表<=用户角色表=>角色表<=角色权限表=>权限表

这就是权限5张表

那么我们现在数据库创建五张表

-- 权限表
CREATE TABLE Permission (PermissionID INT PRIMARY KEY,PermissionName VARCHAR(255) NOT NULL
);insert into Permission(permissionid, permissionname) VALUE (1,'查询'),(2,'添加'),(3,'删除'),(4,'修改');-- 角色表
CREATE TABLE Role (RoleID INT PRIMARY KEY,RoleName VARCHAR(255) NOT NULL
);
insert into Role(RoleID, RoleName) VALUE (1,'管理员'),(2,'会员'),(3,'游客');-- 用户表
CREATE TABLE User (UserID INT PRIMARY KEY,UserName VARCHAR(255) NOT NULL
);
insert into User(UserID, UserName) VALUE (1,'赫赫'),(2,'贝贝'),(3,'卡卡'),(4,'零零'),(5,'喜喜');-- 权限和角色的第三张表
create table Permission_Role
(Permission_id int,Role_id int,primary key (Permission_id,Role_id), -- 主键对foreign key Permission_Role(Permission_id) references Permission(PermissionID),foreign key Permission_Role(Role_id) references Role(RoleID)
);
-- 用户和角色的第三张表
create table User_Role
(User_id int,Role_id int,primary key (User_id,Role_id),foreign key User_Role(User_id) references User(UserID),foreign key User_Role(Role_id) references Role(RoleID)
);insert into Permission_Role(Permission_id, Role_id) VALUE (1,1),(2,1),(3,1),(4,1),(1,2),(2,2),(1,3);
insert into User_Role(User_id, Role_id) VALUE (1,1),(2,2),(3,2),(4,3),(5,3);
insert into User_Role(User_id, Role_id) VALUE (1,2),(1,3),(2,3),(3,3);

 Permission表

Role表

User表

Permission_Role表

 User_Role

用户功能

修改用户

当用户表和用户角色表有关联时;不能直接修改用户表中的主键数据(有外键约束)

a

1.根据主键数据,查询用户角色表中所有数据

 例如:查出的结果

        1,1

        1,2

        1,3

2.删除用户角色表中所有的数据(删除user_id=1)

3.修改用户表中的主键值(主键回填)

4.向用户角色表中插入数据

        新主键值,1

        新主键值,2

        新主键值,3

删除用户

当用户表和用户角色表有关联时;不能直接删除用户表中的主键数据(有外键约束)

a

1.先删除用户角色表中匹配的数据

2.在删除用户表中的数据

分页查询

我们要是实先查询某个用户和以及对应的角色信息,这就要用到角色表和用户表,和用户角色表

这就是多表查询,所以要用到映射文件

先写sql

先查询

select userid, username, roleid, rolename from  user inner join user_role inner join role
on user.UserID = user_role.User_id and user_role.Role_id = role.RoleID ;

 

select userid, username, roleid, rolename from  user inner join user_role inner join role
on user.UserID = user_role.User_id and user_role.Role_id = role.RoleID limit 1,3;

这样查询出来的结果是不对的,因为这是先用户和角色一一对应才取了前三行,并不是前三个用户的所有信息

修改:这时先在用户表取三条数据,再去角色表中对应,这才是正确的

select userid, username, roleid, rolename from (select * from mysql_day3.user limit 1,3) as user inner join user_role inner join role
on user.UserID = user_role.User_id and user_role.Role_id = role.RoleID;

一个用户对应多个角色,一对多查询,在用户类中添加角色数组属性

public class User {private int userID;private String userName;private List<Role> userRoles;public List<Role> getUserRoles() {return userRoles;}public void setUserRoles(List<Role> userRoles) {this.userRoles = userRoles;}public User() {}public User(int userID, String userName) {this.userID = userID;this.userName = userName;}public int getUserID() {return userID;}public void setUserID(int userID) {this.userID = userID;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}@Overridepublic String toString() {return "User{" +"userID=" + userID +", userName='" + userName + '\'' +'}';}
}

 UserMapper接口

/*** 分页查询用户及角色信息* @param index 起始索引* @param size 查询条数* @return 存储用户对象的集合*/public List<User> findUserByPage(@Param("index") int index,@Param("size") int size);

UserMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hhh.dao.UserMapper">
//配置主表的字段和实体类的属性对应<resultMap id="userMap" type="com.hhh.pojo.User"><id column="userid" property="userID"/><result column="username" property="userName"/>
//配置从表的<collection property="userRoles" javaType="java.util.List" ofType="com.hhh.pojo.Role"><id column="roleid" property="roleId"/><result column="rolename" property="roleName"/></collection></resultMap><select id="findUserByPage" resultMap="userMap">select userid, username, roleid, rolename from(select userid, username from mysql_day3.user limit #{index},#{size}) as user inner join user_role inner join roleon user.UserID = user_role.User_idand user_role.Role_id = role.RoleID;</select></mapper>

测试

    @Testpublic void testFindUserByPage(){SqlSession sqlSession = MybatisUtil.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.findUserByPage(1, 3);//查询前三个用户for (User user : users) {System.out.println("用户信息为"+user);List<Role> userRoles = user.getUserRoles();for (Role role : userRoles) {System.out.println("该用户的角色为"+role);}System.out.println("-------");}MybatisUtil.closeSqlSession(sqlSession);}

结果:

我们可以把Service层也写了

 先写一个接口

public interface UserService {/*** 根据页数查询用户数据* @param currentPage 当前页数* @param pageSize 页数的条数* @return 返回用户数组*/public List<User> queryUserByPage(int currentPage,int pageSize);
}

在写该接口的实现类

public class userServiceImp  implements UserService {/*** 根据页数查询用户数据* @param currentPage 当前页数* @param pageSize 页数的条数* @return 返回用户数组*/@Overridepublic List<User> queryUserByPage(int currentPage, int pageSize) {//计算索引//起始索引=(当前页码-1)*页码条数int beginIndex=(currentPage-1)*pageSize;//调用dao层的方法SqlSession sqlSession = MybatisUtil.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userByPage = userMapper.findUserByPage(beginIndex, pageSize);MybatisUtil.closeSqlSession(sqlSession);return userByPage;}
}

web层

public class testUserService {@Testpublic void testqueryUserByPage(){UserService service=new userServiceImp();List<User> users = service.queryUserByPage(2, 3);for (User user : users) {System.out.println("用户信息为"+user);List<Role> userRoles = user.getUserRoles();for (Role role : userRoles) {System.out.println("该用户的角色为"+role);}System.out.println("-------");}}}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2005-2021年全国各地级市生态环境注意力/环保注意力数据(根据政府报告文本词频统计)

2005-2021年全国各地级市生态环境注意力/环保注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 2005-2021年全国各地级市生态环境注意力/环保注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 1、时间&#xff1a;2005-2021年 2、范围&#xff1a;2…

BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU、TCN-BIGRU-ATTENTION合集

&#xff08;BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU、TCN-BIGRU-ATTENTION&#xff09;时&#xff0c;我们可以从它们的基本结构、工作原理、应用场景以及优缺点等方面进行详细介绍和分析。 BIGRU、CNN-BIGRU、CNN-BIGRU-ATTENTION、TCN-BIGRU等&#xff08;matlab…

DDR4 新功能介绍

DDR4(第四代双倍数据率同步动态随机存取内存)相较于其前代DDR3,引入了一些新的功能和改进,这些新功能有助于提高内存的性能、降低功耗以及增强系统的可靠性,包括VPP、DBI(Data Bus Inversion,数据总线翻转)和DMI(与LPDDR4相关)。以下是对这些功能的简要说明: 更高的…

Python | Leetcode Python题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution:def addBinary(self, a, b) -> str:return {0:b}.format(int(a, 2) int(b, 2))

synchronized与volatile关键字

1.synchronized的特性 1.1互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到 同一个对象 synchronized 就会阻塞等待. 进入 synchronized 修饰的代码块, 相当于 加锁 退出 synchronized 修饰的代码块, 相当于 解锁 syn…

关于在Conda创建的虚拟环境中安装好OpenCV包后,在Pycharm中依然无法使用且import cv2时报错的问题

如果你也掉进这个坑里了&#xff0c;请记住opencv-python&#xff01;opencv-python&#xff01;&#xff01;opencv-python&#xff01;&#xff01;&#xff01; 不要贪图省事直接在Anaconda界面中自动勾选安装libopencv/opencv/py-opencv包&#xff0c;或者在Pycharm中的解…

Redis Cluster on K8s 大揭密

之前我们针对 Redis 容器化&#xff0c;做了一些讨论&#xff1a; 《Redis 容器化&#xff0c;是不是个“软柿子”》&#xff0c;业界不乏相关的实践分享&#xff0c;KubeBlocks 也针对 Redis Cluster 做了适配并有对应的解决方案。在 Redis 容器化的过程中&#xff0c;KubeBlo…

VBA 根据表格指定列拆分多sheet

一. 需求 ⏹ 根据部分列&#xff0c;拆分数据到多个sheet页 二. 代码 ⏹ 重点代码摘要 CreateObject("scripting.dictionary")&#xff1a;创建一个字典对象&#xff0c;相当于Java中的MapDim aRef() As String&#xff1a;定义一个存储字符串类型的数组ReDim aRe…

嵌入式C语言教程:实现声音监测系统

声音监测在许多应用中都十分重要&#xff0c;如噪声控制、安全系统、和智能家居控制。 本教程将介绍如何在STM32微控制器上使用模数转换器&#xff08;ADC&#xff09;和声音传感器实现实时声音监测系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32F746NG&…

雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 专注 从商业角度看&#xff0c;专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理&#xff0c;大家的第一反应可能是“风险会不会…

爬虫学习(4)每日一笑

代码 import requests import re import osif __name__ "__main__":if not os.path.exists("./haha"):os.makedirs(./haha)url https://mlol.qt.qq.com/go/mlol_news/varcache_article?docid6321992422382570537&gameid3&zoneplat&webview…

uni-app+vue3 +uni.connectSocket 使用websocket

前言 最近在uni-appvue3websocket实现聊天功能&#xff0c;在使用websocket还是遇到很多问题 这次因为是app手机应用&#xff0c;就没有使用websocket对象&#xff0c;使用的是uni-app的uni.connectSocket 为了方便测试这次用的是node.js一个简单的dom&#xff0c;来联调模拟…

Skywalking数据持久化与自定义链路追踪

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Skywalking详解 一&#xff0c;Sky walking数据持久化 Sky walking提供了es&#xff0c;MySQL等数据持久化方案&#xff0c;默认使用h2基于内存的数据库&#xff0c;重启之后数据即会丢失。 在实际工…

【智能算法】人类进化优化算法(HEOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;J Lian受到人类进化启发&#xff0c;提出了人类进化优化算法&#xff08;Human Evolutionary Optimization Algorithm, HEOA&#xff09;。 2.算法原理 2.1算法思想 …

[正则表达式]正则表达式语法与运用(Regular Expression, Regex)

0. 在线工具 RegExr: Learn, Build, & Test RegEx 1. 场景列举 vim Linux命令行 sublime 编辑器 java、python等语言中 ... ... 不同场景、不同版本语法可能不一样 2. 以下示例数据与基本语法 &2024 &As20242024# 2024sA#abdcefgha_bdcefghABASDSADAASDASD…

【第11章】spring-mvc默认转换器

文章目录 前言一、DateFormatter二、NumberFormat1. NumberBean2. number.jsp 三、ConverterController四、执行结果总结 前言 【第6章】spring类型转换器 此章节内容为spring类型转换器内容扩展,使用spring提供的注解增强转换器功能,让date和int等类型转换更加方便。 一、Da…

【笔试训练】day21

1.爱丽丝的人偶 题目意思就是构造一个序列&#xff0c;序列的每个元素要么比左右两个高&#xff0c;要么比左右两个低。 可以看成是一条上下波动的曲线。 我们可以模拟波动的这个过程。 假设有一个数组&#xff0c;里面元素是1-n.遍历每一个位置。用一个指针pos来表示当前检…

智慧之巅:大数据与算力中心的融合演进

智慧之巅&#xff1a;大数据与算力中心的融合演进 1 引言 在这个数据驱动的时代&#xff0c;我们站在了一个前所未有的历史节点上。大数据和算力中心&#xff0c;这两个曾经各自为政的领域&#xff0c;如今正以一种前所未有的方式交织在一起&#xff0c;共同推动着数字经济的蓬…

阿里云CentOS 7.9 64位 Liunx 安装redis

具体的步骤如下&#xff1a; 添加 EPEL 仓库&#xff0c;因为 Redis 在标准的 CentOS 仓库中不可用&#xff1a; sudo yum install epel-release安装 Redis&#xff1a; sudo yum install redis启动 Redis 服务&#xff1a; sudo systemctl start redis如果你想让 Redis 在…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…