目的
现在我有一个管理商品、订单的页面。当用户点击某个超链接时,过滤器会检测该用户是否有权限!
需求分析
按照面向对象的思想,我们至少应该有权限(Privilege)和用户(User)实体。两个实体足够了吗?细想一下,如果我们有多个用户,多个用户也有多个权限,当要为用户授权的时候,这样子就会非常麻烦!所以我们应该引入角色(Role)这个实体!
引入角色(Role)这个实体方便在哪呢??把权限赋给角色(比如:把删除、修改的权限给管理员这个角色),管理员这个角色再赋给用户,那么该用户就有了修改、删除的权限了!
权限和角色是多对多的关系,角色和用户也是多对多的关系!
开发实体
用户实体
publicclassUser{
privateStringid;
privateStringusername;
privateStringpassword;
//记住角色
privateSet<Role>roles=newHashSet<>();
//各种getter和setter.....
}
角色实体
publicclassRole{
privateStringid;
privateStringname;
privateStringdescription;
//记住所有的用户
privateSet<User>users=newHashSet<>();
//记住所有的权限
privateSet<Privilege>privileges=newHashSet<>();
//各种getter和setter.....
}
权限实体
publicclassPrivilege{
privateStringid;
privateStringname;
privateStringdescription;
//记住所有的角色
privateSet<Role>roles=newHashSet<>();
//各种getter和setter.....
}
改良
用户和角色、角色和权限都是多对多的关系,这是毋庸置疑的!我们也按照面向对象的方法来设计,用集合来记住另一方的数据!
但是呢,我们想想:
- 在权限的Dao中,在查看权限的时候,有必要列出相对应的角色吗??
- 在角色的Dao中,在查看角色的时候,有必要列出相对应的用户吗??
答案是没有的,一般我们都不会显示出来。所以,权限的实体没必要使用Set集合来记住角色,角色实体没必要使用Set集合来记住用户!
改良后的权限实体
publicclassPrivilege{
privateStringid;
privateStringname;
privateStringdescription;
//各种setter和getter方法
}
改良后的角色实体
publicclassRole{
privateStringid;
privateStringname;
privateStringdescription;
//记住所有的权限
privateSet<Privilege>privileges=newHashSet<>();
//各种setter和getter方法
}
在数据库中建表
user表
CREATETABLEuser(
id VARCHAR(20)PRIMARYKEY,
usernameVARCHAR(20)NOTNULL,
passwordVARCHAR(20)NOTNULL
);
role表
CREATETABLErole(
id VARCHAR(20)PRIMARYKEY,
name VARCHAR(20)NOTNULL,
descriptionVARCHAR(255)
);
privilege表
CREATETABLEprivilege(
id VARCHAR(20)PRIMARYKEY,
name VARCHAR(20)NOTNULL,
descriptionVARCHAR(255)
);
user和role的关系表
CREATETABLEuser_role(
user_idVARCHAR(20),
role_idVARCHAR(20),
PRIMARYKEY(user_id,role_id),
CONSTRAINTuser_id_FKFOREIGNKEY(user_id)REFERENCESuser(id),
CONSTRAINTrole_id_FKFOREIGNKEY(role_id)REFERENCESrole(id)
);
role和privilege的关系表
CREATETABLErole_privilege(
role_id VARCHAR(20),
privilege_idVARCHAR(20),
PRIMARYKEY(role_id,privilege_id),
CONSTRAINTrole_id_FK1FOREIGNKEY(role_id)REFERENCESrole(id),
CONSTRAINTprivilege_id_FKFOREIGNKEY(privilege_id)REFERENCESprivilege(id)
);
注意:user和role的关系表、role和privilege的关系都有role_id作为外键,外键的名称是不能一样的!
开发DAO
PrivilegeDao
/**
* 权限的管理应该有以下的功能:
* 1.添加权限
* 2.查看所有权限
* 3.查找某个权限
*
* */
publicclassPrivilegeDao{
/*添加权限*/
publicvoidaddPrivilege(Privilegeprivilege){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="INSERT INTO privilege (id, name, description) VALUE (?, ?, ?)";
queryRunner.update(sql,newObject[]{privilege.getId(),privilege.getName(),privilege.getDescription()});
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("添加权限失败了!");
}
}
/*查找权限*/
publicPrivilegefindPrivilege(Stringid){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="SELECT *FROM privilege WHERE id = ?";
Privilegeprivilege=(Privilege)queryRunner.query(sql,newBeanHandler(Privilege.class),newObject[]{id});
returnprivilege;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("查找权限失败了!");
}
}
/*获取所有的权限*/
publicList<Privilege>getAllPrivileges(){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="SELECT * FROM privilege ";
List<Privilege>privileges=(List<Privilege>)queryRunner.query(sql,newBeanListHandler(Privilege.class));
returnprivileges;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("查找权限失败了!");
}
}
}
测试PrivilegeDao的功能
为了测试方便,添加有参构造函数到Privilege对象中
publicclassPrivilegeDaoTest{
PrivilegeDaoprivilegeDao=newPrivilegeDao();
@Test
publicvoidadd(){
Privilegeprivilege=newPrivilege("2","修改","修改功能");
privilegeDao.addPrivilege(privilege);
}
@Test
publicvoidgetAll(){
List<Privilege>list=privilegeDao.getAllPrivileges();
for(Privilegeprivilege:list){
System.out.println(privilege.getId());
}
}
@Test
publicvoidfind(){
Stringid="2";
Privilegeprivilege=privilegeDao.findPrivilege(id);
System.out.println(privilege.getName());
}
}
UserDao
publicclassUserDao{
publicvoidaddUser(Useruser){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="INSERT INTO user (id,username,password) VALUES(?,?,?)";
queryRunner.update(sql,newObject[]{user.getId(),user.getUsername(),user.getPassword()});
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("添加权限失败了!");
}
}
publicUserfind(Stringid){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="SELECT * FROM user WHERE id=?";
Useruser=(User)queryRunner.query(sql,newBeanHandler(User.class),newObject[]{id});
returnuser;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("添加权限失败了!");
}
}
publicList<User>getAll(){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="SELECT * FORM user";
List<User>users=(List<User>)queryRunner.query(sql,newBeanListHandler(User.class));
returnusers;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("添加权限失败了!");
}
}
}
測試UserDao
publicclassUserDaoTest{
UserDaouserDao=newUserDao();
@Test
publicvoidadd(){
Useruser=newUser();
user.setId("2");
user.setUsername("qqq");
user.setPassword("123");
userDao.addUser(user);
}
@Test
publicvoidfind(){
Stringid="1";
Useruser=userDao.find(id);
System.out.println(user.getUsername());
}
@Test
publicvoidfindALL(){
List<User>userList=userDao.getAll();
for(Useruser:userList){
System.out.println(user.getUsername());
}
}
}
RoleDao
publicvoidadd(Rolerole){
try{
QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="insert into role(id,name,description) values(?,?,?)";
Objectparams[]={role.getId(),role.getName(),role.getDescription()};
runner.update(sql,params);
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
publicRolefind(Stringid){
try{
QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="select * from role where id=?";
return(Role)runner.query(sql,id,newBeanHandler(Role.class));
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
//得到所有角色
publicList<Role>getAll(){
try{
QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="select * from role";
return(List<Role>)runner.query(sql,newBeanListHandler(Role.class));
}catch(Exceptione){
thrownewRuntimeException(e);
}
}