文章管理接口——里面有动态SQL编写,在分页查询里

1.实体类和表结构

2. 新增文章分类

接口文档

实现

 

完整代码放在校验部分

结果:

参数校验(Validation自定义)

 

 对state的校验(已发布|草稿),已有的注解不能满足校验需求,这时就需要自定义校验注解

步骤:

  1. 自定义注解State(里面必须提供三个属性message,groups,payload)
  2. 自定义校验数据的类StateValidation实现ConstraintValidator接口(需要重写isValid这个方法,方法内部提供校验规则)
  3. 在需要校验的地方使用自定义注解(Validation会解析到我们自定义的注解@State,解析到了之后就能够找到这个注解,并且解析到这个注解上组合的另外一个注解@Constraint,这个注解的内部会有一个validatedBy的属性,这个属性作用指定谁来提供校验规则,比如validateBy=StateValidation.class,它就指向了我们自定义的StateValidation类,最终调用里面的isValid方法,完成参数的校验)

 新建一个anno软件包,包下新建一个State接口

package org.exampletest.anno;import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import org.exampletest.validation.StateValidation;import java.lang.annotation.*;@Documented//元注解,可以抽取到帮助文档里面的//元注解,标识我们自定义的注解可以用在哪些地方,用在类上还是属性上还是方法上,还是参数上?
// 我们这里只用到属性上
@Target({ElementType.FIELD})//元注解,标识这个自定义注解将来在哪个阶段会被保留,编译阶段?源码阶段?运行时阶段?
// 我们这里需要保留到运行时阶段
@Retention(RetentionPolicy.RUNTIME)//元注解,标识这个自定义注解将来在哪个阶段会被保留,编译阶段?源码阶段?运行时阶段?我们这里需要保留到运行时阶段@Constraint(validatedBy = {StateValidation.class})//元注解,标识这个注解的校验逻辑由哪个类实现public @interface State {// 提供校验失败后的提示信息String message() default "state参数的值只能时已发布或者草稿";//指定分组Class<?>[] groups() default {};// 负载,获取到state注解的附加信息Class<? extends Payload>[] payload() default {};
}

新建一个软件包validation,包下新建一个StateValidation类

package org.exampletest.validation;import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.exampletest.anno.State;// implements ConstraintValidator<给哪个注解提供校验规则,校验的数据类型>
public class StateValidation implements ConstraintValidator<State,String> {/**** @param value 将来要校验的数据* @param context* @return 返回false,校验不通过,返回true校验通过*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//提供校验规则if(value ==null){return false;}if(value.equals("已发布") || value.equals("草稿")){return true;}return false;}
}

在Article属性上添加注解:

package org.exampletest.pojo;import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.exampletest.anno.State;
import org.hibernate.validator.constraints.URL;import java.time.LocalDateTime;
@Data
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;//更新时间
}

service层代码:

package org.exampletest.service;import org.exampletest.pojo.Article;public interface ArticleService {void add(Article article);
}

service层接口实现:

package org.exampletest.service.impl;import org.exampletest.mapper.ArticleMapper;
import org.exampletest.pojo.Article;
import org.exampletest.service.ArticleService;
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 ArticleServicempl implements ArticleService {@Autowiredprivate ArticleMapper articleMapper;@Overridepublic void add(Article article) {//补充属性值article.setCreateTime(LocalDateTime.now());article.setUpdateTime(LocalDateTime.now());Map<String,Object> map=ThreadLocalUtil.get();Integer userId = (Integer)map.get("id");article.setCreateUser(userId);articleMapper.add(article);}
}

Mapper层: 

package org.exampletest.mapper;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.exampletest.pojo.Article;@Mapper
public interface ArticleMapper {//新增@Insert("insert into article(title,content,cover_img,state,category_id,create_user,create_time,update_time)"+"values (#{title},#{content},#{coverImg},#{state},#{categoryId},#{createUser},#{createTime},#{updateTime})")void add(Article article);
}

 2.文章列表(条件分页)

接口文档

实现

在controller里面添加方法,方法的返回类型为Result<PageBean<Article>>,(PageBean是我们自定义的一个对象,用来封装分页查询的结果,做分页查询的时候一般都会定义这个一个对象,里面至少包含两个属性,一个是total代表总条数,一个是items代表的是当前页面的数据集合)

方法上需要声明四个参数,分别接收前端传来四个参数。其中categoryId,state这两个参数是非必须传递的,因此需要在这两个参数前添加一个@RequestParam(required=false)注解,告诉MVC框架,这两个参数是非必须的。

在service层里面首先要构建一个PageBean对象,用它来封装将来查询的数据。

分页查询将来会借助mybatis提供的分页插件PageHelper,使用pageHelper进行分页查询的话,只需要在调用map的方法执行SQL之前,开启分页查询。(需要在pom.mxl文件中导入pagehelper的坐标)

<!--PageHelper坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency>

开启分页查询之后,调用map方法执行SQL就可以了。然后是条件搜索,前端有可能会传也可以不传,所以SQL不能写死,需要使用到myBatis的动态SQL技术来编写这段SQL了

代码:Controller层

   @GetMappingpublic Result<PageBean<Article>> list(Integer pageNum,Integer pageSize,@RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state){PageBean<Article> pb= articleService.list(pageNum,pageSize,categoryId,state);return Result.success(pb);}

 Service层

//条件分页列表查询PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state);

 Service接口实现层

    @Overridepublic PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {//1.创建PageBean对象PageBean<Article> pb=new PageBean<>();//2.开启分页查询PageHelperPageHelper.startPage(pageNum,pageSize);//3.调用mapper层查询Map<String,Object>map= ThreadLocalUtil.get();Integer userId = (Integer)map.get("id");List<Article> as = articleMapper.list(userId, categoryId,state);//Page中提供了方法,可以获取PageHelper分页查询后,得到的总记录条数和当前页数据,所以进行强转Page<Article> p = (Page<Article>) as;//把数据填充到PageBean中pb.setTatal(p.getTotal());pb.setItems(p.getResult());return pb;}

 Mapper层

//查询List<Article> list(Integer userId, Integer categoryId, String state);

 在resources层下,建立与mapper相同路径的目录,新建配置文件编写映射文件

<?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.exampletest.mapper.ArticleMapper">
<!--    动态SQL--><select id ="list" resultType="org.exampletest.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.rhkb.cn/news/392729.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Bugku] web-CTF靶场系列系列详解④!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 --------------------------------- eval 开启环境&#xff1a; 进入页面发现是一道php题&…

如何用 ChatGPT 提升学术写作:15 个高效提示

在本文&#xff0c;我们详细探讨了如何利用 ChatGPT 提升学术写作的各个方面。我们帮助学术作者通过生成创意点子、构建论证结构、克服写作障碍以及格式化引用&#xff0c;从而显著提升其学术论文的质量。这 15 条提示不仅可以单独使用&#xff0c;还可作为学习的良好范例。 本…

集合基础知识及练习

import java.util.ArrayList;public class Solution {//将字符串转化为整数public static void main(String[] args) {ArrayList<String> listnew ArrayList();list.add("aaa");list.add("aaa");list.add("bbb");list.add("ccc"…

Occlusion in Augmented Reality

1.Occlusion in Augmented Reality 笔记来源&#xff1a; 1.Occlusion handling in Augmented Reality context 2.Occlusion in Augmented Reality 3.Real-Time Occlusion Handling in Augmented Reality Based on an Object Tracking Approach 4.Occlusion Matting: Realisti…

JavaWeb——CSS的使用

CSS 层叠样式表(英文全称:(cascading stle sheets)能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有对网页对象和模型样式编辑的能力,简单来说,CSS用来美化页面 一、CSS的引入方式: 1.行内式&#xff1a;通过元素开始标…

未授权访问漏洞系列

环境 1.此漏洞需要靶场vulhub&#xff0c;可自行前往gethub下载 2.需要虚拟机或云服务器等linux系统&#xff0c;并在此系统安装docker和docker-compose提供环境支持 3.运行docker-compose指令为docker-compose up -d即可运行当前目录下的文件 Redis未授权访问漏洞 一、进…

用于相位解包的卷积和空间四向 LSTM 联合网络

原文&#xff1a;A Joint Convolutional and Spatial Quad-Directional LSTM Network for Phase Unwrapping 作者&#xff1a;Malsha V. Perera 和 Ashwin De Silva 摘要&#xff1a; 相位展开是一个经典的病态问题&#xff0c;其目标是从包裹相位中恢复真实的相位。本文&…

RAG前沿技术/解决方案梳理

RAG前沿技术/解决方案梳理 BenchmarkRetrievalAdaptive-RAGDR-RAGRichRAGGenRT Critique/ReasoningSelf-RAGCorrective RAGSpeculative RAGPlanRAGSelf-ReasoningReSP MemorySelfmemHippoRAG Query RewriteRaFe SummaryRefiner 个人理解 对当前RAG的学术研究&#xff08;或者好…

SAP 接口PO(PI,XI)在ECC端日志记录及显示

在接口的处理中通常会需要记录日志&#xff0c;而如果是与PO(PI,XI)做的接口的话&#xff0c;可以使用事务码SXI_MONITOR – XI&#xff1a;消息监控&#xff0c;来查询日志&#xff0c;但对于一些有加密&#xff0c;或者在业务接口功能上想直接查询报文日志时&#xff0c;会在…

使用 MinIO、Langchain 和 Ray Data 构建分布式嵌入式子系统

嵌入子系统是实现检索增强生成所需的四个子系统之一。它将您的自定义语料库转换为可以搜索语义含义的向量数据库。其他子系统是用于创建自定义语料库的数据管道&#xff0c;用于查询向量数据库以向用户查询添加更多上下文的检索器&#xff0c;最后是托管大型语言模型 &#xff…

ES6中的Promise、async、await,超详细讲解!

Promise是es6引入的异步编程新解决方案&#xff0c;Promise实例和原型上有reject、resolve、all、then、catch、finally等多个方法&#xff0c;语法上promise就是一个构造函数&#xff0c;用来封装异步操作并可以获取其成功或失败的结果&#xff0c;本篇文章主要介绍了ES6中的P…

(免费领源码)java#SSM#MYSQL私家车位共享APP 51842-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 课题的研究背景 1.2研究内容与研究目标 1.3ssm框架 1.4论文结构与章节安排 2 2 私家车位共享APP系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2…

原型图绘制技巧

针对于 Axure RP绘图软件。 1、拉辅助线 目的&#xff0c;确定画布大小尺寸从上面和左面的刻度尺上&#xff0c;点击鼠标&#xff0c;拖动&#xff0c;就可以拉出一条线。 2、画布底模设为组件 右键转换为母版&#xff0c;方便后续其他页面使用 3、按钮 按钮字体不要太大&am…

【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库

一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面&#xff0c;本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址&#xff1a;SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…

SpringBoot集成阿里百炼大模型(初始demo) 原子的学习日记Day01

文章目录 概要下一章SpringBoot集成阿里百炼大模型&#xff08;多轮对话&#xff09; 原子的学习日记Day02 整体架构流程技术名词解释集成步骤1&#xff0c;选择大模型以及获取自己的api-key&#xff08;前面还有一步开通服务就没有展示啦&#xff01;&#xff09;2&#xff0c…

CSS学习 02 利用鼠标悬停制造按钮边框的渐变方向变化

效果 页面背景为深灰色&#xff0c;使用Karla字体。容器内的按钮居中显示&#xff0c;按钮有一个彩色渐变的边框。按钮的背景为黑色&#xff0c;文字为浅灰色。当鼠标悬停在按钮边框上时&#xff0c;边框的渐变方向变化&#xff0c;按钮文字变为白色&#xff0c;并且按钮内边距…

简单猜谜小程序开发

了解小程序的结构 项目根目录 包含小程序的配置文件和其他资源。 页面目录 每个页面都有独立的目录&#xff0c;通常包含 .json、.wxml、.wxss、.js 文件&#xff1a; .json&#xff1a;页面配置文件&#xff0c;用于配置页面的窗口表现等。 .wxml&#xff1a;页面的布局文件…

JS等待所有方法执行完成在执行下一个方法,promise All

在工作中会遇到这样一个场景&#xff0c;前端需要拿到不同接口返回的结果在执行某个逻辑&#xff0c;当使用链式那样的方式去请求&#xff0c;等一个接口响应完在请求下一个接口&#xff0c;这种方法就会导致请求时间特别长。这个时候就可以使用promise all&#xff0c;同时请求…

Python酷库之旅-第三方库Pandas(067)

目录 一、用法精讲 266、pandas.Series.dt.second属性 266-1、语法 266-2、参数 266-3、功能 266-4、返回值 266-5、说明 266-6、用法 266-6-1、数据准备 266-6-2、代码示例 266-6-3、结果输出 267、pandas.Series.dt.microsecond属性 267-1、语法 267-2、参数 …

IDEA如何去掉编辑框右侧的竖线

打开 IntelliJ Idea 软件 依次找到 File—>Settings—>Editor—>General—>Appearance 去掉勾选 Show hard wrap and visual guides (configured in Code Style options)