springboot2.0 使用aop实现PageHelper分页
参考:
https://blog.csdn.net/qq_24076135/article/details/85212081
https://www.jianshu.com/p/036d31ae77d3
一、编写分页实体类
/**
* 此类用于返回分页结果集
* @param <T>
*/
public class PageResult<T> { private Long total;
private Integer totalPage;
private List<T> rows; public PageResult() {
} public PageResult(List<T> rows) {
this.rows = rows;
PageInfo pageInfo = new PageInfo(rows);
this.total = pageInfo.getTotal();
} public PageResult(Long total, List<T> rows) {
this.total = total;
this.rows = rows;
} public PageResult(Long total, Integer totalPage, List<T> rows) {
this.total = total;
this.totalPage = totalPage;
this.rows = rows;
} public Long getTotal() {
return total;
} public void setTotal(Long total) {
this.total = total;
} public Integer getTotalPage() {
return totalPage;
} public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
} public List<T> getRows() {
return rows;
} public void setRows(List<T> rows) {
this.rows = rows;
}
}
二、未使用aop时,编写service层
public PageResult<Device> selectList(Map<String,Object> map) {
this.page = Integer.parseInt((String) map.get("page"));
this.size = Integer.parseInt((String) map.get("size"));
PageHelper.startPage(this.page,this.size);
List<Device> devices = this.deviceMapper.selectList(map);
PageInfo<Device> pageInfo = new PageInfo<>(devices);
return new PageResult<>(pageInfo.getTotal(),pageInfo.getList());
}
使用aop后:
public PageResult<Device> selectList(Map<String,Object> map) {
List<Device> devices = this.deviceMapper.selectList(map);
return new PageResult<Device>(devices);
}
分离的部分:
this.page = Integer.parseInt((String) map.get("page"));
this.size = Integer.parseInt((String) map.get("size"));
PageHelper.startPage(this.page,this.size);
PageInfo<Device> pageInfo = new PageInfo<>(devices);
三、dao层(即mapper)
public interface DeviceMapper {
public List<Device> selectList(Map<String,Object> map);
}
四、Controller层(有待优化)
@GetMapping("/list")
public ResponseEntity<PageResult<Device>> selectList(@RequestParam Map<String,Object> map){
PageResult<Device> result = this.deviceService.selectList(map);
if(CollectionUtils.isEmpty(result.getRows())){
result = null;
return ResponseEntity.ok(result);
}
return ResponseEntity.ok(result);
}
五、重点:编写aop切面类
@Component
@Aspect
@Slf4j
public class PageHelperAspect { @Pointcut("execution(* cn.factory.service.impl.*.*(..))")
public void pageFunction(){}; @Around("pageFunction()")
public Object serviceImplAop(ProceedingJoinPoint pjp){
try {
log.info("进入pagehelper aop"); //获取连接点方法运行时的入参列表
Object[] args = pjp.getArgs(); Map<String,Object> map = (Map<String,Object>)args[0]; // 获取连接点的方法签名对象
Signature signature = pjp.getSignature(); // 获取连接点所在的类的对象(实例)
Object target = pjp.getTarget(); PageHelper.startPage(Integer.parseInt((String) map.get("page")),Integer.parseInt((String) map.get("size"))); log.info("方法[{}]开始执行.....",signature.getName());
// 调用业务层方法,执行sql语句
Object object = pjp.proceed();
log.info("方法[{}]执行结束....",signature.getName());
// if (object instanceof List) {
// List objList = (List) object;
// PageInfo pageInfo = new PageInfo<>(objList);
// return pageInfo;
// }
return object;
} catch (Throwable throwable) {
log.info("pageInfo aop执行失败....");
throw new RuntimeException(throwable);
} finally {
log.info("serviceImplAop执行结束.....");
}
}
}
附上所需的依赖:如果依赖版本不匹配或者错误可能会出现net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences()Ljava/util/List;] with root cause此类错误
<!-- web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- mybatis的启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- 通用mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency> <!-- mybatis的分页插件 -->
<!--pageHelper基本依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<!-- 不加这两个依赖分页不会成功 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!-- jdbc启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- springboot检测服务启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency> <!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<!--加密-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
springboot2.0 使用aop实现PageHelper分页的更多相关文章
- SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)
一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- pageHelper分页
引入jar包 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pag ...
- spring-boot-2.0.3源码篇 - pageHelper分页,绝对有值得你看的地方
前言 开心一刻 说实话,作为一个宅男,每次被淘宝上的雄性店主追着喊亲,亲,亲,这感觉真是恶心透顶,好像被强吻一样.........更烦的是我每次为了省钱,还得用个女号,跟那些店主说:“哥哥包邮嘛么叽. ...
- SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...
- SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+PageHelper
上篇文章我们介绍了SpringBoot和MyBatis的整合,可以说非常简单快捷的就搭建了一个web项目,但是在一个真正的企业级项目中,可能我们还需要更多的更加完善的框架才能开始真正的开发,比如连接池 ...
- SpringBoot2.0+Mybatis+PageHelper+Redis实现缓存
1.在maven引入相关的依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactI ...
- SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务
本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...
- spring-boot-2.0.3应用篇 - shiro集成
前言 上一篇:spring-boot-2.0.3源码篇 - 国际化,讲了如何实现国际化,实际上我工作用的模版引擎是freemaker,而不是thymeleaf,不过原理都是相通的. 接着上一篇,这一篇 ...
- spring-boot-2.0.3之quartz集成,不是你想的那样哦!
前言 开心一刻 晚上回家,爸妈正在吵架,见我回来就都不说话了,看见我妈坐在那里瞪着我爸,我就问老爸“你干什么了惹我妈生这么大气?” 我爸说“没有什么啊,倒是你,这么大了还没有媳妇,要是你有媳妇给我们 ...
随机推荐
- 秦曾昌人工智能课程---5、KNN和朴素贝叶斯
秦曾昌人工智能课程---5.KNN和朴素贝叶斯 一.总结 一句话总结: 拟合和概率:构建机器学习模型,一般有拟合和概率两种方式 轻学无用:一定要保证学有所用,要深入学习,比如之前做的安卓,一定要学通, ...
- 高效率使用google,国外搜索引擎,国内顺利使用Google的另类技巧,可用谷歌镜像, 可用google学术, 如何使用robots不让百度和google收录
Google良好的搜索和易用性已经得到了广大网友的欢迎,但是除了我们经常使用的Google网站.图像和新闻搜索之外,它还有很多其他搜索功能和搜索技巧.如果我们也能充分利用,必将带来更大的便利.这里我介 ...
- Python 爬虫-爬取京东手机页面的图片
具体代码如下: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...
- python 测试框架nose
python测试框架nose nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成功了,直接打开cmd输入noset ...
- [zz]winform 窗体关闭事件
注册窗体关闭事件: 在Form1.Designer.cs 文件中添加: this.FormClosing += new System.Windows.Forms.FormClosingEventHan ...
- spark-submit 应用程序第三方jar文件
第一种方式:打包到jar应用程序 操作:将第三方jar文件打包到最终形成的spark应用程序jar文件中 应用场景:第三方jar文件比较小,应用的地方比较少 第二种方式:spark-submit 参数 ...
- StringUtils里的isEmpty和isBlank的区别
这边首先以一个简单的测试代码来解释这两者的区别: @Test void stringTest(){ String a = " "; boolean empty = StringUt ...
- Java多线程中提到的原子性和可见性、有序性
1.原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...
- 【POJ】2253 Frogger
= =.请用C++提交.. 如果有朋友能告诉我G++和C++交题什么机制..我感激不尽.G++杀我. 题目链接:http://poj.org/problem?id=2253 题意:青蛙A要去找B约会, ...
- QTP,自己主动化測试学习笔记,六月九号
測试自己主动化实现的两个难点设计--功能分解 实现--对象的识别 測试自己主动化实现的两个难点-功能分解 清晰画出业务流程图 依据业务流程分解业务功能.能够被复用的功能也要被分解出来. 依照路径覆盖的 ...