赞
踩
实体类
新创建CategoryController,CategoryService,(CategoryServiceImpl),CategoryMapper
在CategoryController中添加方法
使用注解@PostMapping,没有映射路径,我们在CategoryController的类上添加一个映射路径@RequestMapping("/category"),然后同通过请求方式的方式进行区分,来提供服务。
在方法上声明一个实体类参数,加上@RequestBody让MVC框架自动读取请求体中的json数据,并把json数据转换成一个对象。
在mapper层添加分类时,要添加这个分类是谁创建的,创建时间,更新时间。但是接口文档中,前端给我们传递的参数里面只有分类的名称和分类的别名。所以在执行mapper层的sql之前,我们需要在service层中把category里面的一些属性值给它完善好
CategoryController.java
- package org.exampletest.controller;
-
- import org.exampletest.pojo.Category;
- import org.exampletest.pojo.Result;
- import org.exampletest.service.CategoryService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/category")
- public class CategoryController {
- @Autowired
- private CategoryService categoryService;
- @PostMapping
- public Result add(@RequestBody @Validated Category category){
- categoryService.add(category);
- return Result.success();
- }
-
- }
CategoryService.java
- package org.exampletest.service;
-
- import org.exampletest.pojo.Category;
-
- public interface CategoryService {
- //新增分类
- void add(Category category);
-
- }
CategoryServiceImpl.java
- package org.exampletest.service.impl;
-
- import org.exampletest.mapper.CategoryMapper;
- import org.exampletest.pojo.Category;
- import org.exampletest.service.CategoryService;
- import org.exampletest.utils.ThreadLocalUtil;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.time.LocalDateTime;
- import java.util.Map;
-
- @Service
- public class CategoryServiceImpl implements CategoryService {
- @Autowired
- private CategoryMapper categoryMapper;
- @Override
- public void add(Category category) {
- //补充属性值
- category.setCreateTime(LocalDateTime.now());
- category.setUpdateTime(LocalDateTime.now());
-
- Map<String,Object> map= ThreadLocalUtil.get();
- Integer userid = (Integer)map.get("id");
- category.setCreateUser(userid);
- categoryMapper.add(category);
- }
- }
CategoryMapper.java
- package org.exampletest.mapper;
-
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Mapper;
- import org.exampletest.pojo.Category;
-
- @Mapper
- public interface CategoryMapper {
- //新增分类
- @Insert("insert into category(category_name,category_alias,create_time,update_time)"+"values(#{categoryName},#{categoryAlias},#{createTime},#{updateTime})")
- void add(Category category);
- }
对参数进行校验
添加@NotEmpty,@Validated等
主体数据给浏览器响应,数据是一个数组,数组里面又有多个对象,java里数组可以声明为集合,存放多个Category对象:List<Category>
只能查询当前用户所创建的分类,在Controller里面需要参数用户id
时间字符串如何修改为接口文档的日期格式:
在实体类中,日期属性的上面添加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime createTime;//创建时间
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime updateTime;//更新时间
结果如图:
代码
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 userId =(Integer)map.get("id");
- return categoryMapper.list(userId);
- }
CategoryMapper
- //查询所有
- @Select("select * from category where create_user = #{userId}")
- List<Category> list(Integer userId);
通过接口文档可知,请求访问方式是Get,请求路径,请求参数等
需要一个参数Integer id用于接收前端给我们传递的id
CategoryController
- @GetMapping("/detail")
- public Result<Category> detail(Integer id){
- Category c=categoryService.findById(id);
- return Result.success(c);
- }
CategoryService
- //根据分类查询信息
- 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);
结果:
在Controller里添加方法,方法里添加实体类参数接收前端传来的数据,在实体类参数前添加@RequestBody自动获取数据,并将其json格式的数据转换成一个Category对象,添加@Validated对前端提交的参数进行校验,实体类对应的属性上需要添加响应的注解,完成参数的校验。
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) {
- category.setUpdateTime(LocalDateTime.now());
- categoryMapper.update(category);
- }
CategoryMapper
- //更新
- @Update("update category set category_name = #{categoryName},category_alias=#{categoryAlias},update_time=#{updateTime} where id=#{id}")
- void update(Category category);
结果:
测试新增文章分类
发现居然报错了?!因为新增文章分类和文章更新分类参数都是Category都使用@Validated进行校验,所以 属性上的注解都生效了。新增文章时不需要传递id,更新需要传递id,这时应该对校验规则进行分组。
分组校验
把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项
步骤:
- 定义分组(Validation里面表示分组需要通过接口表示,定义一个接口就代表的是一个分组,在实体类中定义接口)
- 例如:public interface Add{}
- 定义校验项时指定归属分组(Validation给我们提供的这种校验的注解里边都有一个属性groups,通过groups指定当前校验项属于哪个分组;groups类型是一个数组,可以给同一个校验项指定多个分组)
@NotNull(groups=Update.class) private Integer id;//主键ID @NotEmpty(groups={Add.class,Update.class}) private String categoryName;//分类名称- 校验时指定要校验的分组(在controller里方法参数前添加@Validated时传入哪个class)
@PutMapping public Result update(@RequestBody @Validated(Category.Update.class) Category category){
步骤1、2: (Category.java)
- package org.exampletest.pojo;
-
- import com.fasterxml.jackson.annotation.JsonFormat;
- import jakarta.validation.constraints.NotEmpty;
- import jakarta.validation.constraints.NotNull;
- import lombok.Data;
-
- import java.time.LocalDateTime;
- @Data
- public class Category {
- @NotNull(groups=Update.class)
- private Integer id;//主键ID
- @NotEmpty(groups={Add.class,Update.class})
- private String categoryName;//分类名称
- @NotEmpty(groups={Add.class,Update.class})
- private String categoryAlias;//分类别名
- private Integer createUser;//创建人ID
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime createTime;//创建时间
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime updateTime;//更新时间
-
-
- public interface Add{}
-
- public interface Update{}
- }
步骤3:(CategoryController)
- @PutMapping
- public Result update(@RequestBody @Validated(Category.Update.class) Category category){
- categoryService.update(category);
- return Result.success();
结果:
当同一个校验项有多个分组的时候,要写多个分组,尤其时校验项特别多的时候就特别麻烦,可以借助Validation的默认分组进行优化。
如果说某个校验项没有指定分组,默认属于Default分组
分组之间可以继承,A extends B 那么A中拥有B中所有的校验项
- @Data
- public class Category {
- @NotNull(groups=Update.class)
- private Integer id;//主键ID
-
- //校验项没有指定分组,默认属于Default分组
- @NotEmpty
- private String categoryName;//分类名称
- @NotEmpty
- private String categoryAlias;//分类别名
- private Integer createUser;//创建人ID
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime createTime;//创建时间
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime updateTime;//更新时间
-
-
- //分组之间可以继承,A extends Default 那么A中拥有Default中所有的校验项
-
- public interface Add extends Default {}
- public interface Update extends Default{}
- }
CategoryController
- @DeleteMapping
- public Result delete(@RequestParam 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);
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。