修改用户信息changeInfo
在持久层判断时:
问题:修改用户信息时,有一个这样的问题。举个例子:用户邮箱不是必填项,原本不为空。此时用户把邮箱信息删除后提交,这个时候如果非空来判断是否需要修改,则系统就会认为邮箱信息就不用修改。因此这种判断方式会混淆"原本有信息,但用户设置为空"和"原本有信息,但用户不做改动"这两种情况。
解决方法:
1)做更新一般两种方法,一种是根据对象实体整体更新,这种更新是每次覆盖的,所以要先把对象记录先读出来,改完后再全部字段更新回去。 另外一种是更新指定字段,这种就是拼SQL。 大部分时候都建议使用根据对象来更新的方法,虽然这种方法哪怕只更新一个字段也要每次覆盖全部字段,但是写代码简单。
2)这个问题不能在持久层dao中得到解决,首先,dao不应该考虑前端业务的问题 2.那么这个问题就需要业务层来解决,然后你这里其实有个问题,就是不规范,就是完全不清楚前端是 想更新这个空字段呢,还是不想更新,就是如果你业务层提供一个通用的方法,但是由于没有足够清楚的 规范,导致没法判断,所以前端到业务层,需要一个规范,比如你要将这个字段置空,就需要传特殊字符如-1,然后 业务层就可以做成一个通用的东西了。
以下直接用全部覆盖法实现系修改信息功能
1)持久层
接口:
User getUserByUid(Integer uid);
int updateInfoByUid(User user);
xml:
update store.t_user
set phone = #{phone},email=#{email},gender=#{gender},modified_user=#{modifiedUser},modified_time=#{modifiedTime}
where uid=#{uid};
2)业务层
接口:
//根据uid获取用户信息
public User getUserByUid(Integer uid);
//修改用户个人信息
public void changeUserInfo(Integer uid,String username,User user);//此处的user对象封装了用户修改后的数据
实现类:
//主要用于返回给前端用户的基本信息:用户名,邮箱,性别,电话
@Override
public User getUserByUid(Integer uid) {
User user = userMapper.getUserByUid(uid);
if (user == null){
throw new UserNotFoundException("用户数据不存在!");
}
if (user.getIsDelete().equals(1)){
throw new UserNotFoundException("用户已注销,不能返回用户信息!");
}
System.out.println("业务层查出的用户:"+user.toString());
//为了减少数据量的大小,提高传输性能,重新创建一个用户对象,将有需要的字段封装穿回前端
User user1=new User();
user1.setUsername(user.getUsername());
user1.setPhone(user.getPhone());
user1.setEmail(user.getEmail());
user1.setGender(user.getGender());
return user1;
}
@Override
public void changeUserInfo(Integer uid, String username, User user) {
//通过uid擦汗寻该用户用来判断这个用户是否存在或者注销
User user1 = userMapper.getUserByUid(uid);
if (user1 == null){
throw new UserNotFoundException("用户数据不存在!");
}
if (user1.getIsDelete().equals(1)){
throw new UserNotFoundException("用户已注销,不能返回用户信息!");
}
// 向参数user中补全数据
user.setUid(uid);
user.setModifiedUser(username);
user.setModifiedTime(new Date());
int rows = userMapper.updateInfoByUid(user);
if (rows != 1) {
throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员");
}
}
以及ex包里面一些异常的编写:UpdateException等
3)控制层
@RequestMapping("/getUser")
public JsonResult getUserById(HttpSession session) {
Integer uid = (Integer) session.getAttribute("uid");
User user = userService.getUserByUid(uid);
return new JsonResult(OK,user);
}
@RequestMapping("/changeUInfo")
public JsonResult changeUserInfo(User user, HttpSession httpSession){
Integer uid = getUidFromSession(httpSession);
String username = getUsernameFromSession(httpSession);
userService.changeUserInfo(uid,username,user);
return new JsonResult(OK);
}
以及BaseController里面一些异常的编写
4)前端
表单:简略版
js代码:
参考链接:https://bbs.csdn.net/topics/391065737