前言
很早之前便已经接触了MVC模型了,但真正实战的时候发现自己为了方便将层与层之间出现耦合,一个规范的简单标准就是看一个层级之间的代码是不是具有通用性。举一个简单例子:service层中每一个方法是不是可以被任意controller调用。以下是以springboot为参考
Controller
- controller不要写逻辑
- controller进行参数验证
- 参数DTO原则
- 幂等校验
例如:
//AjaxResult 包装的参数
//@NotBlank 参数校验,不能为空
@GetMapping("/login")
public AjaxResult wxBack(@NotBlank(message = "code 参数不能为空") String code) {
JSONObject loginUser = userService.login(code);
return success(loginUser);
}
注解 | 作用数据类型 | 说明 |
@Null | 任何类型 | 对象必须为空 |
@NotNull | 任何类型 | 对象不为空 |
@NotBlank | 字符串 | 对象不为空,字符串去掉前后空格后长度不为0 |
@NotEmpty | 字符串、集合、数组 | 对象不为空,且字符串长度不为0,集合、数组大小不为0 |
@DecimalMin(decimal) | 浮点型 | 数值必须大于或等于指定的最小值,内部使用BigDecimal定义数值对象;为 null 是校验通过;默认包含边界值 |
@DecimalMax(decimal) | 浮点型 | 数值必须小于或等于指定的最大值,内部使用BigDecimal定义数值对象;为 null 是校验通过;默认包含边界值 |
@Positive | 整型数 | 数值必须为正整数 |
@PositiveOrZero | 整型数 | 数值必须为正整数或0 |
@Negative | 整型数 | 数值必须为负整数 |
@NegativeOrZero | 整型数 | 数值必须为负整数或0 |
Service
- 业务校验
- 业务注解
- 业务逻辑
- 日志记录
service层要具有通用性,不能为了方便将它的返回值类型设为controller的返回类型,这是大忌。一般情况下service层中
add、delete、update 返回的是int类型 影响的行数
select 返回的是查询的结果类型
/**
* 移除用户的全部会话
* @return int
*/
@Override
public int removeAll() {
Long userId = SecurityUtils.getUserId();
QueryWrapper<ChatSession> qw = new QueryWrapper<>();
qw.lambda().eq(ChatSession::getUserId, userId);
int num = chatSessionMapper.delete(qw);
if (num < 0) {
log.error("用户: " + userId + "删除全部会话失败");
throw new ServiceException("失败", HttpStatus.ERROR_MYSQL);
} else {
log.info("用户: " + userId + "删除全部会话成功");
}
return num;
}
持久层规范
-
敏感操作要有日志记录(增删改)
-
join的两个字段类型相同,都需要添加索引,join建议3层以内
-
当仅查询一条数据时用limit 1,减少DB耗时
例如:
@Select({
"<script>",
"SELECT p.*, t.user_id as is_like ",
"FROM promote p LEFT JOIN (select * FROM `promote` WHERE user_id = #{userId}) t on p.id = t.origin_id ",
"WHERE p.scope = 0 and p.category_id in",
"<foreach collection='cateIds' item='id' open='(' separator=',' close=')'>",
"#{id}",
"</foreach>","group by p.id",
"limit #{start}, #{end}",
"</script>"
})
public List<Promote> hasAddGetByCate(@Param("start") int start, @Param("end") int end, @Param("userId") Long userId, @Param("cateIds") String []cateId);