自定义注解的使用步骤
案例:
此时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则校验通过*/@Overridepublic 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;//文章标题@NotEmptyprivate String content;//文章内容@NotEmpty@URLprivate String coverImg;//封面图像@Stateprivate String state;//发布状态 已发布|草稿@NotNullprivate Integer categoryId;//文章分类idprivate Integer createUser;//创建人IDprivate 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 {@Autowiredprivate 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中
@Overridepublic PageBean<Article> query(Integer pageNum, Integer pageSize, Integer categoryId, String state) {//1.创建PageBean对象PageBean<Article>pb=new PageBean<>();//2.开启分页查询PageHelper.startPage(pageNum,pageSize);//3.调用mapperMap<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 mapperPUBLIC "-//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>