新增文章分类
接口文档
业务实现
参数校验
文章分类列表
接口文档
业务实现
获取文章分类详情
接口文档
业务实现
更新文章分类
接口文档
业务实现
分组校验
问题
概念
实现步骤
总结
删除文章分类
接口文档
业务实现
该模块大部分请求的路径相同,接口功能区分方式按请求方式不同而进行区分
文章分类业务表结构
新增文章分类
接口文档
业务实现
创建CategoryController控制类并编写实现方法
@RestController //定义为控制类
@RequestMapping("/category") //设置请求映射路径
public class CategoryController {
@Autowired
private CategoryService categoryService; //注入CategoryService
@PostMapping
public Result add(@RequestBody Category category){
categoryService.add(category);
return Result.success();
}
}
创建CategoryService接口并添加抽象方法
void add(Category category);
创建CategoryServiceimpl接口实现类
@Service
public class CategoryServiceimpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper; //注入CategoryMapper接口
@Override
public void add(Category category) {
//补充添加id属性值
Map<String,Object> map = ThreadLocalUtil.get();
Integer id = (Integer) map.get("id");
category.setCreateUser(id);
categoryMapper.add(category);
Result.success();
}
}
创建CategoryMapper接口用于操作mybatis
@Mapper
public interface CategoryMapper {
//新增
@Insert("insert into category(category_name,category_alias,create_user,create_time,update_time)" +
"values(#{categoryName},#{categoryAlias},#{createUser},now(),now()) ")
void add(Category category);
}
运行请求查看
数据库中已成功添加该记录
参数校验
用到上一篇讲到的对实体对象变量进行参数校验必须要传入有效参数
文章分类列表
接口文档
业务实现
编写CategoryController中的请求的方法
@GetMapping
public Result<List<Category>> list(){
List<Category> cs = categoryService.list();
return Result.success(cs);
}
编写CategoryService接口抽象方法
//列表
List<Category> list();
编写CategoryServiceimpl接口实现类的方法
@Override
public List<Category> list() {
Map<String,Object> map = ThreadLocalUtil.get();
Integer id = (Integer) map.get("id");
return categoryMapper.list(id);
}
编写CategoryMapper接口的方法
//查询列表
@Select("select * from category where create_user = #{id}")
List<Category> list(Integer id);
运行请求查看
发现返回的日期格式有问题,需要转换一下
在实体类日期属性变量上使用@JsonFormat注解用于指定日期格式
重新运行项目再请求查看日期格式已指定好了
获取文章分类详情
接口文档
业务实现
编写CategoryController中的请求的方法
@GetMapping("/detail")
public Result<Category> detail(){
Category c = categoryService.findById();
return Result.success(c);
}
编写CategoryService接口抽象方法
//根据id查询信息
Category findById(Integer id);
编写CategoryServiceimpl接口实现类的方法
@Override
public Category findById(Integer id) {
Category c =categoryMapper.findById(id);
return c;
}
编写CategoryMapper接口的方法
//根据id查询信息
@Select("select * from category where id = #{id}")
Category findById(Integer id);
运行请求查看
更新文章分类
接口文档
业务实现
在实体类中对id成员变量加上注解进行参数校验
编写CategoryController中的请求的方法
@PutMapping
public Result update(@RequestBody @Validated Category category){
categoryService.update(category);
return Result.success();
}
编写CategoryService接口抽象方法
//更新分类
void update(Category category);
编写CategoryServiceimpl接口实现类的方法
@Override
public void update(Category category) {
categoryMapper.update(category);
}
编写CategoryMapper接口的方法
//更新分类
@Select("update category set category_name=#{categoryName},category_alias=#{categoryAlias},update_time=now() where id=#{id}")
void update(Category category);
运行请求查看
分组校验
问题
对实体成员变量进行参数校验时,不同的请求参数类型和需要的参数数量不同,如果按照其中一个接口的规范写死那么另一个接口所需的类型参数就会冲突导致不通过。所以需要对不同的接口单独定义参数校验
概念
- 把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项
- 定义分组
- 定义校验项时指定归属的分组
- 校验时指定要校验的分组
实现步骤
对添加文章和更新文章进行参数分组校验
在实体类中定义内部接口
对成员变量指定校验项分组
在接口方法传参时对属性指定分组
这样就分组好了,然后请求参数也不会互相影响。
总结
- 在实体类内部定义接口来定义分组
- 通过groups属性指定对校验项分组
- 给@Validated注解的value属性赋值用于指定分组
- 校验项默认属于Default分组
- 定义校验项时如果没有指定分组,则属于Default分组,分组可以继承
删除文章分类
接口文档
业务实现
编写CategoryController中的请求的方法
@DeleteMapping
public Result delete(Integer id){
categoryService.delete(id);
return Result.success();
}
编写CategoryService接口抽象方法
//删除分类
void delete(Integer id);
编写CategoryServiceimpl接口实现类的方法
@Override
public void delete(Integer id) {
categoryMapper.delete(id);
}
编写CategoryMapper接口的方法
//删除分类
@Delete("delete from category where id = #{id}")
void delete(Integer id);
运行请求查看
数据库中已成功删除