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.rhkb.cn/news/321220.html

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

相关文章

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

如何做好一个活动策划?

活动策划的关键要素是什么&#xff1f; 首先&#xff0c;要明确一个概念:做活动就是走钢丝&#xff0c;没有保险的高空走钢丝!因为&#xff0c;活动没有“彩排”&#xff0c;只有现场"直播”! 无论什么类型的活动&#xff0c;人数是50人还是2000人&#xff0c;也不论预算…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送&#xff0c;又一个128天过去了&#xff0c;整天的工作和生活都在忙忙碌碌中度过&#xff0c;每到能静下来片刻&#xff0c;都倍感珍惜。因为一些原因&#xff0c;能够陪伴家人的时间越来越少&#xff…

[译]Elasticsearch _source Doc_values And Store Performance

原文地址 https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html 在这篇博文中&#xff0c;我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上&#xff0c;Lucene&#xff08;Elasticsearch 和 Solr 构建的…

SOL链DApp智能合约代币质押挖矿分红系统开发

随着区块链技术的不断发展和普及&#xff0c;越来越多的项目开始探索基于区块链的去中心化应用&#xff08;DApp&#xff09;。Solana&#xff08;SOL&#xff09;作为一条高性能、低成本的区块链网络&#xff0c;吸引了众多开发者和项目&#xff0c;其中包括了各种类型的DApp&…

SpringBoot实现Config下自动关联.xml、.properties配置信息的实例教程

本篇文章主要讲解在SpringBoot实现Config下自动关联.xml、.properties配置信息的实例教程。 日期&#xff1a;2024年5月4日 作者&#xff1a;任聪聪 .properties文件调用方法 步骤一、打开我们的 .properties 创建一个demo参数如下图&#xff1a; 步骤二、创建一个config的包&…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff08;2&#xff09;输入services.msc&#xff0c;点击【确定】&#xff1b; &#xff08;3&#xff09;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&am…

手撸Mybatis(三)——收敛SQL操作到SqlSession

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 引言 在上一章中&#xff0c;我们实现了读取mapper配置并构造相关的mapper代理对象&#xff0c;读取mapper.xml文件中的sql信息等操作&#xff0c;现在&#xff0c;在上一章的基础上&#xff0c…

Qt---day2-信号与槽

1、思维导图 2、 拖拽式 源文件 #include "mywidget.h" #include "ui_mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MyWidget) { ui->setupUi(this); //按钮2 this->btn2new QPushButton("按钮2",th…

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机&#xff1f;手机环境怎么搭建&#xff1f;这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 &#xff1a; 步骤一&#xff1a;手机调试 苹果手机系统配置推荐&#xff1a;iPhone6S以上&#xff0c;16G。 注意&#xff1a;如果是选择购入二手手机…

Linux系统使用Docker安装青龙面板并实现远程访问管理面板

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 青龙…

C++设计模式-结构型设计模式

写少量的代码来应对未来需求的变化。 单例模式 定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。——《设计模式》GoF 解决问题 稳定点&#xff1a; 类只有一个实例&#xff0c;提供全局的访问点&#xff08;抽象&#xff09; 变化点&#xff1a…

Day1| Java基础 | 1 面向对象特性

Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么&#xff1f;多态特性你是怎…

关于在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中的解…

【Qt之OpenGL】01创建OpenGL窗口

1.创建子类继承QOpenGLWidget 2.重写三个虚函数 /** 设置OpenGL的资源和状态,最先调用且调用一次* brief initializeGL*/ virtual void initializeGL() override; /** 设置OpenGL视口、投影等&#xff0c;当widget调整大小(或首次显示)时调用* brief resizeGL* param w* para…

OpenCV如何为等值线创建边界旋转框和椭圆(63)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV 为轮廓创建边界框和圆(62) 下一篇:OpenCV的图像矩(64) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::minAreaRect使用 OpenCV 函数 cv::fitEllipse cv::min…

交易复盘-20240507

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 蔚蓝生物 (5)|[9:25]|[36187万]|4.86 百合花…

智慧工地的5大系统是什么?SaaS化大型微服务架构(智慧工地云平台源码)可多端展示登录

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最终实现项目对人、机、料、法、环的全…

基于Springboot的教学资源共享平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学资源共享平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…