以前在做SSM框架的时候,遇到的一个比较经典的案例,一个角色Role对应多个权限Module,那么如何在添加角色信息的时候将一个角色对应的多个权限也同时添加到两个表关联的中间表中呢。
1.添加角色信息。同时添加权限。这种方法是适合在添加角色和对应权限的时候使用,因为添加角色信息时候我们一般是传入一个角色的对象,把角色信息添加到角色表中。
而添加对应的权限的时候我们一般是添加对应的权限的id和角色id然后插入我们的中间表,所以我们在添加角色的时候可以循环的直接把权限ID也就是moduleId取出来以及对应的角色id拿到循环执行,即:执行多次的添加角色id和对应权限id。
当然了我们虽然解决了这个逻辑方法,把对应的多条数据都放入一个list方便执行,但是sql语句也是我们要解决的问题,在循
环添加多条数据的时候我们sql要利用SQL语句的循环方法。foreach
<insert id="insertIntoM_R">
<foreach item="m" collection="list" separator=";">
insert into module_role(
roleId,moduleId
) values(#{m.roleId},#{m.moduleId})
</foreach>
</insert>
实现类的方法:
@Override
public void insertRoleandModule(Role role,int[] moduleId) {
// TODO Auto-generated method stub
//先将一个角色存入到角色表中
roleMapper.saveRole(role);
System.out.println(moduleId);
List<Module_Role> list=new ArrayList<Module_Role>();
//循环传入的权限id
for(int i:moduleId){
//调用中间表model
Module_Role r=new Module_Role();
//循环设置权限id对应一个角色
r.setModuleId(i);
r.setRoleId(role.getRoleId());
//把中间表信息循环加入list
list.add(r);
}
//将对应的角色id和权限id 将入到中间表中
roleMapper.insertIntoM_R(list);
}
2、更新角色信息表,同时更新角色表和权限表的关联中间表。更新信息时我采用的是比较笨的方法,因为我们不能用SQL语句同事更新多条数据,但是同事插入多条数据是可以的。那我们就可以用之前同事插入多条数据的方法,先根据角色id删除对应的中间表的角色及对应的权限,然后再重新添加更新之后的角色对应的权限,也就是添加多条角色id对应的权限id的数据。
同样的更新修改多数据也需要我们用到sql语句的循环插入的语句。
<update id="updateSetM_R">
<foreach item="m" collection="list" separator=";">
insert into module_role(
roleId,moduleId
) values(#{m.roleId},#{m.moduleId})
</foreach>
</update>
这个事实现类:
@Override
public void updateRoleandModule(Integer roleId,int[] moduleId) {
// TODO Auto-generated method stub
//先删除需要修改的中间表中角色id对应的权限id的数据,然后重建插入
roleMapper.deleteM_R(roleId);
//声明一个list
List<Module_Role> list=new ArrayList<Module_Role>();
//循环传过来的权限集合 moduleId
for(int i:moduleId){
//调用中间表model
Module_Role mr=new Module_Role();
//把角色id权限id set到中间表
mr.setRoleId(roleId);
mr.setModuleId(i);
//循环添加到list
list.add(mr);
System.out.println(list);
}
//执行插入多条条数据
roleMapper.updateSetM_R(list);
}