java中用户对应多个角色时的新增、修改、删除处理操作

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 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]));
           // 根据userIdroleId作为条件,如果更新失败说明数据库无此记录,则需要插入
           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

    role_id = #{roleId }


    role_id = #{roleId } AND user_id = #{userId }

你可能感兴趣的:(随笔,数据存储)