在上文的基础上来完成用户的修改和删除
@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>
<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>
控制层不用修改,修改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>
测试修改
修改成功!
本来用户是不用真的删除的,实际中我们会给用户表添加一个是否删除的字段,删除数据只需要修改该字段即可,也就是我们常说的伪删除,在此处我们来介绍下真实删除(有关联关系的情况下)
控制器
@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);
}
测试:
删除成功。 在有外键关联的时候,我们需要先删除关联的数据然后再删除主表数据。