参考:

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分页的更多相关文章

  1. SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)

    一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. pageHelper分页

    引入jar包 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pag ...

  3. spring-boot-2.0.3源码篇 - pageHelper分页,绝对有值得你看的地方

    前言 开心一刻 说实话,作为一个宅男,每次被淘宝上的雄性店主追着喊亲,亲,亲,这感觉真是恶心透顶,好像被强吻一样.........更烦的是我每次为了省钱,还得用个女号,跟那些店主说:“哥哥包邮嘛么叽. ...

  4. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  5. SpringBoot2.0之五 优雅整合SpringBoot2.0+MyBatis+druid+PageHelper

    上篇文章我们介绍了SpringBoot和MyBatis的整合,可以说非常简单快捷的就搭建了一个web项目,但是在一个真正的企业级项目中,可能我们还需要更多的更加完善的框架才能开始真正的开发,比如连接池 ...

  6. SpringBoot2.0+Mybatis+PageHelper+Redis实现缓存

    1.在maven引入相关的依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactI ...

  7. SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...

  8. spring-boot-2.0.3应用篇 - shiro集成

    前言 上一篇:spring-boot-2.0.3源码篇 - 国际化,讲了如何实现国际化,实际上我工作用的模版引擎是freemaker,而不是thymeleaf,不过原理都是相通的. 接着上一篇,这一篇 ...

  9. spring-boot-2.0.3之quartz集成,不是你想的那样哦!

    前言 开心一刻 晚上回家,爸妈正在吵架,见我回来就都不说话了,看见我妈坐在那里瞪着我爸,我就问老爸“你干什么了惹我妈生这么大气?”  我爸说“没有什么啊,倒是你,这么大了还没有媳妇,要是你有媳妇给我们 ...

随机推荐

  1. Delphi中绘制圆角矩形的窗体

    制作圆角矩形的窗体: 01.procedure TPortForm.FormCreate(Sender: Tobject); 02.var hr :thandle; 03.begin 04.hr:=c ...

  2. [NOI.AC] candy

    题意:求净利益. 思路: 其实我也不怎么懂题面. 不过这种题一般来说就是从最大的开始选. 所以考虑贪心. 那么代价如何处理呢?? 我们考虑两个序列同时选数,把代价每次记录到一个序列的和上,那么对于两次 ...

  3. var 更明确地表示一个变量被设置为零值

    创建一个变量并被初始化其为零值,习惯使用关键字var.这种做法是为了更明确地表示一个变量被设置为零值. 如果变量被初始化为某个非零值,就配合结构字面量和短变量操作符来创建变量. 零值 数值类型:0 字 ...

  4. c实现swap函数陷阱

    swap函数陷阱 使用c实现一个交换两个数的函数,代码很简单: void swap(int *a, int *b) { *a ^= *b; *b ^= *a; *a ^= *b; } 只有3行代码,且 ...

  5. class8_Canvas 画布

    最终的部分运行效果图(程序见序号4): #!/usr/bin/env python# -*- coding:utf-8 -*-# ----------------------------------- ...

  6. Codeforces 1159A A pile of stones

    题目链接:http://codeforces.com/problemset/problem/1159/A 题意:初始石头堆石子数未知,求进行 n 次加减操作后,石头堆石子数最小的可能是多少. 思路:正 ...

  7. solr +zookeeper+tomcat 集群搭建

    最近需要搭建一个cloudSolr集群,写下记录.基础环境是在centos6.5 64bit 3个下载地址: 1. 下载Solr-4.x http://lucene.apache.org/solr/d ...

  8. 厉害了,Spring Cloud Alibaba 发布 GA 版本!

    ? 小马哥 & Josh Long ? 喜欢写一首诗一般的代码,更喜欢和你共同 code review,英雄的相惜,犹如时间沉淀下来的对话,历久方弥新. 相见如故,@杭州. 4 月 18 日, ...

  9. Vue项目中同级组件传值的例子

    大家好,今天给大家带来Vue项目中同级组件之间传值的例子,父子组件之间的通信比较简单,这里不做讨论. 假设该项目中的需求如下: 图中左上角有一个按钮,我们的需求是点击它时,侧边导航栏收缩且主界面放大, ...

  10. C# 创建DataTable并添加行和列

    DataTable dt=new DataTable dt.Columns.Add("numview", typeof(Int32)); dt.Columns.Add(" ...