个人技术分享

权限管理

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("-------");
        }

    }

}