分组注解和自定义注解及分页查询

自定义注解的使用步骤

案例:

此时state需要进行的校验使用普通方式无法满足,需要我们根据需求进行自定义注解

  1. 创建一个注解
    @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 {};
    }
  2. 创建一个提供校验规则的类
    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;
        }
    }
    
    此类中ConstraintValidator<给哪个注解提供校验规则,校验的数据类型>
  3. 自定义注解的使用
    @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;//更新时间

    在实体中定义在对应字段上方

分组注解的使用:

  1. 在实体类中进行相应操作
    @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();
    }
}

分页查询:

  1. ​​​​​​先进行配置文件
    ​
            <!--pageHelper坐标-->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.4.6</version>
            </dependency>
    
    ​
  2. 定义PageBean类用于分页查询
     
    //分页返回结果对象
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class PageBean <T>{
        private Long total;//总条数
        private List<T> items;//当前页数据集合
    }
  3. 在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);
        }
  4. 在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>

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值