pagehelper源码解析

合集下载

pagehelper的用法以及封装成pagedto

pagehelper的用法以及封装成pagedto

pagehelper的用法以及封装成pagedtoPageHelper是一个用于分页的插件,可以便捷地实现数据库查询结果的分页操作。

它基于MyBatis实现,提供了一系列静态方法来对查询语句进行分页处理。

使用PageHelper的步骤如下:1.引入PageHelper的依赖:```xml<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>最新版本号</version></dependency>```2.在查询之前调用PageHelper的startPage方法设置分页参数:```java//第一个参数表示当前页码,第二个参数表示每页的数据量PageHelper.startPage(pageNum, pageSize);```3.执行查询操作,查询结果会被自动分页:```javaList<User> userList = userDao.getUserList();```4.可以使用PageInfo对象来获取分页的详细信息:```javaPageInfo<User> pageInfo = new PageInfo<>(userList); ```以下是封装成PagedDto的拓展:```javapublic class PagedDto<T> {private List<T> data; //分页查询结果的数据列表private int pageNum; //当前页码private int pageSize; //每页的数据量private int total; //总数据量private int pages; //总页数// Getters and Setters...}```封装成PagedDto后,我们可以将分页查询结果封装到PagedDto 对象中,便于在前端展示和处理分页信息。

pagehelper计算总条数原理

pagehelper计算总条数原理

pagehelper计算总条数原理PageHelper是Mybatis中分页插件,可以方便地对查询结果进行分页,对于查询语句结果过多时,可以提高查询效率并减轻数据库的压力,此外,PageHelper自带了计算总条数的功能,本文将围绕此功能展开。

1.创建Page对象Page是PageHelper中用来存储分页信息的对象,我们需要首先创建一个新的Page对象,例如:```javaPage<Object> page = PageHelper.startPage(1, 10);```其中1表示当前页码,10表示每页显示的数据条数,这句话的含义是从第1页开始,每页显示10条数据。

2.执行查询语句接着,我们需要执行我们的查询语句,例如:```javaList<Student> studentList =studentMapper.selectByExample(example);```这句话的含义是通过Example对象example来执行查询语句,将查询结果存储在studentList中。

3.获取总条数最后一步,我们需要通过Page对象来获取总条数,例如:```javalong total = page.getTotal();```其中,getTotal()方法会返回查询结果的总条数。

那么,PageHelper是如何实现计算总条数的呢?在上述三个步骤中,我们可以发现,PageHelper主要存储了以下信息:- 当前页码- 每页显示的数据条数- 查询条件- 排序规则其中,前三个信息是分页相关的,而查询条件和排序规则是与分页无关的。

PageHelper会首先根据查询条件和排序规则执行实际的查询语句,获取查询结果的总条数,将其存储在Page对象中,然后再根据当前页码和每页显示的数据条数来获取当前页的数据。

以获取总条数为例,PageHelper中的方法调用顺序如下:```javapublic <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {this.pageSize = pageSize;this.pageNum = pageNum;this.count = count;if (count) {if (reasonable == null) {// null时,会设置为默认值// 10w条以内,执行count查询数量,超过10w条数据时,不再执行count查询数量,建议自行处理分页合理性。

pagehelper用法

pagehelper用法

pagehelper用法PageHelper是一款非常有用的MySQL分页插件,它可以帮助我们快速、方便地实现MySQL数据库的分页查询功能。

本文将介绍PageHelper的用法,并给出一个完整的示例,以供参考。

1. PageHelper简介PageHelper是一款开源的MySQL分页插件,它的原理很简单,可以使查询的数据按指定的页数显示出来,从而实现了对数据的分页查询。

PageHelper除了具备普通的分页功能外,还可以实现自定义分页,并能支持多种数据库格式,如Oracle、MySQL、MSSQL等。

2. PageHelper使用2.1入PageHelper使用PageHelper之前,需要将PageHelper添加到项目中,这可以用Maven、Gradle或者手动使用Jar包的方式实现。

Maven和Gradle 可以使用以下依赖来引入PageHelper:Maven:<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.5</version></dependency>Gradle:implementation com.github.pagehelper:pagehelper:5.1.52.2 使用PageHelperPageHelper的使用非常简单,只需要在要执行分页查询语句前,使用PageHelper.startPage(int pageNum, int pageSize)方法设置页码和每页显示行数即可,如下所示:int pageNum = 1; // 代表当前页面int pageSize = 10; // 代表每页显示的记录数PageHelper.startPage(pageNum, pageSize); // 使用PageHelperList<User> list = userDao.listUser(); //询user表完整的实例如下:public class UserDao {public List<User> listUser(int pageNum, int pageSize) { //置页码和每页显示行数PageHelper.startPage(pageNum, pageSize);//询user表List<User> list = userMapper.listUser();//回结果return list;}}3.结本文介绍了PageHelper的用法,它可以实现对MySQL数据库的分页查询,让查询的数据按指定的页数显示出来,大大提高了开发效率,降低繁琐的分页查询操作。

pagehelper的pageinfo对象

pagehelper的pageinfo对象

pagehelper的pageinfo对象PageHelper是一个开源的用于分页插件,被广泛应用于Java项目中。

它提供了一个PageInfo对象用于存储分页信息,并提供了一系列方法用于获取和处理分页信息。

PageInfo对象是PageHelper框架提供的一个核心类,用于封装分页结果。

它包含了当前页码、每页显示数量、总记录数、总页数等分页相关的属性。

通过PageInfo对象,我们可以轻松地获取和操作分页信息,方便地完成分页功能的实现。

PageHelper框架的设计思想主要是将传统的数据库分页与应用层进行解耦。

通常情况下,我们在应用层中直接调用数据库的分页查询方法,使用传统的分页方式,即通过LIMIT和OFFSET关键字来实现查询结果的分页。

但是这种方式的局限性比较大,代码不够简洁和优雅,同时也无法很好地适应各种数据库的特性。

PageHelper的出现就是为了解决这些问题。

通过PageInfo对象,我们可以将数据库查询的结果集放入PageInfo中,然后通过调用PageInfo提供的方法,实现对分页信息的获取和处理。

PageInfo对象提供了非常丰富的方法,供开发者选择和使用。

PageInfo对象的常用方法包括:1. getPageNum():获取当前页码。

2. getPageSize():获取每页显示数量。

3. getTotal():获取总记录数。

4. getPages():获取总页数。

5. isFirstPage():判断当前是否为第一页。

6. isLastPage():判断当前是否为最后一页。

7. getPrePage():获取上一页页码。

8. getNextPage():获取下一页页码。

9. isHasPreviousPage():判断是否有上一页。

10. isHasNextPage():判断是否有下一页。

使用PageInfo对象非常简单,只需将查询结果集放入PageInfo 中,然后调用相应的方法即可。

pagehelper pageinfo对象参数

pagehelper pageinfo对象参数

pagehelper pageinfo对象参数
在使用`pagehelper`时,`pageinfo`对象的参数包括:
- pageNum:表示当前的页码。

- pageSize:表示每页显示的条数。

- size:表示当前页实际的条数。

- startRow:表示当前页的起始行数。

- endRow:表示当前页的结束行数。

- total:表示总的记录数。

- pages:表示总的页数。

- list:表示当前页的数据集合。

- firstPage:表示是否为第一页。

- prePage:表示上一页的页码。

- nextPage:表示下一页的页码。

- lastPage:表示是否为最后一页。

- isFirstPage:表示是否为第一页。

- isLastPage:表示是否为最后一页。

- hasPreviousPage:表示是否有上一页。

- hasNextPage:表示是否有下一页。

- navigatePages:表示导航页码数。

- navigatepageNums:表示所有导航页码的数组。

这些参数可以帮助你在使用`pagehelper`时获取和处理页面信息,以满足不同的需求。

Pagehelper使用笔记

Pagehelper使用笔记

Pagehelper使⽤笔记参考资料pageInfo的参数说明:为什么 PageInfo.navigatepageNums 的值总为 1:参数说明PageInfo{pageNum=1, //当前页码pageSize=2, //每页显⽰数量size=2, //当前页显⽰的数量startRow=1, //开始⾏endRow=2, //结束⾏total=6, //总记录数pages=3, //总页数list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=6, pages=3, reasonable=false, pageSizeZero=false}, prePage=0, //上⼀页nextPage=2, //下⼀页isFirstPage=true, //是第⼀页isLastPage=false, // 是最后⼀页hasPreviousPage=false, //有上⼀页hasNextPage=true, //有下⼀页navigatePages=2, //导航页数navigateFirstPage=1, //导航到第⼀页navigateLastPage=2, //导航到最后⼀页navigatepageNums=[1, 2] //导航页数页码}使⽤步骤引⼊依赖<!--分页插件--><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.4.1</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.1</version></dependency>配置⽂件#分页pageHelperpagehelper:helper-dialect: mysqlreasonable: truesupport-methods-arguments: true代码⽰例Servicepublic PageInfo<QuestionDTO> list(int pageNo,int size,int pageShowCount) {PageHelper.startPage(pageNo, size);List<Question> questionList = questionMapper.list();PageInfo<Question> questionPageInfo = new PageInfo<>(questionList,pageShowCount);List<QuestionDTO>questionDTOList = new ArrayList<>();for(Question question : questionPageInfo.getList()){User user = userMapper.findById(question.getCreator());QuestionDTO questionDTO = new QuestionDTO();BeanUtils.copyProperties(question,questionDTO);questionDTO.setUser(user);questionDTOList.add(questionDTO);}PageInfo<QuestionDTO> questionDTOPageInfo = new PageInfo<>();BeanUtils.copyProperties(questionPageInfo, questionDTOPageInfo);questionDTOPageInfo.setList(questionDTOList);return questionDTOPageInfo;}Controller@GetMapping("/")public String hello(HttpServletRequest request, Model model,@RequestParam(name = "page",defaultValue = "1")Integer pageNo,//当前页码@RequestParam(name = "size",defaultValue = "2")Integer size,@RequestParam(name = "pageShowCount",defaultValue = "4")Integer pageShowCount){Cookie[] cookies = request.getCookies();/*检查浏览器中有没有我们设置的cookie对象*/if(cookies != null){for(Cookie cookie : cookies){if( "token".equals(cookie.getName())){/*根据 cookie 中我们设置的数据来查找数据库中的⽤户信息*/String token = cookie.getValue();User user = userMapper.findToken(token);if(user != null){/*根据 cookie找到了⽤户信息,把它保存到session域中*/request.getSession().setAttribute("user", user);}break;}}}PageInfo<QuestionDTO> list = questionService.list(pageNo, size, pageShowCount);model.addAttribute("questions", list);return "index";}前端代码-分页条<nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous" th:href="@{/(page=${questions.navigateFirstPage})}" ><span aria-hidden="true">&laquo;</span></a></li><li th:each="page:${questions.getNavigatepageNums}" th:class="${questions.pageNum == page}? 'active':'' "><a th:href="@{/(page=${page})}" th:text="${page}" ></a></li><li><a href="#" aria-label="Next" th:href="@{/(page=${questions.navigateLastPage})}"><span aria-hidden="true">&raquo;</span></a></li></ul></nav>⼤坑在使⽤pagehelper插件的时候,如果只是对查到的数据进⾏直接分页(如下),不会有什么问题,但是,我们经常需要对查询的的数据经⾏⼆次操作,就如同我的Service层代码那样,虽然操作后数据正常分页,但pageInfo中的参数基本都不是我们想要的,所以需要⼀些转变PageHelper.startPage(pageNo, size);List<Question> questionList = questionMapper.list();PageInfo<Question> questionPageInfo = new PageInfo<>(questionList,pageShowCount);。

pagehelper count参数

pagehelper count参数

pagehelper count参数 页面辅助工具PageHelper在处理大量数据展示时,提供了一个count参数,用于获取记录总数。这对于数据分析、报表统计等场景非常实用。下面将详细介绍PageHelper count参数的用法及其优势和注意事项。 一、概述PageHelper计数参数的作用 在实际应用中,当我们需要展示大量数据时,往往需要知道数据的总数,以便更好地进行分页展示。PageHelper的count参数就是在这种背景下应运而生的。通过count参数,我们可以轻松地获取到记录总数,进而根据实际需求进行分页展示。 二、详细介绍PageHelper count参数的用法 1.首先,确保已经引入了PageHelper的依赖。如果使用的是Spring Boot项目,可以通过在pom.xml文件中添加以下依赖: ```xml com.github.pagehelper pagehelper-spring-boot-starter 1.2.13 ``` 2.在查询语句中添加count参数。以下是一个MyBatis的示例: ```xml SELECT COUNT(*) FROM your_table SELECT *, COUNT(*) OVER () as count FROM your_table ``` 3.在Service层调用查询方法,并传入分页参数。以下是一个简单的示例: ```java @Service public class YourService { @Autowired private YourMapper yourMapper; public IPage getDataWithCount(Page page) { PageHelper.startPage(page.getPageNum(), page.getPageSize()); List dataList = yourMapper.selectWithCount(); Page resultPage = new Page<>(page.getPageNum(), page.getPageSize(), dataList.size()); return resultPage; } } ``` 三、举例说明如何应用PageHelper count参数 假设我们有一个用户表,包含如下字段:id、name、age。我们可以通过以下方式获取用户总数并进行分页展示: 1.创建一个User实体类: ```java public class User { private Integer id; private String name; private Integer age; // 省略getter和setter方法 } ``` 2.创建UserMapper接口,继承BaseMapper接口: ```java public interface UserMapper extends BaseMapper { } ``` 3.在Service层调用getDataWithCount方法,传入分页参数: ```java @Autowired private UserService userService; public IPage getUsersWithCount(Page page) { return userService.getDataWithCount(page); } ``` 四、总结PageHelper count参数的优势和注意事项 1.优势: - 方便快捷:只需在查询语句中添加count语句,即可轻松获取记录总数。 - 兼容性:支持MyBatis、Hibernate等多种查询框架。 - 灵活性:可以根据实际需求进行分页展示,满足不同场景的要求。 2.注意事项: - 确保已引入PageHelper依赖。 - 在调用查询方法时,需传入分页参数,如page对象。 - 根据实际需求调整分页参数,如分页大小、分页编号等。 通过以上介绍,相信大家对PageHelper count参数已经有了更深入的了解。

PageHelper分页插件及PageInfo介绍及使用

PageHelper分页插件及PageInfo介绍及使用

PageHelper分页插件及PageInfo介绍及使用使用PageHelper需要引入相关依赖,并在MyBatis的配置文件中进行配置。

下面是使用PageHelper进行分页的几个步骤:1.引入依赖在项目的pom.xml文件中加入PageHelper的依赖:```xml<dependency><artifactId>pagehelper</artifactId><version>最新版本</version></dependency>```2.配置拦截器在MyBatis的配置文件中配置PageHelper的拦截器:```xml<plugins></plugins>```3.分页查询```javaList<User> getUsers(;```4.获取分页结果在查询方法执行后,使用PageInfo类来获取分页信息:```javaPageInfo<User> pageInfo = new PageInfo<>(users);System.out.println("总记录数:" + pageInfo.getTotal();System.out.println("总页数:" + pageInfo.getPages();System.out.println("每页记录数:" + pageInfo.getPageSize();//输出分页后的结果List<User> resultList = pageInfo.getList(;```通过以上几个步骤,即可完成使用PageHelper进行分页查询的操作。

除了上述介绍的基本用法外,PageHelper还提供了一些高级功能,如支持排序、支持count查询等,可以根据具体需求进行配置和使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pagehelper源码解析PageHelper 是一个开源的 MyBatis 分页插件,它可以为我们简化分页查询的操作,提供了方便的使用方式。

本文将对PageHelper 的源码进行解析,探讨其实现原理。

一、PageHelper的作用和使用在开发中,我们经常需要对数据库进行分页查询,以减轻数据库的压力,提高查询效率。

而在使用 MyBatis 框架进行数据库操作时,PageHelper 可以帮助我们快速实现分页功能。

PageHelper 的作用主要有以下几个方面:1.自动拦截数据库操作语句,在执行前根据分页参数进行自动分页。

2.提供了方便的设置和获取分页参数的方式。

3.提供了一些有用的分页工具类。

在使用 PageHelper 之前,我们首先需要引入相应的依赖,例如 Maven 项目中可以在 pom.xml 文件中添加以下内容:<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.11</version></dependency>然后在 MyBatis 的配置文件中配置 PageHelper 插件:<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="dialect" value="mysql"/></plugin></plugins>在配置好 PageHelper 插件后,我们就可以直接在代码中使用PageHelper.startPage() 方法进行分页查询了。

二、PageHelper的源码分析1.拦截器初始化当 MyBatis 启动时,PageHelper 的拦截器会被初始化。

在PageHelper 的源码中,可以看到它实现了 Interceptor 接口,并覆写了它的 intercept() 方法:@Overridepublic Object intercept(Invocation invocation) throws Throwable { // 具体的拦截逻辑}intercept() 方法是拦截器的核心方法,当执行数据库操作时会被调用。

2.执行拦截逻辑在 intercept() 方法中,首先判断是否需要拦截,当当前执行的方法为 StatementHandler 的 prepare() 方法时,才进行拦截处理:if (invocation.getTarget() instanceof StatementHandler) {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();MetaObject metaObject = MetaObjectUtils.forObject(statementHandler, this.objectFactory,this.objectWrapperFactory, this.reflectorFactory);String mappedStatementId = mappedStatement.getId();...接着,通过反射获取到当前执行的方法,判断是否调用了prepare() 方法,如果是,则执行以下逻辑:if(mappedStatementId.matches(this.helper.getProperties().getPropert y("autoRuntimeDialect"))) {// 自动识别运行时 SQL 类型this.autoDialect(metaObject.mutator("configuration"));}// 获取分页参数Page<?> page = getLocalPage();if (page == null || !(page instanceof Page)) {return invocation.proceed();}BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();// 判断是否需要进行分页if (page.isAutoCount()) {// 统计总记录数PageInfo<?> pageInfo = page.toPageInfo();if (pageInfo.isFirstPage()) {// 首次查询时,需要统计总记录数int count = count(invocation, metaObject, mappedStatementId, boundSql, pageInfo);pageInfo.setTotal(count);page.setTotal(count);}this.helper.postPage(pageInfo);}// 进行分页查询String dialect = this.helper.getProperties().getProperty("dialect");if (StringUtil.isNotEmpty(dialect)) {// 执行分页查询逻辑pageSqlDialect(metaObject.accessor("delegate.mappedStatement") .getter(),boundSql, page, dialect);} else if (page.isOffsetPage()) {// 当前数据库不支持自动识别时,根据页码和每页条数计算偏移量进行分页String pageSql = this.helper.pageSql(sql, page);metaObject.mutator("delegate.boundSql.sql").set(pageSql);}return invocation.proceed();在这段代码中,首先判断是否需要拦截,然后获取分页参数并判断是否需要进行分页查询。

如果需要进行分页,则通过调用helper.pageSql() 方法生成相应的分页 SQL,并将其设置到BoundSql 对象中。

3.分页 SQL 生成PageHelper 使用了分页插件的方式实现分页功能,它会根据不同的数据库类型生成相应的分页 SQL。

在 PageHelper 中定义了 Dialect 接口,每个数据库类型都需要实现这个接口来实现不同的分页逻辑。

在 PageHelper 的源码中,可以看到有一个默认的 Dialet 实现类 MysqlDialect,它实现了 Dialect 接口,其中有一个getPageSql() 方法用来生成 MySQL 分页 SQL:@Overridepublic String getPageSql(String sql, Page<?> page) {StringBuilder pageSql = new StringBuilder();String begin = "SELECT tb1.* FROM (";String end = ") tb1 LIMIT ?, ?";pageSql.append(begin);pageSql.append(sql);pageSql.append(end);return pageSql.toString();}这段代码中,通过拼接字符串的方式生成了 MySQL 的分页SQL。

其他数据库的分页逻辑也是类似的,只是生成的 SQL 语句略有不同。

4.总记录数的统计在进行分页查询之前,我们通常需要先统计总记录数。

在PageHelper 中,通过调用 count() 方法来实现这个功能:private int count(Invocation invocation, MetaObject metaObject, String mappedStatementId, BoundSql boundSql, PageInfo<?> pageInfo) throws SQLException {...// 根据当前的 SQL 语句生成统计总记录数的 SQLString countSql =this.helper.getCountSql(metaStatementHandler, boundSql, mappedStatement);Object result = executor.query(ms, parameter, rowBounds, executeMethod);// 查询总记录数int count = (Integer) ((List) result).get(0);...在这段代码中,首先通过调用 helper.getCountSql() 方法生成统计总记录数的 SQL,然后执行查询操作获取总记录数。

5.分页参数的设置和获取PageHelper 提供了方便的方式来设置和获取分页参数。

在PageHelper 的源码中,可以看到有一系列的 setXXX() 和getXXX() 方法,用来设置和获取分页参数:public static void offsetPage(int pageNum, int pageSize) {Page<?> page = new Page<>();page.setPageNum(pageNum);page.setPageSize(pageSize);PageHelper.setLocalPage(page);}public static void startPage(int pageNum, int pageSize) {Page<?> page = new Page<>();page.setPageNum(pageNum);page.setPageSize(pageSize);PageHelper.setLocalPage(page);}public static Page<?> getLocalPage() {return localPage.get();}public static void setLocalPage(Page<?> page) {localPage.set(page);}通过调用 setLocalPage() 方法可以设置分页参数,通过调用getLocalPage() 方法可以获取当前的分页参数。

相关文档
最新文档