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.hqwc.cn/news/674722.html

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

相关文章

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC&#xff08;系统级芯片&#xff09;处理器&#xff0c;适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU&#xff0c;集成了GPU、MCU、NPU、VPU等多种计算核心&#xff0c;并具有丰富的外…

KAN: Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接&#xff1a;https://arxiv.org/abs/2404.19756 代码链接&#xff1a;https://github.com/KindXiaoming/pyKAN 项目链接&#xff1a;https://kindxiaoming.github.io/pyKAN/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

【Linux网络】网络文件共享

目录 一、存储类型 二、FTP文件传输协议 2.1 FTP工作原理 2.2 FTP用户类型 2.3 FTP软件使用 2.3.1 服务端软件vsftpd 2.3.2 客户端软件ftp 2.4 FTP的应用 2.4.1 修改端口号 2.4.2 匿名用户的权限 2.4.3 传输速率 三、NFS 3.1 工作原理 3.2 NFS软件介绍 3.3 NFS配…

OpenCV 入门(三)—— 车牌筛选

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

Android 巧用putBinder方法传递大文件

使用Intent传递数据大家都知道&#xff0c;但是如果你使用Intent传递大于1Mb的数据时&#xff0c;就一定会报如下的错误&#xff1a; Caused by: android.os.TransactionTooLargeException: data parcel size 1049112 bytes 就是说你的传输数据太大了&#xff0c;当前的大小达…

ILI9341显示驱动芯片的使用

ILI9341是一种常见的TFT LCD显示驱动芯片&#xff0c;它在众多的应用中都有广泛的使用。这种芯片的一个显著特点是它支持16位RGB565颜色&#xff0c;这意味着它可以显示多达65536种不同的颜色。这使得ILI9341能够提供鲜艳、生动的色彩效果&#xff0c;对于需要表现丰富色彩的应…

Selenium自动化测试面试题全家桶

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Java的Fork-Join简单介绍

Java的Fork-Join框架是Java 7引入的一个用于并行处理的轻量级框架&#xff0c;它基于分治策略&#xff08;Divide and Conquer&#xff09;&#xff0c;特别适合于那些可以被分解为多个子任务的任务。Fork-Join框架的核心思想是将一个大任务&#xff08;Task&#xff09;拆分成…

如何获得一个Oracle 23ai数据库(Virtual Appliance)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第1种&#xff1a; Virtual ApplianceRPM安装Docker 从此处下载虚拟机。 可以看到虚拟机需要4G内…

基于FPGA的数字电子钟VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的数字电子钟VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字电子钟 1)设计一个能显示秒、分、时的24小时数字钟 2)用数码管显示出时&#xff0c;分&#xff0c;…

Windows Server 2003安装DHCP服务器

0x00 前言 需要一个dhcp服务器&#xff0c;但是电脑只有一个windows server 2003&#xff0c;凑合着用的。 0x01 安装DHCP服务器 1. 打开控制面板&#xff0c;添加删除程序–添加/删除Windows组件–网络服务&#xff0c;勾选网络服务。 2. 点击【详细信息】&#xff0c;勾选…

Microsoft 365 for Mac v16.84 office365全套办公软件

Microsoft 365 for Mac是一款功能丰富的办公软件套件&#xff0c;为Mac用户提供了丰富的功能和工具&#xff0c;提高了工作效率和协作能力。Microsoft 365 for Mac是一款专为Mac用户设计的订阅式办公软件套件&#xff0c;旨在提高生产力和效率。 Microsoft 365 for Mac v16.84正…