在上文的基础上来完成用户的修改和删除
用户管理
1.修改用户
1.1用户界面调整
1.2控制层调整
@Override public void getUpdateUserInfo(Integer id,Model model) { RoleExample roleExample = new RoleExample(); List<Role> roles = roleMapper.selectByExample(roleExample ); if(id !=null && id > 0){ // 表示更新数据,需要根据id查询用户信息 User user = userMapper.selectByPrimaryKey(id); // 查询用户具有的角色信息 List<Integer> roleIds = userMapper.selectRoleIdByUserId(id); model.addAttribute("user", user); model.addAttribute("roleIds", roleIds); } model.addAttribute("roles", roles); }
UserMapper接口
List<Integer> selectRoleIdByUserId(Integer id);
sql语句
<!-- 根据用户编号查询对应的角色信息 --> <select id="selectRoleIdByUserId" resultType="int"> select role_id from t_user_role where user_id = #{id} </select>
1.3修改页面
<form action="/user/saveOrUpdate"> <ul class="forminfo"> <input type="hidden" name="user.userId" value="${user.userId}"> <li><label>账号</label> <input name="user.userName" type="text" value="${user.userName}" class="dfinput" /> <i>账号不能超过30个字符</i> </li> <li><label>姓名</label> <input name="user.realName" type="text" value="${user.realName}" class="dfinput" /> </li> <li><label>密码</label> <input name="user.password" type="password" value="${user.password}" class="dfinput" /> </li> <li><label>确认密码</label> <input name="confirmPassword" value="${user.password}" type="password" class="dfinput" /> </li> <li><label>电话</label> <input name="user.phone" type="text" value="${user.phone}" class="dfinput" /><i></i> </li> <li><label>邮箱</label> <input name="user.email" type="text" value="${user.email}" class="dfinput" /><i></i> </li> <li><label>分配角色</label> <div style="height: 32px;line-height: 32px;"> <c:set var="flag" value="false"></c:set> <c:forEach items="${roles }" var="role"> <!-- 每循环一次 判断取出来的角色编号在不在用户具有的角色集合中 在就设置flag=true 不在就设置flag=false --> <c:forEach items="${roleIds }" var="roleId"> <c:if test="${roleId eq role.roleId }"> <c:set var="flag" value="true"></c:set> </c:if> </c:forEach> <input type="checkbox" ${flag eq true?'checked':'' } value="${role.roleId }" name="roles"> ${role.roleName } <c:set var="flag" value="false"></c:set> </c:forEach> </div> </li> <li><label> </label> <input name="" type="submit" class="btn" value="确认保存" /></li> </ul> </form>
1.4提交修改数据
控制层不用修改,修改service层的实现类,如下:
@Override public void saveOrUpdate(UserDto userDto) throws Exception { // 获取User对象 User user = userDto.getUser(); // 获取关联的角色信息 List<Integer> roles = userDto.getRoles(); // 判断是添加还是修改数据 if(user.getUserId()!=null && user.getUserId() > 0){ // 表示userId存在,说明是更新 // 修改用户 userMapper.updateByPrimaryKeySelective(user); // 根据用户ID删除管理的角色信息 userMapper.deleteRoleIdByUserId(user.getUserId()); // 再保存用户和角色的关联关系 if(roles!=null && roles.size() > 0){ for (Integer roleId : roles) { userMapper.inserUserIdAndRoleId(user.getUserId(),roleId); } } }else{ // 不存在id说明是添加数据 // 先添加用户数据 获取生成的userId userMapper.insert(user); // 再保存用户和角色的对应关系,在一个事务中处理 if(roles!=null && roles.size() > 0){ for (Integer roleId : roles) { userMapper.inserUserIdAndRoleId(user.getUserId(),roleId); } } } }
UserMapper接口
void deleteRoleIdByUserId(Integer userId);
sql语句
<delete id="deleteRoleIdByUserId"> delete from t_user_role where user_id=#{id} </delete>
测试修改
修改成功!
2.删除用户
本来用户是不用真的删除的,实际中我们会给用户表添加一个是否删除的字段,删除数据只需要修改该字段即可,也就是我们常说的伪删除,在此处我们来介绍下真实删除(有关联关系的情况下)
2.1提交删除请求
2.2处理删除请求
控制器
@RequestMapping("/delete") public String deleteUser(Integer id) throws Exception{ userService.deleteUser(id); return "redirect:/user/query"; }
service实现类中的方法
@Override public void deleteUser(int id) throws Exception { // 1.删除用户和角色的关联关系 userMapper.deleteRoleIdByUserId(id); // 2.删除用户 userMapper.deleteByPrimaryKey(id); }
测试:
删除成功。
在有外键关联的时候,我们需要先删除关联的数据然后再删除主表数据。