PageHelper在springboot+mybatis框架中的使用步骤及原理解析
作者:全国青少年熬夜大赛冠军 发布时间:2023-07-28 21:40:09
标签:PageHelper,springboot,mybatis
一、思路
将分页所需的内容都放到一个实体类中
分页数据所需要的实体类!内包含页码,页大小,总条数,总页数,起始行
pagehelpr提供了这个类 pageInfo,不需要我们自己创建
二、主要逻辑
select * from 表名 limit 起始行,展示几条数据
#第n页 每页展示五条数据
select * from 表名 limit (n-1)*5,5
#每页展示多少条 pageSize
3
#总共有多少条
total
select count(*) from 表名
#总页数
pages
pages=total%pagesSize==0?total/pgeSize:total/pageSize+1;
#当前页
pageNum
三、步骤
1.引入pagehelper依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
#pagehelper分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
2.bean实体类
用户实体:
package com.qianfeng.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Register {
private Integer id;
private String userName;
private String passWord;
private String rePassWord;
private String idCard;
private String gender;
}
返回前端的实体类:包括查到的数据和分页数据
package com.qianfeng.bean;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RegPage {
private PageInfo pageInfo;
private List<Register> registers;
}
2.mapper层:
package com.qianfeng.mapper;
import com.qianfeng.bean.Register;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface PageDao {
List<Register> getAll(Integer startRow,Integer pageSize);
long getCount();
}
3.service层:
package com.qianfeng.service;
import com.github.pagehelper.PageInfo;
import com.qianfeng.bean.RegPage;
public interface RegService {
RegPage getAll(PageInfo pageInfo);
}
4.serviceImpl:
package com.qianfeng.service.serviceImpl;
import com.github.pagehelper.PageInfo;
import com.qianfeng.bean.RegPage;
import com.qianfeng.bean.Register;
import com.qianfeng.mapper.PageDao;
import com.qianfeng.service.RegService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RegServiceImpl implements RegService {
@Autowired
private PageDao pageDao;
@Override
public RegPage getAll(PageInfo pageInfo) {
List<Register> all = pageDao.getAll(pageInfo.getStartRow(), pageInfo.getPageSize());//分页后的数据
long count = pageDao.getCount();//总记录条数
pageInfo.setTotal(count);
//总页数
int pages= (int) (pageInfo.getTotal()%pageInfo.getPageSize()==0?pageInfo.getTotal()/pageInfo.getPageSize():pageInfo.getTotal()/pageInfo.getPageSize()+1);
pageInfo.setPages(pages);
RegPage regPage = new RegPage();
regPage.setPageInfo(pageInfo);
regPage.setRegisters(all);
return regPage;
}
}
5.handler层:
package com.qianfeng.handler;
import com.github.pagehelper.PageInfo;
import com.qianfeng.bean.RegPage;
import com.qianfeng.service.RegService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RegHandler {
@Autowired
private RegService regService;
@RequestMapping("/page/{pageNum}")
public RegPage regPage(@PathVariable("pageNum") Integer pageNum){
System.out.println(".........");
PageInfo pageInfo = new PageInfo();
pageInfo.setPageNum(pageNum);
pageInfo.setPageSize(3);
pageInfo.setStartRow((pageNum-1)*pageInfo.getPageSize());
System.out.println("startRow" + pageInfo.getStartRow());
return regService.getAll(pageInfo);
}
}
6.mapper.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.qianfeng.mapper.PageDao">
<select id="getAll" resultType="com.qianfeng.bean.Register">
select * from m_register limit #{startRow},#{pageSize}
</select>
<select id="getCount" resultType="java.lang.Long">
select count(*) from m_register
</select>
</mapper>
7.application.yaml
spring:
datasource:
url: jdbc:mysql:///map?serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.qianfeng.* #监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet: # 配置监控页功能
enabled: true
login-username: admin
login-password: admin
resetEnable: false
web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat: # 对上面filters里面的stat的详细配置
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# mybatis的配置规则
mybatis:
#config-location: classpath:mapper/mybatis-config.xml
mapper-locations: classpath:mapper/*
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# static-locations: [classpath:/haha/] # 静态资源路径自定义
8.application,properties
spring.main.allow-circular-references=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
关于PageInfo这个类,源码如下:
public class PageInfo implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow 和endRow 不常用,这里说个具体的用法
//可以在页面中"显示startRow 到endRow 共size 条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
}
目录结构:
来源:https://blog.csdn.net/mwenhui/article/details/129113956


猜你喜欢
- 本文实例为大家分享了Android实现欢迎滑动页面的具体代码,供大家参考,具体内容如下一、效果图二、源码1.activity_welcome
- 之前有做过手机端后台的国际化,因为手机统一传递了language参数所以只要设置LocaleChangeInterceptor就行了/**
- 本文实例为大家分享了Android自定义轮播图的具体代码,供大家参考,具体内容如下定义Banner主要使用ViewPager实现滑动publ
- 一、连接数据库的配置单独放在一个properties文件中之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中
- **写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的一些理解
- 反编译jar包并修改class文件重新打包这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包本来是很简单的问题,但是因为这个
- Model与Session区别什么是Session:Session:在计算机中,尤其是在网络应用中,称为“会话”。它具体是指一个终端用户与交
- Java中代码的加载顺序所能了解的知识点类的依赖关系static代码块的加载时间继承类中构造器的隐式调用非static的成员变量初始化时间m
- java 枚举的功能挺多,但是坑更多,使用的时候要注意。如下面这个枚举。@Getter@AllArgsConstructorpublic e
- 概述状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托到 代表当前状态的对
- 简述Preference是Android的控件之一,相对来说我们用的比较少,但在系统应用的Settings设置应用模块中大部分由Prefer
- 前言众所周知在spring boot内,设置session过期时间只需在application.properties内添加server.se
- 线程池的好处可以实现线程的复用,避免重新创建线程和销毁线程。创建线程和销毁线程对CPU的开销是很大的。可以限制最大可创建的线程数,可根据自己
- ForkJoinTask就是ForkJoinPool里面的每一个任务。他主要有两个子类:RecursiveAction和RecursiveT
- public static string GetMD5(string sDataIn) &nb
- AutoCompleteTextView是实现动态匹配输入内容的一种输入框(EditText),如输入“and”时,会提示“Android”
- 实例如下:static bool CheckPowerOfTwo(ulong num){ return num > 0 &
- 本文实例分析了C#中var关键字用法。分享给大家供大家参考。具体方法如下:C#关键字是伴随着.NET 3.5以后,伴随着匿名函数、LINQ而
- 前言最近开发中用到许多对话框,之前都是在外面的代码中创建AlertDialog并设置自定义布局实现常见的对话框,诸如更新提示等含有取消和删除
- 1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate--> onStart