Day-11更新用户实现
3.更改用户
1.修改数据的页面回显显示角色信息到下拉框选项中
1.1前端页面
我们在userList.html页面的视图准备好之前先准备数据,将角色信息数据准备好。
所以将向后台发送请求角色信息的数据放到生命周期created函数中:
1.2RoleServlet
package com.itheima.case2.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.case2.pojo.Role;
import com.itheima.case2.service.RoleService;
import com.itheima.case2.utils.BeanFactory;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@WebServlet("/role")
public class RoleServlet extends BaseServlet {
//查询所有的角色信息
public void findAllRoles(HttpServletRequest request, HttpServletResponse response){
try {
//1.创建业务层对象
RoleService roleService = (RoleService) BeanFactory.getSingleInstance("roleService");
//2.使用业务层对象调用业务层方法
List<Role> list = roleService.findAllRoles();
//3.将list集合转换为json格式
String jsonList = new ObjectMapper().writeValueAsString(list);
//4.响应给前端
response.getWriter().print(jsonList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3业务层
接口:
package com.itheima.case2.service;
import com.itheima.case2.pojo.Role;
import java.util.List;
public interface RoleService {
//查询所有角色
List<Role> findAllRoles();
}
实现类:
package com.itheima.case2.service.impl;
import com.itheima.case2.dao.RoleMapper;
import com.itheima.case2.pojo.Role;
import com.itheima.case2.service.RoleService;
import com.itheima.case2.utils.SqlSessionUtil;
import java.util.List;
public class RoleServiceImpl implements RoleService {
//查询所有角色
@Override
public List<Role> findAllRoles() {
//1.获取RoleMapper接口代理对象
RoleMapper mapper = SqlSessionUtil.getProxyMapper(RoleMapper.class);
//2.使用mapper调用RoleMapper中查询方法
List<Role> list = mapper.findAllRoles();
//3.返回list
return list;
}
}
1.4dao层
package com.itheima.case2.dao;
import com.itheima.case2.pojo.Role;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface RoleMapper {
//查询所有角色
@Select("select * from t_role")
List<Role> findAllRoles();
}
2.修改数据的页面回显将当前用户的角色信息显示到页面上
代码实现:
我们发现前端页面通过roleIds回显角色信息,所以后台只需要查询出角色id即可,在查询用户的时候查询:
修改UserMapper.xml映射文件即可:
3.修改用户
代码实现:
1.前端:
2.servlet:
//更新
public void updateUserById(HttpServletRequest request, HttpServletResponse response) {
try {
//获取页面的数据
// String param = request.getParameter("param");
//使用工具类
User user = BaseController.parseJSON2Object(request, User.class);
//1.接收请求数据
// Map<String, String[]> map = request.getParameterMap();
//2.创建User对象
// User user = new User();
//3.将map集合的数据封装到user中
// BeanUtils.populate(user,map);
//4.创建业务层对象
UserService userService = (UserService) BeanFactory.getSingleInstance("userService");
//5.调用更新方法
userService.updateUserById(user);
//6.再次查询
response.sendRedirect("/user?methodName=queryAllUsersAndRolesByPage&curPage=1&pageSize=5");
} catch (Exception e) {
e.printStackTrace();
}
}
package com.itheima.case2.utils;
import com.alibaba.fastjson.JSON;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* FastJson
* */
public class BaseController {
public static void printResult(HttpServletResponse response, Object obj) throws IOException {
response.setContentType("application/json;charset=utf-8");
JSON.writeJSONString(response.getWriter(),obj);
}
public static <T> T parseJSON2Object(HttpServletRequest request, Class<T> tClass) throws IOException{
// 把json格式的表单数据直接转成T类型的对象
return JSON.parseObject(request.getInputStream(),tClass);
}
}
3.service:
public interface UserService {
//分页查询所有用户信息
/*public abstract*/ PageBean<User> findAllUsersByPage(int curPage, int pageSize);
//更新用户
void updateUserById(User user);
}
//更新用户
/*
更新用户sql语句思路:
1.将新的用户数据更新到t_user表中
2.根据用户id到中间表t_user_role删除数据
3.向中间表t_user_role中插入用户id和角色id
*/
@Override
public void updateUserById(User user) {
//1.将新的用户数据更新到t_user表中
//1.1获取用户的mapper对象
UserMapper proxyUserMapper = SqlSessionUtil.getProxyMapper(UserMapper.class);
//1.2使用proxyUserMapper对象调用UserMapper中的更新方法
proxyUserMapper.updateUserById(user);
// 2.根据用户id到中间表t_user_role删除数据
//2.1获取用户角色的Mapper对象
UserRoleMapper proxyUserRoleMapper = SqlSessionUtil.getProxyMapper(UserRoleMapper.class);
//2.2使用proxyUserRoleMapper调用UserRoleMapper中的根据用户id删除方法
proxyUserRoleMapper.deleteByUid(user.getId());
//3.向中间表t_user_role中插入用户id和角色id
//3.1取出User实体类中的roleIds集合中的每个角色id
List<String> roleIds = user.getRoleIds();
//3.2遍历集合
for (String roleId : roleIds) {
//3.3使用proxyUserRoleMapper对象调用方法向中间表插入数据
proxyUserRoleMapper.addUserRoleId(user.getId(),Integer.parseInt(roleId));
}
}
4.dao
public interface UserMapper {
//根据id更新用户
@Update("update t_user set username=#{username},email=#{email},password=#{password} where id=#{id}")
void updateUserById(User user);
}
package com.itheima.case2.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
public interface UserRoleMapper {
//根据用户id删除中间表的信息
@Delete("delete from t_user_role where user_id=#{id}")
void deleteByUid(@Param("id") Integer id);
//添加用户和角色id
@Insert("insert into t_user_role values(#{uid},#{rid})")
void addUserRoleId(@Param("uid") Integer uid, @Param("rid")Integer rid);
}
说明:
更新用户先更新用户表的数据,然后删除该用户在中间表的数据,重新插入中间表中的更新后的用户id和角色id