权限管理
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("-------");}}}