当前位置: 首页 > news >正文

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

自定义注解的使用步骤

案例:

此时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则校验通过*/@Overridepublic 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;//文章标题@NotEmptyprivate String content;//文章内容@NotEmpty@URLprivate String coverImg;//封面图像@Stateprivate String state;//发布状态 已发布|草稿@NotNullprivate Integer categoryId;//文章分类idprivate Integer createUser;//创建人IDprivate 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 {@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();}
}

分页查询:

  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中
        @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>


http://www.mrgr.cn/news/23224.html

相关文章:

  • 4.人事管理系统(springbootvue项目)
  • AUTOSAR_EXP_ARAComAPI的5章笔记(4)
  • 【重学 MySQL】二十二、limit 实现分页
  • 手把手带你拿捏指针(1)
  • Pytorch添加自定义算子之(13)-CMake与Ninja编译Pytorch自定义算子
  • TinyWebSever源码逐行注释(五)_ http_conn.cpp
  • Curator+Zookeeper实现分布式锁的示例
  • 哈 希 表
  • 记录深度学习量化操作
  • 朴素贝叶斯法(Naive Bayes)—有监督学习方法、概率模型、生成模型、非线性模型、参数化模型、批量学习、贝叶斯学习
  • [linux]GCC G++官方源码国内下载地址汇总
  • 详细步骤!分享6款AI论文写作助手自动生成器实例操作!
  • 【自考zt】【软件工程】【21.04】(部分)
  • 驾校预约学习系统的设计与实现
  • Rocky Linux9下安装Docker和卸载Docker
  • CTK框架(六):服务工厂
  • 重卡换电解决方案换电连接器
  • Flink
  • 代码随想录打卡Day27
  • AI绘图神器排行:MidJourney、Stable Diffusion等热门工具深度解析