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

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言

  • 该类博客的学习是基于b站黑马视频springboot+vue视频学习!
  • 具体围绕项目——"大事件"进行实战学习。

目录

一、功能介绍(需求)。

1、文章列表功能基本介绍。

2、条件分页查询功能与注意。

3、前端页面效果。(后面实现)

二、接口文档。

(1)请求路径、请求方式、接口描述。

(2)请求参数。

(3)queryString请求参数格式。

(4)响应数据。

三、实现思路分析。

(1)自定义类。(封装分页查询的结果)

(2)controller层。

(3)Service层。

(4)Mapper层。

四、具体代码书写。

(1)PageBean类。

(2)ArticleController。

(3)ArticleService接口。

(4)ArticleServiceImpl实现类。

1、mybatis的"PageHelper"开启分页查询。

2、service层实现类具体代码。(重要)

(5)Mapper层。

1、使用mapper映射配置文件。书写动态SQL语句。

2、基本的框架搭建。

3、书写SQL语句。

4、mapper层接口。

5、mapper映射配置文件。

五、后端接口测试。(postman)

(1)数据库添加并存在4条文章数据。

(2)测试条件1。

(3)测试条件2。

(4)测试条件3。

(5)测试条件4。


一、功能介绍(需求)。

1、文章列表功能基本介绍。
  • 文章列表查询功能:是用户点击左侧菜单栏的"文章管理"后。需要在当前页面的主区域展示当前用户所创建的文章信息。并且信息是以列表的形式展示。

2、条件分页查询功能与注意。
  • 列表的上方有"输入框"。用户可以根据文章的分类或者文章的发布状态去查询文章。
  • 列表的底部有"分页条"。展示了文章的总记录数,有"分页条"。用户可以选择每一页所展示的文章条数以及要查询的页码等等。

  • 注意:当用户点击了"搜索"、"上一页、下一页"、"显示每页条数"等等都需要访问后台的接口,查询满足当前条件的数据,最终在列表中进行显示文字信息。

3、前端页面效果。(后面实现)

二、接口文档。

(1)请求路径、请求方式、接口描述。
  • 路径:article。
  • 请求方式:get请求。


(2)请求参数。
  • 分页参数:"pageNum(当前页码)"、"pageSize(每页条数)"这两个参数是必须要传递的。
  • 搜索条件:"categoryId(文章分类id)"、"state":非必须传递。因为搜索的条件用户可以使用,也可以不使用。

(3)queryString请求参数格式。
  • 键值对:查询字符串由一系列键值对组成,每对键值之间用等号(=)连接。例如key=value。


  • 参数分隔:不同的键值对之间用和号(&)分隔。例如:key1=value1&key2=value2。

  • 可选性:查询字符串是可选的,不是所有的URL都需要包含查询字符串。

  • 位置:查询字符串通常位于URL的路径部分之后,以问号(?)开始。


  • 这里的请求参数示例如下:
  • pageNum=1&pageSize=3&categoryId=2&state=草稿

(4)响应数据。
  • 格式:JSON格式。


  • data:对应的类型是object。其中里面有两个内容。

  • "total"对应的是总条数。
  • "items"对应的是当前页的数据集合。其中它是一个数组。数组里面有多个对象。且每一个对象都是一个文章详情。

三、实现思路分析。

(1)自定义类。(封装分页查询的结果)
  • 通常。实现分页查询的时候,会提供一个自定义类用于封装查询后的结果。
  • 里面至少包括两个属性:"tota(总条数)"、"items(List<?..所需数据类..?>)"。
  • 到时候后台操作完,将查询后的数据封装到这个类的对象中,再返回回去即可。


(2)controller层。
  • list()方法。

  • 方法参数:"pageNum"、"pageSize"分别是当前页码与每页条数。

  • 而"categoryId"与"state"是非必须传递参数。
  • 使用注解@RequestParam(required="false")告诉MVC框架该参数不是必须的!否则前端没有这两个参数,就不允许访问该接口。

(3)Service层。
  • 首先在Service层需要定义一个前面创建的类的对象用来封装查询回的数据。
  • 这里再开启分页查询——借助于mybatis提供的"PageHelper"即可!
  • 然后再调用mapper层方法完成查询。


(4)Mapper层。
  • 因为这里的某些参数不一定会传值。
  • 所以不能把SQL语句写死!使用MYBATIS的动态SQL才行。
  • 所以要去创建mapper映射配置文件(.xml)会比较方便

四、具体代码书写。

(1)PageBean类。
  • 封装查询后的数据的实体类。
package com.feisi.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;//分页返回结果对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean <T>{private Long total;//总条数private List<T> items;//当前页数据集合
}
(2)ArticleController。
/*** 获取文章列表(条件分页列表查询)* @param pageNum* @param pageSize* @param categoryId* @param state* @return*/@GetMappingpublic Result<PageBean<Article>> list(Integer pageNum,Integer pageSize,@RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state){//调用service层PageBean<Article> pageBean = articleService.list(pageNum, pageSize, categoryId, state);return Result.success(pageBean);}
(3)ArticleService接口。
/*** 条件分页列表查询* @param pageNum* @param pageSize* @param categoryId* @param state* @return*/PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state);
(4)ArticleServiceImpl实现类。
1、mybatis的"PageHelper"开启分页查询。
  • 导入对应的坐标。回到pom.xml文件。
  • 记得刷新Maven
<!--PageHelper--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency>

  • 使用指定方法PageHelper.startPage(pageNum,pageSize)

  • pageNum:当前页码,从1开始。
  • pageSize:每页显示的记录数。
  • 调用这个方法后,PageHelper 会将分页参数保存到 ThreadLocal 中,之后执行的第一个 MyBatis 查询将会应用这些分页参数。所以需要在任何 MyBatis 查询方法调用之前调用 startPage()方法
  • PageHelper 会自动处理 SQL 的分页逻辑,不需要再手动编写分页的 SQL 语句
2、service层实现类具体代码。(重要
  • 调用mapper层的list()方法进行查询时。
  • 就不需要传递"pageNum"、"pageSize"两个参数。
  • PageHelper的startPage(pageNum,pageSize)方法会自动在执行sql的语句后添加limit进行分页查询。

  • 注意还需要传递参数:当前已登录用户的id。(因为用户只能操作自己的
  • userId从ThreadLocal当中获取!
  • 再通过"三个参数"的值传回去。用一个List<?>集合接收查询的结果。

  • 注意:因为Page对象中提供了方法。可以获取PageHelper分页查询后得到的总记录条数当前页数据
  • 分页查询最终返回的就是一个Page对象。所以需要将List<?>集合强转成Page对象。Page对象是List的一个实现类。属于向下转型:(Page)List<?>?....

  • 再通过把两个响应数据:"total"、"items"设置好,通过page对象.getTotal()、page对象.getResult()。再把对应响应给前端回去。

@Overridepublic PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {//1.创建PageBean对象PageBean<Article> pageBean = new PageBean<>();//2.开启分页查询(PageHelper)//mybatis插件PageHelper.startPage(pageNum,pageSize);//3.调用mapper层方法Map<String, Object> map = ThreadLocalUtil.get();Integer userId = (Integer) map.get("id");//返回的是一个List集合。查询的结果。List<Article> items = articleMapper.list(userId,categoryId,state);//Page对象中提供了方法。可以获取PageHelper分页查询后得到的总记录条数和当前页数据Page<Article> p = (Page<Article>) items;//4.设置PageBean对象属性pageBean.setTotal(p.getTotal());pageBean.setItems(p.getResult()); //当前页数据的集合return pageBean; //返回PageBean对象。对象中封装了分页查询后的结果。(总记录数、当前页数据)}
(5)Mapper层。
1、使用mapper映射配置文件。书写动态SQL语句。
  • 如果使用注解@Select(....)就会很麻烦。因为参数不一定,使用注解写动态sql很麻烦!


  • 所以在resources目录下新建与mapper层相同层级的配置文件。


  • 新建mapper映射配置文件。


  • 注意每个包是"/"(斜杠)分隔。



2、基本的框架搭建。
  • 提供映射配置文件。直接使用模板(可以网上查)

  • 映射配置文件必须要和mapper层接口所在同一个目录下!
  • 同时映射配置文件名必须与mapper层接口名一致!



  • 注意属性:namespace的值必须是对应mapper层接口的全类名





3、书写SQL语句。

  • 注意因为参数条件不定!所以条件查询(参数):使用<where>标签
  • 当然如果没有条件,就不用去加<where>标签。


  • 判断条件:<if>标签
  • <if>标签有一个属性"test"。
  • 作用就是判断该参数是否为空!不为空就去根据当前参数条件去查询。
  • 因为"categoryId(文章分类)"、"state(文章状态)"参数不一定会传过来!所以要非空校验。


  • 注意:test里面的参数名要与mapper层接口方法list()对应的参数一致!


4、mapper层接口。
List<Article> list(Integer userId, Integer categoryId, String state);
5、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="com.feisi.mapper.ArticleMapper"><!--动态sql--><!--id:方法名:list--><!--resultType:多条数据对应的实体类类型:Article类对象--><!--userId不要校验:因为没有登录就不能进行这些查询操作--><select id="list" resultType="com.feisi.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>

五、后端接口测试。(postman)

(1)数据库添加并存在4条文章数据。
  • 使用添加文章接口。

  • 使用添加文章接口。

  • 数据库表数据。

(2)测试条件1。
  • 文章类型与状态不传值。
  • pageSize=3:每页条数为3。pageNum=1:第一页。

(3)测试条件2。

  • 文章类型与状态不传值。
  • pageSize=3:每页条数为3。pageNum=2:第二页。

(4)测试条件3。

(5)测试条件4。

相关文章:

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…...

ScreenshotToCode安装教程

网页截图生成代码&#xff0c;我测试的效果一般 快速安装教程如下 1&#xff0c;首先你得有OpenAI的账号 国内用这个代理就可以&#xff1a; https://www.closeai-asia.com/ 充值一块钱&#xff0c;在本项目中可以生成两次 2&#xff0c;下载程序 下载程序压缩包&#xff1…...

最佳实践:如何在 Vue.js 项目中使用 Jest 进行单元测试

前言 随着应用程序规模和复杂性的增加&#xff0c;保证代码质量和稳定性变得愈发重要。单元测试作为软件测试的一部分&#xff0c;能够有效地捕捉代码中的错误&#xff0c;防止在开发过程中引入新的 Bug。在众多测试框架中&#xff0c;Jest 因其易用性、强大功能以及与 Vue.js…...

MySQL 与 MongoDB 存储差异分析

MySQL 与 MongoDB 存储差异分析&#xff1a;为什么随机生成数据的存储空间不同&#xff1f; 在实际应用中&#xff0c;我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中&#xff0c;数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说…...

【2024】前端学习笔记19-ref和reactive使用

学习笔记 1.ref2.reactive3.总结 1.ref ref是 Vue 3 中用来创建响应式引用的一个函数&#xff0c;通常用于基本数据类型&#xff08;如字符串、数字、布尔值等&#xff09;或对象/数组的单一值。 ref特点&#xff1a; ref 可以用来创建单个响应式对象对于 ref 包裹的值&…...

2024.11.26总结

今晚考了个科目四&#xff0c;只准备了半天&#xff0c;考试的时候几乎都是乱选的&#xff0c;选完后就走人了&#xff0c;相当于白白浪费了一次机会。有时候感觉上班太累了&#xff0c;不知道是心累&#xff0c;还是其他方面。 思来想去&#xff0c;还是决定继续在CSDN上输出…...

《通俗易懂 · JSqlParser 解析和构造SQL》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流…...

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。

2024-11-22 &#xff0c;由格拉斯哥大学创建的OSPTrack数据集&#xff0c;目的是通过捕获在隔离环境中执行包和库时生成的特征&#xff0c;包括静态和动态特征&#xff0c;来识别开源软件&#xff08;OSS&#xff09;中的恶意指标&#xff0c;特别是在源代码访问受限时&#xf…...

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…...

香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)

1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP&#xff1a;用于编解码测试&#xff0c;支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…...

【spark-spring boot】学习笔记

目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…...

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 归并排序&#xff08;Merge Sort&#xff09;5. 快速排序&#xff08;Quick Sort&#xff09;6. 堆排序&…...

【346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...

Jmeter中的测试片段和非测试原件

1&#xff09;测试片段 1--测试片段 功能特点 重用性&#xff1a;将常用的测试元素组合成一个测试片段&#xff0c;便于在多个线程组中重用。模块化&#xff1a;提高测试计划的模块化程度&#xff0c;使测试计划更易于管理和维护。灵活性&#xff1a;可以通过模块控制器灵活地…...

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器&#xff0c;可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API&#xff0c;可通过 DOM&#xff0c;CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网&#xff1a;https://jsoup.org/ 中文文档&#xff1a;Jsou…...

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 &#x1f339;&#xff1a;喜欢做梦 二叉树中有一个树&#xff0c;我们可以猜到他和树有关&#xff0c;那我们先了解一下什么是树&#xff0c;在来了解一下二叉树 一&#x1f35d;、树型结构 1&#x1f368;.什么是树型结构&#xff1f; 树是一种非线性的数据结构&…...

微信小程序 WXS 的概念与基本用法教程

微信小程序 WXS 的概念与基本用法教程 引言 在微信小程序的开发中,WXS(WeiXin Script)是一种特殊的脚本语言,旨在解决小程序在逻辑处理和数据处理上的一些限制。WXS 允许开发者在小程序的 WXML 中嵌入 JavaScript 代码,以便实现更复杂的逻辑处理。本文将深入探讨 WXS 的…...

Vue.js 中 v-bind 和 v-model 的用法与异同

简介 在 Vue.js 中&#xff0c;v-bind 和 v-model 是两个非常常用且强大的指令&#xff0c;它们分别用于动态地绑定属性和实现双向数据绑定。理解这两个指令的用法和区别对于构建 Vue.js 应用至关重要。本文将详细介绍 v-bind 和 v-model 的用法&#xff0c;并探讨它们的异同。…...

K8s的水平自动扩容和缩容HPA

HPA全称是Horizontal Pod Autoscaler&#xff0c;翻译成中文是POD水平自动伸缩&#xff0c;HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容&#xff08;除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自…...

【AI日记】24.11.26 聚焦 kaggle 比赛

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容&#xff1a;研究 kaggle 比赛时间&#xff1a;3 小时 核心工作 2 内容&#xff1a;学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间&#xff1a;4 小时备注&#xff1a;这…...

编写程序让智能洗手液机检测手部靠近,自动出液,无需按压。

&#x1f9fc; 项目实战&#xff1a;基于红外测距的智能洗手液机控制系统一、实际应用场景描述 (Scenario)在机场、医院、办公楼等公共场所&#xff0c;传统的按压式洗手液机存在卫生隐患——每个人都需要接触同一个泵头&#xff0c;容易造成细菌交叉感染。目标&#xff1a;通过…...

OpenClaw多模态实践:Qwen3-VL:30B图片识别+飞书对话

OpenClaw多模态实践&#xff1a;Qwen3-VL:30B图片识别飞书对话 1. 为什么需要多模态AI助手&#xff1f; 上周我整理团队活动照片时遇到一个典型场景&#xff1a;需要从200多张合影中筛选出包含特定成员的图片&#xff0c;并生成对应的活动纪要。手动操作不仅耗时&#xff0c;…...

计算机毕业设计springboot基于的游戏交易平台 基于SpringBoot的虚拟资产流通服务平台的设计与实现 基于SpringBoot架构的网络游戏账号及道具交易系统的设计与实现

计算机毕业设计springboot基于的游戏交易平台&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展和网络游戏产业的蓬勃兴起&#xff0c;虚拟资产交易已成为…...

实测2-5分钟:CogVideoX-2b生成速度与画质平衡的真实体验报告

实测2-5分钟&#xff1a;CogVideoX-2b生成速度与画质平衡的真实体验报告 1. 从文字到视频&#xff1a;CogVideoX-2b能做什么&#xff1f; 想象一下&#xff0c;你只需要输入一段文字描述&#xff0c;就能在几分钟内获得一段6秒的高清视频。这不是科幻电影里的场景&#xff0c…...

自然语言处理助力法律领域AI架构,提升司法服务质量

自然语言处理助力法律领域AI架构:从技术落地到司法服务升级的全链路实践 1. 引言:法律行业的“效率痛点”与NLP的破局之路 1.1 痛点引入:当法律遇到“信息过载”与“专业门槛” 深夜十点的律师办公室里,张律师还在揉着太阳穴核对第三份合同的条款——密密麻麻的法条引用…...

COMSOL—超声相控阵聚焦仿真 模型介绍:激励函数是由高斯波和正弦波组成的脉冲函数

COMSOL—超声相控阵聚焦仿真 模型介绍&#xff1a;激励函数是由高斯波和正弦波组成的脉冲函数超声相控阵这玩意儿在工业检测和医学影像里玩得可溜了&#xff0c;今天咱们整点硬核的——用COMSOL搞个带高斯调制的超声聚焦仿真。先看这个模型的灵魂所在&#xff1a;激励信号设计。…...

强强联合!望石智慧携手华为、华鲲振宇发布AI药物研发联合解决方案,共筑中国智慧医药创新生态

近日&#xff0c;以“因聚而升 融智有为”为主题的华为中国合作伙伴大会2026在深圳圆满落幕。望石智慧作为其国内AI驱动医药创新领域的核心技术伙伴受邀参会&#xff0c;并在智能制造医药行业论坛发表演讲。会议期间&#xff0c;望石智慧、华为、华鲲振宇三方达成战略级生态合作…...

3D打印机步进电机参数计算全攻略:从同步带到丝杆的实战配置

3D打印机步进电机参数计算全攻略&#xff1a;从同步带到丝杆的实战配置 在DIY 3D打印机的过程中&#xff0c;步进电机的参数计算往往是让初学者最头疼的环节之一。无论是同步带驱动的XY轴&#xff0c;还是丝杆控制的Z轴&#xff0c;亦或是齿轮传动的挤出机构&#xff0c;都需要…...

告别移植头疼!用STM32CubeMX快速复用正点原子LCD库的3个关键步骤

告别移植头疼&#xff01;用STM32CubeMX快速复用正点原子LCD库的3个关键步骤 在嵌入式开发中&#xff0c;复用成熟的驱动代码是提升效率的关键。正点原子的LCD库因其稳定性和易用性广受欢迎&#xff0c;但在STM32CubeMX生成的HAL工程中直接使用却常常遇到各种兼容性问题。本文将…...

社交媒体机器人检测的终极对决:TwiBot-22基准测试深度解析

社交媒体机器人检测的终极对决&#xff1a;TwiBot-22基准测试深度解析 【免费下载链接】TwiBot-22 项目地址: https://gitcode.com/gh_mirrors/tw/TwiBot-22 在数字时代&#xff0c;社交媒体上的机器人账号已成为信息传播的重要参与者。它们既能推动正面信息传播&#…...