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;
}

目录结构:

到此这篇关于PageHelper在springboot+mybatis框架中的使用步骤及原理的文章就介绍到这了,更多相关PageHelper在springboot+mybatis框架使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PageHelper引发的幽灵数据问题解析

    目录 前言 大胆猜测 PageHelper工作原理 Tomcat请求流程 总结 前言 最近测试反馈一个问题,某个查询全量信息的接口,有时候返回全量数据,符合预期,但是偶尔又只返回1条数据,简直就是“见鬼”了,究竟是为什么出现这样的“幽灵数据”呢? 大胆猜测 首先我们看了下这对代码的业务逻辑,非常的简单,总共没有几行代码,也没有分页逻辑,代码如下: public List<SdSubscription> findAll() { return sdSubscriptionMapper.select

  • pageHelper一对多分页解决方案示例

    目录 pageHelper 1.使用嵌套查询 2.使用自定义统计查询 pageHelper 是一个非常方便实用的 Java 分页插件,可以轻松实现数据库分页查询.而在一对多的情况下,如果要实现主表和从表的联合分页查询,可以采用以下两种解决方案: 1.使用嵌套查询 在 SQL 语句中使用嵌套查询,先在主表中查询出需要的数据信息,然后再根据这些信息去查询对应的从表数据.具体的 SQL 语法如下: SELECT m.*, (SELECT COUNT(1) FROM sub_tab s WHERE s.

  • Spring 中 PageHelper 不生效问题及解决方法

    使用这个插件时要注意版本的问题,不同的版本可能 PageHelper 不会生效 springboot 导入的 pagehelper 包 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.6</version> </depen

  • 解决pageHelper分页失效以及如何配置问题

    目录 pageHelper分页失效及配置问题 原因 解决方案 PageHelper分页无效及报错 第一种情况SQL报错 第二种情况分页无效 总结 pageHelper分页失效及配置问题 我在使用pageHelper的系统中加入mybatis-plus, 结果所有分页都失效了 原因 我这边的失效原因初步定为是因为mybatis-plus的自动配置和pageHelper的自动配置冲突了, 导致pageHelper的自动配置失效(最终是加上个配置类解决的) 解决方案 新建一个配置类 /**  * @A

  • 详解idea搭建springboot+mybatis框架的教程

    1.打开idea编译器,新建一个项目 2.选择Spring Initializr 勾选Default,完成之后点击[Next] 3.创建项目的文件目录结构以及选择jdk版本信息,设置完成后点击[Next] 4.选择项目所需要的依赖,在Web里面勾选Spring Web 在SQL里勾选需要的依赖,点击[Next] 5.修改项目名称,项目存放路径,点击[finish] 6.创建完成之后需要保持网络良好,因为需要加载刚才所选择的依赖(下载依赖可能需要很长时间,一定要在网络良好的情况下载,并且耐心等待)

  • Java的MyBatis框架中XML映射缓存的使用教程

    MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.默认情况下是没有开启缓存的,要开启二级缓存,你需要在你的SQL映射文件中添加一行: <cache/> 字面上看就是这样.这个简单语句的效果如下: 1.映射语句文件中的所有select语句将会被缓存. 2.映射语句文件中的所有insert,update和delete语句会刷新缓存. 3.缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回. 4.根据时间表(比如 no Flush Inter

  • MyBatis框架中mybatis配置文件详细介绍

    一.注册DB连接四要素属性文件 <propertiesresource="jdbc.properties"/> 二.将指定包中所有类的简单类名当作其别名 <typeAliases> <packagename="com.bjpowernode.beans"/> </typeAliases> 三.配置运行环境 <environmentsdefault="testEM"> <enviro

  • MyBatis框架底层的执行原理源码解析

    目录 1.前言 2.案例项目源码 3.MyBatis源码解析底层执行原理 3.1 读取mybatis配置文件创建出SqlSeesionFactory对象 3.2 通过SqlSeesionFactory对象进而创建出SqlSession对象 3.3 通过SqlSession的getMapper获取到接口代理对象 3.4 通过mapper接口的代理对象执行CRUD 1.前言 MyBatis框架大家肯定都用过的,废话我就不再多说了,这篇文章就给大家分享一下有关MyBatis框架底层的执行原理吧(Deb

  • Python中使用gflags实例及原理解析

    这篇文章主要介绍了Python中使用gflags实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装命令pip install python-gflags 使用示例: import gflags FLAGS = gflags.FLAGS gflags.DEFINE_string('name', 'ming', 'this is a value') gflags.DEFINE_integer('qps', 0, 'test qps'

  • java线程池中Worker线程执行流程原理解析

    目录 引言 Worker类分析 runWorker(Worker)方法 getTask()方法 beforeExecute(Thread, Runnable)方法 afterExecute(Runnable, Throwable)方法 processWorkerExit(Worker, boolean)方法 tryTerminate()方法 terminated()方法 引言 在<[高并发]别闹了,这样理解线程池执行任务的核心流程才正确!!>一文中我们深度分析了线程池执行任务的核心流程,在Th

  • Mybatis框架中Interceptor接口的使用说明

    目录 Mybatis Interceptor接口的使用 测试中使用的config文件内容如下 在配置文件中配置了一个Interceptor的实现类 Interceptor修改执行sql及传入参数 总体思路 1.Interceptor 代码实现 2.AutoConfiguration代码实现 Mybatis Interceptor接口的使用 关于Mybatis中插件的声明需要在configuration的配置文件中进行配置,配置文件的位置使用configLocation属性指定. 测试中使用的co

  • 整理Java的MyBatis框架中一些重要的功能及基本使用示例

    基本用法回顾: SQL语句存储在XML文件或Java 注解中.一个MaBatis映射的示例(其中用到了Java接口和MyBatis注解): package org.mybatis.example; public interface BlogMapper { @Select("select * from Blog where id = #{id}") Blog selectBlog(int id); } 执行的示例: BlogMapper mapper = session.getMapp

  • 在AngularJS框架中处理数据建模的方式解析

    我们知道,AngularJS并没有自带立等可用的数据建模方案.而是以相当抽象的方式,让我们在controller中使用JSON数据作为模型.但是随着时间的推移和项目的成长,我意识到这种建模的方式不再能满足我们项目的需求.在这篇文章中我会介绍在我的AngularJS应用中处理数据建模的方式. 为Controller定义模型 让我们从一个简单的例子开始.我想要显示一个书本(book)的页面.下面是控制器(Controller): BookController app.controller('Book

  • SpringBoot整合log4j日志与HashMap的底层原理解析

    一,SpringBoot与日志 1.springboot整合log4j日志记录 1.在resources目录下面创建日志文件,并引入: 代码如下(示例): #log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=info,error,CONSOLE,DEBUG log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=o

随机推荐