自定义注解的使用步骤
案例:
此时state需要进行的校验使用普通方式无法满足,需要我们根据需求进行自定义注解
- 创建一个注解
@Documented//元注解 @Retention(RetentionPolicy.RUNTIME)//元注解 @Constraint( validatedBy = {StateValidation.class}//指定提供校验规则的类 ) @Target(ElementType.FIELD)//元注解 public @interface State { //提供校验失败后的提示信息 String message() default "state参数的值只能是已发布或者草稿"; //指定分组 Class<?>[] groups() default {}; //负载 获取到State注解的附加信息 Class<? extends Payload>[] payload() default {}; }
- 创建一个提供校验规则的类
此类中ConstraintValidator<给哪个注解提供校验规则,校验的数据类型>public class StateValidation implements ConstraintValidator<State,String> { //斜杠+**+回车(下面注解的快捷方式) /** * * @param s * @param constraintValidatorContext * @return 返回false校验不通过 ,返回true则校验通过 */ @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { //提供校验规则 if(s==null){ return false; } if(s.equals("已发布")||s.equals("草稿")){ return true; } return false; } }
- 自定义注解的使用
@Data @NoArgsConstructor @AllArgsConstructor public class Article { private Integer id;//主键ID @NotEmpty @Pattern(regexp = "^\\S{1,10}$") private String title;//文章标题 @NotEmpty private String content;//文章内容 @NotEmpty @URL private String coverImg;//封面图像 @State private String state;//发布状态 已发布|草稿 @NotNull private Integer categoryId;//文章分类id private Integer createUser;//创建人ID private LocalDateTime createTime;//创建时间 private LocalDateTime updateTime;//更新时间
在实体中定义在对应字段上方
分组注解的使用:
- 在实体类中进行相应操作
@Data @NoArgsConstructor @AllArgsConstructor 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{ } }
对于分组后的Validation注解进行使用
@Slf4j
@Validated
@RestController
public class CategoryController {
@Autowired
private CategoryService categoryService;
@PostMapping("/category")
public Result add(@RequestBody @Validated(Category.Add.class) Category category){
categoryService.add(category);
return Result.success();
}
@GetMapping("/category")
public Result<List<Category>> list(){
List<Category> cs=categoryService.list();
return Result.success(cs);
}
@GetMapping("/category/detail")
public Result<Category> detail(Integer id){
Category c=categoryService.detail(id);
return Result.success(c);
}
@PutMapping("/category")
public Result update(@RequestBody @Validated(Category.Update.class) Category category){
categoryService.update(category);
return Result.success();
}
}
分页查询:
- 先进行配置文件
<!--pageHelper坐标--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.6</version> </dependency>
- 定义PageBean类用于分页查询
//分页返回结果对象 @Data @NoArgsConstructor @AllArgsConstructor public class PageBean <T>{ private Long total;//总条数 private List<T> items;//当前页数据集合 }
- 在controller中根据需求完成
@GetMapping("/article") public Result<PageBean<Article>> query(Integer pageNum, Integer pageSize, @RequestParam(required = false) Integer categoryId, @RequestParam(required = false) String state){ PageBean<Article> pb=articleService.query(pageNum,pageSize,categoryId,state); return Result.success(pb); }
- 在Service中
@Override public PageBean<Article> query(Integer pageNum, Integer pageSize, Integer categoryId, String state) { //1.创建PageBean对象 PageBean<Article>pb=new PageBean<>(); //2.开启分页查询 PageHelper.startPage(pageNum,pageSize); //3.调用mapper Map<String,Object>map=ThreadLocalUtil.get(); Integer userid= (Integer) map.get("id"); List<Article> as= articleMapper.query(userid,categoryId,state); //Page中提供了方法,可以获取PageHelper分页查询后,得到的总记录条数和当前页数据 Page<Article> p= (Page<Article>) as; //把数据填充到PageBean对象中 pb.setTotal(p.getTotal()); pb.setItems(p.getResult()); return pb; }
5.mapper(这时普通的sql语句满足不了我们的需求,所以要使用映射文件完成动态sql语句)
List<Article> query(@Param("userid") Integer userid, @Param("categoryId") Integer categoryId, @Param("state") String state);
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.springbootstart.mapper.ArticleMapper"> <!--动态sql--> <select id="query" resultType="org.example.springbootstart.pojo.Article"> select * from article <where> <if test="categoryId!=null"> category_id=#{categoryId} </if> <if test="state!=null"> and state=#{state} </if> and create_user=#{userid} </where> </select> </mapper>