可以修改个人资料中的昵称、性别和年龄,但是用户可能只修改其中一部分。
改进方案:
1 减少传输的数据量
如果没有修改昵称,那么向后台发送空字符串(有效昵称长度大于0)。之所以不是null,是因为传输null时自动转json的jar包会把它转成空字符串。如果没有修改性别,那么向后台发送0(1表示男,2表示女,3表示保密)。如果没有修改年龄,那么向后台发送0(有效年龄为1-120)。也就是说,用户只修改部分个人资料时,可以减少前端向后端传输的数据量。
自动转json的jar包见下图:
2 不执行update语句
查询个人资料后,如果用户修改个人资料的部分与当前个人资料相同,则不需要修改即不执行update语句。
修改个人资料的Java代码如下:
1 // 修改个人资料
2 @Override
3 public ResponseResult modifyPersonalData(String nickname, int sex, int age, int userId) {
4 ResponseResult responseResult = new ResponseResult("修改失败");
5
6 // true表示该查询用于修改个人资料
7 User user = userMapper.selectPersonalData(userId, true);
8 boolean needModify = false;
9 if (nickname != "" && !nickname.equals(user.getNickname())) {
10 needModify = true;
11 } else {
12 nickname = null;
13 }
14
15 if (sex != 0) {
16 if (sex != user.getSex()) {
17 needModify = true;
18 } else {
19 sex = 0;
20 }
21 }
22 if (age != 0) {
23 if (age != user.getAge()) {
24 needModify = true;
25 } else {
26 age = 0;
27 }
28 }
29
30 if (!needModify || userMapper.updatePersonalData(nickname, sex, age, userId) == 1) {
31 responseResult.setStateAndMsg("修改成功");
32 }
33
34 return responseResult;
35 }
2 缩短SQL语句
如果用户只修改部分个人资料,那么数据库执行的SQL语句可以缩短。
MyBatis中xml文件关键代码:
1 <!-- 修改个人资料 -->
2 <update id="updatePersonalData">
3 update user
4 <set>
5 <if test="nickname != ''">nickname = #{nickname},</if>
6 <if test="sex != 0">sex = #{sex},</if>
7 <if test="age != 0">age = #{age}</if>
8 </set>
9 where user_id = #{userId}
10 limit 1
11 </update>
使用条件语句之后有可能会在生成的赋值语句的后面留下逗号,而set元素会动态前置SET关键字,消除无关的逗号。等价的自定义trim元素如下:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
参考资料