java中用户对应多个角色时的新增、修改、删除处理操作
本例中在的数据库存储时,是采用存储多条记录
表如下:
用户id | 角色id |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
2 | 1 |
2 | 3 |
如上表,在前端操作,后台接收到前端传来的值时,如:用户id为1,角色id为1,2(或者1,2,3,4等等),这时我们可以选择一种简单的处理方式,注意:仅仅说是可以选择。就是把原来数据库中存储的条件用户id为1的记录全部删除,然后再做新增操作,把所有的角色id再添加进去。
代码块
public interface UserDao {
/** 新增用户角色 */
public void addUserRole(UserModel user);
/** 删除用户角色 */
public boolean deleteUserRoleById(Integer userId);
}
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public void updateUserRole(UserModel model){
userDao.deleteUserRoleById(model.getUserId());
userDao.addUserRole(model);
}
}
当然,这样是可以的,但是如您所想,这种操作也存在一定的风险,如果执行过程中出现异常、错误之类的,那么,即便有回滚这一步,数据也是有可能会出现问题的。
那么,看下面这张表:
用户id | 角色id | 创建时间 |
---|---|---|
1 | 1 | 2017-05-01 |
1 | 2 | 2017-05-10 |
1 | 3 | 2017-06-12 |
2 | 1 | 2017-05-01 |
3 | 2 | 2017-05-10 |
3 | 3 | 2017-06-12 |
这时,当我们在前端操作,后台接收到前端传来的值时,如:用户id为1,角色id为1,3,4这种,此时我们考虑上面那种处理方式,把原来数据库中存储的条件用户id为1的记录全部删除,然后再做新增操作,把所有的角色id再添加进去。你会发现创建时间怎么办?所以我暂时想到的是:
代码块
public interface UserDao {
/** 查询某用户所有角色记录 */
public List<UserModel> queryListById(UserModel user);
/** 新增用户角色 */
public void addUserRole(UserModel user);
/** 删除用户角色 */
public boolean deleteUserRoleById(Integer userId, Integer roleId);
/** 更新用户角色 */
public boolean updateUserRole(UserModel user);
}
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public void updateUserRole(UserModel model){
// 查询所有已有角色记录
List<UserModel> list = userDao.queryListById(model.getUserId());
String[] idArr = model.getRoleIds().split(",");
// 先做新增、修改
for (int i = 0; i < idArr.length; i++) {
model.setRoleId(Integer.parseInt(idArr[i]));
// 根据userId和roleId作为条件,如果更新失败说明数据库无此记录,则需要插入
if (!userDao.updateUserRole(model)) {
model.setCreTime(DateUtil.getNowDate("YYYY-MM-dd"));
// 新增操作
userDao.addUserRole(model);
}
}
// 再做删除操作
for (UserModel user : list) {
// 如果数据库中在前端传过来的值中没有匹配到,则可删除
if (model.getRoleIds().indexOf(user.getRoleId().toString()) == -1) {
// 删除操作
userDao.deleteUserRoleById(user.getUserId(), user.getRoleId());
}
}
}
}
这里补一句上段代码中(if判断条件)的sql:
UPDATE pub_user_role
<set>
role_id = #{roleId }
</set>
<where>
role_id = #{roleId } AND user_id = #{userId }
</where>