权限管理
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;
}
@Override
public 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 mapper
PUBLIC "-//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 role
on user.UserID = user_role.User_id
and user_role.Role_id = role.RoleID;
</select>
</mapper>
测试
@Test
public 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 返回用户数组
*/
@Override
public 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 {
@Test
public 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("-------");
}
}
}