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://www.mzph.cn/web/7884.shtml

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

相关文章

无法添加以供审核,提交以供审核时遇到意外错误。如果问题仍然存在,请联系我们

遇到问题&#xff1a; 无法添加以供审核 要开始审核流程&#xff0c;必须提供以下项目&#xff1a; 提交以供审核时遇到意外错误。如果问题仍然存在&#xff0c;请联系我们。 解决办法&#xff1a; 修改备案号为小写&#xff0c; 例如&#xff1a;京ICP备2023013223号-2A 改…

NumPy及Matplotlib基本用法

NumPy及Matplotlib基本用法 导语NumPy导入与生成算术运算N维数组广播元素访问 Matplotlib简单图案绘制多函数绘制图像显示参考文献 导语 深度学习中经常需要对图像和矩阵进行操作&#xff0c;好在python提供了Numpy和Matplotlib库&#xff0c;前者类似一个已经定义的数组类&am…

Error Code: 1449. The user specified as a definer (‘admin‘@‘%‘) does not exist

前言 在进行MySQL数据库迁移或存储过程部署时&#xff0c;您可能会遇到错误 [Err] 1449 - The user specified as a definer (admin%) does not exist。这篇文章将为您提供一个详细的解决方案&#xff0c;帮助您顺利解决这一问题。 错误背景 此错误通常发生在尝试执行一个存…

扫描反代Cloudflare的IP 给网站CDN加速 免费制作自己的CDN加速

Cloudflare的CDN系统基本上每个站长都家喻户晓&#xff0c;大家都知道大陆对于搭建网站的审核力度&#xff0c;以至于Cloudflare并没有大陆的泛播节点&#xff0c;有也是只有香港节点。但是这些节点对于海外是加速效果&#xff0c;对于大陆就是一个字慢&#xff0c;晚高峰的情况…

JavaScript异步编程——02-Ajax入门和发送http请求

同步和异步回顾 同步和异步的简单理解 同步&#xff1a;必须等待前面的任务完成&#xff0c;才能继续后面的任务。 异步&#xff1a;不受当前任务的影响。 拿排队举例&#xff1a; 同步&#xff1a;在银行排队时&#xff0c;只有等到你了&#xff0c;才能够去处理业务。 异…

【C/C++】设计模式——单例模式

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

如何去官网下载windows10操作系统iso镜像

文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…

分享三维地理模型制作实践

前言 地理信息系统&#xff08;GIS&#xff09;是一种用于捕获、存储、检查和显示与地球表面位置相关的数据的计算机系统。GIS可以在一张地图上显示许多不同类型的数据&#xff0c;如街道、建筑物和植被。这使人们能够更容易地看到、分析和理解模式和关系。 GIS可以使用包括位…

Nginx从入门到精通速成

文章目录 一. **Nginx** **的简介**1.1 什么是 **nginx**1.2 正向代理1.3 反向代理1.4 **负载均衡**1.5 动静分离 二. **Nginx** **的安装**三. **Nginx** **的常用的命令**四. **Nginx** **的配置文件**五. **Nginx** **配置实例**反向代理实例**1**5.1 实现效果5.2 准备工作5…

织梦云端:网络信号原理的艺术解码

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《织梦云端&#xff1a;网络信号原理的艺术解码》&#xff0c;在这篇文章中&#xff0c;你将会学习到网络信号原理以及应用&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图…

Elasticsearch:使用 MongoDB connector 同步数据到 Elasticsearch

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。Elasticsearch 是一个高效强…

Windows Server 2019虚拟机安装

目录 第一步、准备工作 第二步、部署虚拟机 第三步、 Windows Server 2019系统启动配置 第一步、准备工作 下载Windows Server 2019系统镜像 官网下载地址&#xff1a;Windows Server 2019 | Microsoft Evaluation Center VMware Workstation 17下载地址&#xff1a; 链…

excel如何将多列数据转换为一列?

这个数据整理借用数据透视表也可以做到&#xff1a; 1.先将数据源的表头补齐&#xff0c;“姓名” 2.点击插入选项卡&#xff0c;数据透视表&#xff0c;在弹出对话框中&#xff0c;数据透视位置选择 现有工作表&#xff0c;&#xff08;实际使用时新建也没有问题&#xff09;…

Spring的基本应用

概述&#xff1a;Spring是由Rod Johnson组织开发的一个分层的java SE/EE一站式的轻量级开源框架&#xff0c;以IOC(控制反转)和AOP&#xff08;面向切面&#xff09;为核心&#xff0c;的开发模式。 注&#xff1a;喜欢的朋友可以关注公众号“JAVA学习课堂”系统学习相关技术&a…

Python自动化实战 —— 使用Selenium进行Web自动化!

为了完成一项重复的任务&#xff0c;你需要在网站上进行大量的点击和操作&#xff0c;每次都要浪费大量的时间和精力。Python的Selenium库就可以自动化完成这些任务。 在本篇文章中&#xff0c;我们将会介绍如何使用Python的Selenium库进行Web自动化&#xff0c;以及如何将它应…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…

快速修改禅道系统的管理员密码

目录 通过 web 登录页面忘记密码&#xff08;推荐&#xff09;通过数据库&#xff0c;修改 zt_user 表 通过 web 登录页面忘记密码&#xff08;推荐&#xff09; 只能修改管理员密码。 打开禅道地址&#xff0c;点击忘记密码会显示下面的页面&#xff1a; 根据提示在服务器的相…

【busybox记录】【shell指令】shuf

目录 内容来源&#xff1a; 【GUN】【shuf】指令介绍 【busybox】【shuf】指令介绍 【linux】【shuf】指令介绍 使用示例&#xff1a; 打乱内容 - 默认输出 打乱内容 - 最多输出n行 打乱内容 - 将输出写入文件 打乱内容 - 重复输出 打乱内容 - 打乱本条指令的参数 打…

并发控制互斥笔记

整理总结自蒋炎岩老师的b站课程&#xff0c;https://jyywiki.cn/OS/2022/index.html 多处理器系统中数据的一致性和互斥访问 所有的CPU的一级缓存都是连着的&#xff0c;如果是多个CPU的话&#xff0c;用在内存中放置标志位&#xff0c;来保证对当前内容的原子性读取&#xff0…

第六代移动通信介绍、无线网络类型、白皮书

关于6G 即第六代移动通信的介绍&#xff0c; 图解通信原理与案例分析-30&#xff1a;6G-天地互联、陆海空一体、全空间覆盖的超宽带移动通信系统_6g原理-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞34次&#xff0c;收藏165次。6G 即第六代移动通信&#xff0c;6G 将在5G 的基…