宁波网站的建设,拍婚纱照,深圳宝安中学家长群,网站开发服务外包合同目录 一、需求
二、代码实现
父pom文件
pom文件
配置文件
手动注册SqlSessionFactory#xff08;MyBatisConfig #xff09;
对象
实体类Users 抽象类AbstractQuery
查询参数类UsersQuery
三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…目录 一、需求
二、代码实现
父pom文件
pom文件
配置文件
手动注册SqlSessionFactoryMyBatisConfig
对象
实体类Users 抽象类AbstractQuery
查询参数类UsersQuery
三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.xml
PageX 注解
MyResponseBodyAdvice
构造返回对象泛型ResponseDto
拦截器PageMethodInterceptor
拦截器注入PageMethodInterceptorConfig
结果展示 一、需求
使用ResponseBodyAdvice做分页处理_骑着蜗牛打天下的博客-CSDN博客
在之前使用过用ResponseBodyAdvice来做分页处理但是我们还可以结合着Aop中的MethodInterceptor拦截器对分页进一步封装
使用ResponseBodyAdvice的做法 这样的做法就是使用ResponseBodyAdvice去拦截controller层返回值然后对返回的page类型的值进行封装成带有 total、pages、body等
而本篇的目的是使用aop拦截器去拦截标注切点的方法然后对此方法进行拦截拦截后就在拦截器内去做 PageHelper.startPage处理然后在controller层返回时再使用ResponseBodyAdvice拦截进一步的把数据给封装
二、代码实现 父pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactId!-- version3.1.2/version--version2.2.5.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.chensir/groupIdartifactIdspringboot/artifactIdversion0.0.1-SNAPSHOT/versionnamespringboot/namedescriptionspringboot/descriptionpropertiesjava.version8/java.versionhutool.version5.8.3/hutool.versionlombok.version1.18.24/lombok.versionalibaba-sdk.version2.0.0/alibaba-sdk.version/propertiespackagingpom/packagingmodulesmoduleservlet/modulemodulespring-interceptor/modulemodulespring-aop/modulemodulespring-united-reslut/modulemodulespring-jdbc/modulemodulespring-mybatis/modulemodulespring-mybatis-pageX/module/modulesdependencyManagementdependencies!--钉钉机器人消息--dependencygroupIdcom.aliyun/groupIdartifactIdalibaba-dingtalk-service-sdk/artifactIdversion${alibaba-sdk.version}/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion${hutool.version}/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency
!--父pom中不要加此依赖否则依赖clean会报错原因是父pom中并没指定版本--
!-- dependency--
!-- groupIdorg.springframework.boot/groupId--
!-- artifactIdspring-boot-starter-web/artifactId--
!-- /dependency--!-- dependency--
!-- groupIdorg.springframework.boot/groupId--
!-- artifactIdspring-boot-starter-test/artifactId--
!-- scopetest/scope--
!-- /dependency--/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/projectpom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.chensir/groupIdartifactIdspringboot/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIdspring-mybatis-pageX/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependencydependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.1.10/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.4/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter-test/artifactIdversion2.1.4/versionscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project配置文件
spring.datasource.urljdbc:mysql://localhost/db1?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8autoReconnecttruerewriteBatchedStatementstrue
spring.datasource.usernameroot
spring.datasource.passwordroot
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driveraop.MethodInterceptor.point annotation(com.chensir.annotation.PageX)手动注册SqlSessionFactoryMyBatisConfig
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();ListString mapperLocations new ArrayList();mapperLocations.add(classpath*:mapper/*Mapper.xml);
// mapperLocations.add(classpath*:com/meiwei/ping/dao/**/*Mapper.xml);ListResource 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()]);}}对象
实体类Users
Data
public class Users {private Long id;private String name;private Integer age;private String sex;private String tel;// 数据库timestamp类型时间转化java规定格式时间JsonFormat(timezone GMT8,pattern yyyy-MM-dd)// 接受前端表单传递过来的字符串类型的时间数DateTimeFormat(pattern yyyy-MM-dd)private Date createTime;JsonFormat(timezone GMT8,pattern yyyy-MM-dd)DateTimeFormat(pattern yyyy-MM-dd)private LocalDateTime updateTime;
} 抽象类AbstractQuery
public abstract class AbstractQuery implements Serializable {private Integer pageNum 1;private Integer pageSize 10;public Integer getPageNum() {return pageNum;}public void setPageNum(Integer pageNum) {this.pageNum pageNum;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize pageSize;}
}
查询参数类UsersQuery
Data
public class UsersQuery extends AbstractQuery {private Long id;private String name;private Integer age;private String sex;private String tel;
}
三层架构 UsersController
RestController
public class UsersController {Resourceprivate UsersService usersService;PostMapping(/pageQuery)public List selectUsersByPageQuery(RequestBody UsersQuery usersQuery){// 使用MethodInterceptor进行分页 PageX为切点使用地方开启分页处理ListUsers usersList usersService.selectUsersByPageQuery(usersQuery);return usersList;}GetMapping(/demo1)public List selectUsersList(Integer pageNum,Integer pageSize) {// 启用分页查询第一页每页3条PageHelper.startPage(pageNum,pageSize);//-------------PageInfo方式---------------
// PageInfoUsers usersPageInfo new PageInfo(usersService.selectUsersList());
// return usersPageInfo;//-------------PageInfo方式---------------//-------------Page方式---------------
// ListUsers users usersService.selectUsersList();
// Page page (Page) users;
// int pages page.getPages();
// long total page.getTotal();
//
//
// MapString,Object pageMap new HashMap();
// pageMap.put(pages,pages);
// pageMap.put(total,total);
// pageMap.put(items,users);
// return pageMap;//-------------Page方式---------------//-----------使用ResponseBodyAdvice------------ListUsers 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();}
}UsersServiceImpl
Service
public class UsersServiceImpl implements UsersService {Resourceprivate UsersMapper usersMapper;Overridepublic ListUsers selectUsersList() {return usersMapper.selectUsersList();}Overridepublic Users selectUsers() {return usersMapper.selectUsers();}Overridepublic MapString, Object selectUsersToMap() {return usersMapper.selectUsersToMap();}Overridepublic ListUsers selectUsersByPageQuery(UsersQuery usersQuery) {return usersMapper.selectUsersByPageQuery(usersQuery);}
} UsersMapper
Mapper
public interface UsersMapper {ListUsers selectUsersList();Users selectUsers();MapString,Object selectUsersToMap();//此接口带有PageX 拦截器会拦截它 然后做分页处理PageXListUsers selectUsersByPageQuery(UsersQuery usersQuery);
} UsersMapper.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.chensir.mapper.UsersMapperselect idselectUsersList resultTypecom.chensir.domain.entity.Usersselect * from users/selectselect idselectUsers resultTypecom.chensir.domain.entity.Usersselect * from users where id 1/selectselect idselectUsersToMap resultTypejava.util.Mapselect * from users where id 1/selectselect idselectUsersByPageQuery resultTypecom.chensir.domain.entity.Usersselect * from userswhere11if testname ! null and name ! and name like concat(%, #{name},%)/if/where/select
/mapperPageX 注解
注解来作为切点使用时在配置文件中先配置注入bean时使用value取值然后对带有此注解的方法进行扫描拦截
Deprecated
Target(ElementType.METHOD)
Retention(RetentionPolicy.RUNTIME)
public interface PageX {
}
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){ResponseDtoObject 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) {ResponseDtoObject 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;}}
}构造返回对象泛型ResponseDtoT
// 泛型
Data
public class ResponseDtoT implements Serializable {// 返回码(内部拟定)private int code;// 返回信息private String message;private T data;
}
拦截器PageMethodInterceptor
package com.chensir.interceptor;import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.chensir.domain.AbstractQuery;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;import java.lang.reflect.Method;Slf4j
public class PageMethodInterceptor implements MethodInterceptor {Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {// 获取方法Method method invocation.getMethod();//获取参数Object[] arguments invocation.getArguments();//获取第一个参数Object arg0 arguments[0];if (arg0 instanceof AbstractQuery) {AbstractQuery query (AbstractQuery) arg0;Integer pageNum query.getPageNum();//参数 第几页Integer pageSize query.getPageSize();//参数 每页多少条if (ObjectUtil.isNotEmpty(pageNum) ObjectUtil.isNotEmpty(pageSize)) {//走到这肯定要分页了PageHelper.startPage(pageNum,pageSize);}}//获取返回值Object value invocation.proceed();log.info(方法:{},参数{},返回值:{}, method.getName(), JSONUtil.toJsonStr(arguments), value);return value;}
}拦截器注入PageMethodInterceptorConfig
advisor.setExpression(point); 拦截切点为PageX的注解
Configuration
public class PageMethodInterceptorConfig {Value(${aop.MethodInterceptor.point})private String point;Beanpublic AspectJExpressionPointcutAdvisor aspectJExpressionPointcutAdvisor(){AspectJExpressionPointcutAdvisor advisor new AspectJExpressionPointcutAdvisor();advisor.setAdvice(new PageMethodInterceptor());advisor.setExpression(point);return advisor;}
}
结果展示