使用ResponseBodyAdvice做分页处理

 

目录

 父pom文件

 pom文件

 配置文件

 MyResponseBodyAdvice 

 ResponseDto

 MyBatisConfig 

 UsersController 

 UsersMapper 

 UserMapper.xml

 结果


 父pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--        <version>3.1.2</version>--><version>2.2.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.chensir</groupId><artifactId>springboot</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot</name><description>springboot</description><properties><java.version>8</java.version><hutool.version>5.8.3</hutool.version><lombok.version>1.18.24</lombok.version><alibaba-sdk.version>2.0.0</alibaba-sdk.version></properties><packaging>pom</packaging><modules><module>servlet</module><module>spring-interceptor</module><module>spring-aop</module><module>spring-united-reslut</module><module>spring-jdbc</module><module>spring-mybatis</module></modules><dependencyManagement><dependencies><!--钉钉机器人消息--><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>${alibaba-sdk.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency>
<!--父pom中不要加此依赖,否则依赖clean会报错,原因是父pom中并没指定版本-->
<!--            <dependency>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-starter-web</artifactId>-->
<!--            </dependency>--><!--            <dependency>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-starter-test</artifactId>-->
<!--                <scope>test</scope>-->
<!--            </dependency>--></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.chensir</groupId><artifactId>springboot</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><artifactId>spring-mybatis</artifactId><dependencies><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.10</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.1.4</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

 配置文件


spring.datasource.url=jdbc:mysql://localhost/db1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 MyResponseBodyAdvice 

package com.chensir.advice;import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.github.pagehelper.Page;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import javax.servlet.http.HttpServletRequest;// 拦截范围为 com.chensir.controller包下内容
@RestControllerAdvice(basePackages = {"com.chensir.controller"})
public class MyResponseBodyAdvice implements ResponseBodyAdvice {// 是否开启拦截 true开启 false不开启@Overridepublic boolean supports(MethodParameter methodParameter, Class aClass) {// 此处应该改为true,否则除了异常外 走到此处为false后就直接返回,也不再继续往下走了!return true;}// 如果接口返回异常就在此处拦截 进行封装;value = Exception.class 对所有的异常均拦截!@ExceptionHandler(value = Exception.class)public Object defaultErrorHandler(HttpServletRequest req, Exception ex){ResponseDto<Object> responseDto = new ResponseDto<>();responseDto.setCode(501);responseDto.setMessage(ex.getMessage());return responseDto;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {// 有的接口再返回时会自己封装code,message,data。如果body是ResponseDto类型的实例,那么就直接返回body
//        if(body instanceof ResponseDto){
//            return body;
//        }ResponseDto<Object> responseDto = new ResponseDto<>();// 先用hutool定义为nullString message = StrUtil.EMPTY;responseDto.setCode(0);responseDto.setMessage(message);if (body instanceof Page){Page page = (Page) body;int pages = page.getPages();//总页数long total = page.getTotal();//总条数Dict dict = Dict.create().set("total",total).set("pages",pages).set("item",body);responseDto.setData(dict);}else {responseDto.setData(body);}// 如果是string类型就用json封装一下;if (aClass == StringHttpMessageConverter.class) {return JSONUtil.toJsonStr(responseDto);} else {return responseDto;}}
}

  ResponseDto<T>

package com.chensir.advice;import lombok.Data;import java.io.Serializable;// 泛型
@Data
public class ResponseDto<T> implements Serializable {// 返回码(内部拟定)private int code;// 返回信息private String message;private T data;
}

 MyBatisConfig 

package com.chensir.config;import com.github.pagehelper.PageInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.CollectionUtils;import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;@Configuration
@Slf4j
public class MyBatisConfig {@Autowiredprivate ConfigurationCustomizer configurationCustomizer;/*** 自己注册SqlSessionFactory 目的是增强功能,添加分页插件* @param ds 代表数据源* @return* @throws Exception*/@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource ds) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();// 设置数据源factoryBean.setDataSource(ds);// 把分页插件设置到SqlSessionFactory插件库factoryBean.setPlugins(new PageInterceptor());// 配置mapper.xml地址factoryBean.setMapperLocations(resolveMapperLocations());//驼峰映射注册到SqlSessionFactory中org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configurationCustomizer.customize(configuration);factoryBean.setConfiguration(configuration);// 返回具体实例对象SqlSessionFactory bean = factoryBean.getObject();return bean;}/*** 开启驼峰映射* @return*/@Beanpublic ConfigurationCustomizer configurationCustomizer(){return new ConfigurationCustomizer() {@Overridepublic void customize(org.apache.ibatis.session.Configuration configuration) {configuration.setMapUnderscoreToCamelCase(true);}};}/*** 查找 xxxMapper.xml* @return*/public Resource[] resolveMapperLocations() {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<String> mapperLocations = new ArrayList<>();mapperLocations.add("classpath*:mapper/*Mapper.xml");
//        mapperLocations.add("classpath*:com/meiwei/ping/dao/**/*Mapper.xml");List<Resource> resources = new ArrayList();if (!CollectionUtils.isEmpty(mapperLocations)) {for (String mapperLocation : mapperLocations) {try {Resource[] mappers = resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {log.error("Get myBatis resources happened exception", e);}}}return resources.toArray(new Resource[resources.size()]);}}

 UsersController 

package com.chensir.controller;import com.chensir.entity.Users;
import com.chensir.service.UsersService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
public class UsersController {@Resourceprivate UsersService usersService;@GetMapping("/demo1")public List selectUsersList(Integer pageNum,Integer pageSize) {// 启用分页,查询第一页,每页3条PageHelper.startPage(pageNum,pageSize);//-------------PageInfo方式---------------
//        PageInfo<Users> usersPageInfo = new PageInfo<>(usersService.selectUsersList());
//        return usersPageInfo;//-------------PageInfo方式---------------//-------------Page方式---------------
//        List<Users> users = usersService.selectUsersList();
//        Page page = (Page) users;
//        int pages = page.getPages();
//        long total = page.getTotal();
//
//
//        Map<String,Object> pageMap = new HashMap<>();
//        pageMap.put("pages",pages);
//        pageMap.put("total",total);
//        pageMap.put("items",users);
//        return pageMap;//-------------Page方式---------------//-----------使用ResponseBodyAdvice------------List<Users> users = usersService.selectUsersList();return users;//-----------使用ResponseBodyAdvice------------}@GetMapping("/demo2")public Users selectUsers(){Users users = usersService.selectUsers();return users;}@GetMapping("/demo3")public Map selectUsersToMap(){return usersService.selectUsersToMap();}
}

 UsersMapper 

@Mapper
public interface UsersMapper {List<Users> selectUsersList();Users selectUsers();Map<String,Object> selectUsersToMap();
}

 UserMapper.xml

<?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="com.chensir.mapper.UsersMapper"><select id="selectUsersList" resultType="com.chensir.entity.Users">select * from users</select><select id="selectUsers" resultType="com.chensir.entity.Users">select * from users where id = 1</select><select id="selectUsersToMap" resultType="java.util.Map">select * from users where id = 1</select>
</mapper>

结果

{"code": 0,"message": "","data": {"total": 5,"pages": 2,"item": [{"id": 1,"name": "chjnzkcn","age": 18,"sex": "男","tel": "123","createTime": "2023-05-11","updateTime": "2023-05-11"},{"id": 2,"name": "czvfzsvdv","age": 20,"sex": "男","tel": "2315","createTime": "2023-05-11","updateTime": "2023-05-11"},{"id": 3,"name": "sczvszv","age": 18,"sex": "女","tel": "2112321","createTime": "2023-05-11","updateTime": "2023-05-11"}]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/82400.html

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

相关文章

代码反向生成时序图类图-Visual_Paradigm实践

目录 前言 一、Visual_Paradigm介绍 1、主界面介绍 2、功能简介 二、基于代码的序列图生成 1、新建VP项目工程 2、序列图反向生成 三、VP类图生成 1、生成主入口 四、数据ER模型生成 1、SQL脚本 2、ER反向生成 总结 前言 不知道作为研发的小伙伴们&#xff0c;在平时的…

【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “当人们做不到一些事情的时候&#xff0c;他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…

【D3S】集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S&#xff08;DDD with SpringBoot&#xff09;为本作者使用DDD过程中开发的框架&#xff0c;目前已可公开查看源码&#…

攻防世界-web-shrine

1. 题目描述 打开链接&#xff0c;发现是一串源码&#xff1a; 从源码中不难发现关键词是flask.render_template_string(safe_jinja(shrine)) &#xff0c;这个函数说明了题目的关键点在于模板渲染&#xff0c;即存在模板注入 2. 思路分析 从代码中不难发现&#xff0c;即使…

探索泛型与数据结构:解锁高效编程之道

文章目录 引言第一部分&#xff1a;了解泛型1.1 为什么使用泛型1.2 使用泛型的好处 第二部分&#xff1a;泛型的使用场景2.1 类的泛型2.2 方法的泛型2.3 接口的泛型 第三部分&#xff1a;泛型通配符3.1 通配符3.2 通配符的受限泛型 第四部分&#xff1a;数据结构和泛型的应用4.…

Spring中的循环依赖问题

文章目录 前言一、什么是循环依赖&#xff1f;二、三级缓存三、图解三级缓存总结 前言 本文章将讲解Spring循环依赖的问题 一、什么是循环依赖&#xff1f; 一个或多个对象之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成一个环形调用&#xff0c;有下面 3 种方式…

MySQL 事务

目录 一、事务的概念 二、事务的ACID特点 1&#xff09;事务的原子性 2&#xff09;事务的一致性 3&#xff09;事务的隔离性 &#xff08;1&#xff09;脏读 &#xff08;2&#xff09;不可重复读 &#xff08;3&#xff09;幻读 &#xff08;4&#xff09; 丢失更…

FFmpeg 使用总结

FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准&#xff0c;前面的“FF”代表“Fast Forward”&#xff0c;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分&#xf…

《合成孔径雷达成像算法与实现》Figure3.8

与图3.7的代码区别只在于原始信号的表达式对了一个时间偏移 代码复现如下&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间 tc …

【Linux】守护进程

1 相关概念 1.1 守护进程的概念 守护进程也叫做精灵进&#xff0c;是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。 守护进程是非常有用的进程&#xff0c;在Linux当中大多数服务器用的就是守护进程。比如&#xff0c;web…

使用MethodInterceptor和ResponseBodyAdvice做分页处理

目录 一、需求 二、代码实现 父pom文件 pom文件 配置文件 手动注册SqlSessionFactory&#xff08;MyBatisConfig &#xff09; 对象 实体类Users 抽象类AbstractQuery 查询参数类UsersQuery 三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…

HOperatorSet.OpenFramegrabber “GigEVision“

HOperatorSet.OpenFramegrabber "GigEVision"访问失败 直接跳出 但其他算子可以访问 重装halcon x86

小程序裂变怎么做?小程序裂变机制有哪些?

做了小程序就等于“生意上门”&#xff1f;其实并不是这样。小程序跟流量平台较为明显的区别就在于小程序并非“自带流量”&#xff0c;而是需要企业利用自己的营销推广能力来建立引流渠道&#xff0c;从而完成用户的拉新和留存、转化。因此&#xff0c;想要用小程序来增加自己…

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项&#xff0c;Durable和Transient。 Durable表…

3分钟创建新生分班查询二维码,无需技术、0成本

作为教师&#xff0c;我们深知分班是一项极其重要的任务&#xff0c;需要综合考虑学生的性格、能力和兴趣等多个方面&#xff0c;以确保每个学生都能够获得最佳的学习环境和成绩。在本文中&#xff0c;我将分享一种便捷的方式来告知家长有关分班录取情况的方法。 通常&#xf…

python中 “”和“and”的区别

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 1、“&”和“and”有本质区别&#xff0c;属于不同类型的运行符号。& 是位运算&#xff1b;and 是逻辑运算。 2、首先是&&#xff1a;该运输符属于字符串的连接运算符&#xff0c;例如&#xff0c;“w“&”c…

【LeetCode】数据结构题解(9)[复制带随机指针的链表]

复制带随机指针的链表 &#x1f609; 1.题目来源&#x1f440;2.题目描述&#x1f914;3.解题思路&#x1f973;4.代码展示 所属专栏&#xff1a;玩转数据结构题型❤️ &#x1f680; >博主首页&#xff1a;初阳785❤️ &#x1f680; >代码托管&#xff1a;chuyang785❤…

el-select与el-tree结合使用,实现select框下拉使用树形结构选择数据

使用el-select与el-tree&#xff0c;实现如下效果&#xff0c; 代码如下&#xff1a; 注意点&#xff1a;搜索input框的代码一点放在option上面&#xff0c;不要放在option里面&#xff0c;否则一点击搜索框&#xff0c;下拉框就会收起来&#xff0c;不能使用。 <el-select…

wxwidgets Ribbon使用wxRibbonToolBar实例

wxRibbonToolBar就是工具栏&#xff0c;一下是实现的效果&#xff0c;界面只是功能展示&#xff0c;没有美化 实现代码如下所示&#xff1a; MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800, 600)) …

锐捷VSU技术理论与实验

目录 VSU涉及的相关基础概念 VSU的2种工作模式 VSU的3种设备角色 VSU的4种设备状态 VSU的分裂与合并 VSU建立过程 双主检测 VSU报文转发原理 VSU命令配置 配置VSU 配置双主检测 VSU涉及的相关基础概念 域编号&#xff08;Domain ID&#xff09; Domain ID是VSU的标…