SpringMvc+Mybatis+Pagehelper分页详解

发布时间 - 2026-01-10 22:17:52    点击率:

最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适

故写一篇从零开始的PageHelper使用的教程,也记录下忙活一天的东西

1.首先需要在项目中添加PageHelper的依赖,这里我用的Maven添加

<dependency> 
 <groupId>com.github.pagehelper</groupId> 
 <artifactId>pagehelper</artifactId> 
 <version>4.1.6</version> 
</dependency> 

2.在mybatis的配置文件中添加对pagehelper 的配置

<configuration>   
  <plugins>  
    <!-- com.github.pagehelper为PageHelper类所在包名 -->  
    <plugin interceptor="com.github.pagehelper.PageHelper">  
      <!-- 4.0.0以后版本可以不设置该参数 -->  
      <property name="dialect" value="mysql"/>  
      <!-- 该参数默认为false -->  
      <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->  
      <!-- 和startPage中的pageNum效果一样-->  
      <property name="offsetAsPageNum" value="true"/>  
      <!-- 该参数默认为false -->  
      <!-- 设置为true时,使用RowBounds分页会进行count查询 -->  
      <property name="rowBoundsWithCount" value="true"/>  
      <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->  
      <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->  
      <property name="pageSizeZero" value="true"/>  
      <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->  
      <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->  
      <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->  
      <property name="reasonable" value="true"/>  
      <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->  
      <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->  
      <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->  
      <!-- 不理解该含义的前提下,不要随便复制该配置 -->  
      <!-- <property name="params" value="pageNum=start;pageSize=limit;"/> -->  
      <!-- 支持通过Mapper接口参数来传递分页参数 -->  
      <property name="supportMethodsArguments" value="true"/>  
      <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->  
      <property name="returnPageInfo" value="check"/>  
    </plugin>  
  </plugins>  
</configuration> 

3.添加一个PageBean的类来储存分页的信息

public class PageBean<T> implements Serializable { 
   private static final long serialVersionUID = 1L; 
    private long total; //总记录数 
    private List<T> list; //结果集 
    private int pageNum; //第几页 
    private int pageSize; //每页记录数 
    private int pages; // 总页数 
    private int size; //当前页的数量<=pageSize 
 
    public PageBean(List<T> list){ 
      if (list instanceof Page){ 
        Page<T> page = (Page<T>) list; 
        this.pageNum = page.getPageNum(); 
        this.pageSize = page.getPageSize(); 
        this.total = page.getTotal(); 
        this.pages = page.getPages(); 
        this.list = page; 
        this.size = page.size(); 
      } 
    } 
    public long getTotal() { 
      return total; 
    } 
    public void setTotal(long total) { 
      this.total = total; 
    } 
    public List<T> getList() { 
      return list; 
    } 
    public void setList(List<T> list) { 
      this.list = list; 
    } 
    public int getSize() { 
      return size; 
    } 
    public void setSize(int size) { 
      this.size = size; 
    } 
    public int getPageNum() { 
      return pageNum; 
    } 
    public void setPageNum(int pageNum) { 
      this.pageNum = pageNum; 
    } 
    public int getPageSize() { 
      return pageSize; 
    } 
    public void setPageSize(int pageSize) { 
      this.pageSize = pageSize; 
    } 
    public int getPages() { 
      return pages; 
    } 
    public void setPages(int pages) { 
      this.pages = pages; 
    } 
  } 

下面就是业务逻辑的代码了

4.首先从mapper.xml文件写起,操作数据库的sql,查出我们所需要的数据

<select id="selectallList" parameterType="com.alarm.bean.AlarmParamModel" 
  resultMap="AlarmMap"> 
  select message_id, seqnum, message_type, process_status, 
  distribute_status, processor, occur_time, close_time,  
  system_id, group_id, warn_level, message_content 
  from td_alarm_info 
</select> 

5.mapper的接口方法

public List<AlarmParamModel> selectallList(AlarmParamModel model); 

6.service的接口方法

Datagrid selectallList(AlarmParamModel model,int pageNum, int pageSize); 

7.service的实现类

   这里需要注意下,是分页的主要逻辑。pageNum表示页码,pageSize表示每页显示的数目,startPag方法是初始的页面,orderBy方法是将数据按某个字段进行排序,这里我用的是occr_time的降序(desc)

public Datagrid selectallList(AlarmParamModel model,int pageNum, int pageSize){ 
    PageHelper.startPage(pageNum, pageSize); 
    PageHelper.orderBy("occur_time desc"); 
     List<AlarmParamModel> list = this.alarmMgrMapper.selectallList(model); 
     PageInfo<AlarmParamModel> pageInfo = new PageInfo<AlarmParamModel>(list); 
    Datagrid datagrid = new Datagrid(pageInfo.getTotal(),pageInfo.getList()); 
     return datagrid; 
  } 

8.注意到我这边用了一个Datagrid类,是用于向前台传数据用的类,包括total(总数)和rows(数据)

public class Datagrid { 
  private long total; 
  private List rows = new ArrayList<>(); 
  public Datagrid() { 
    super(); 
  } 
  public Datagrid(long total, List rows) { 
    super(); 
    this.total = total; 
    this.rows = rows; 
  } 
  public long getTotal() { 
    return total; 
  } 
  public void setTotal(long total) { 
    this.total = total; 
  } 
  public List getRows() { 
    return rows; 
  } 
  public void setRows(List rows) { 
    this.rows = rows; 
  } 
} 

9.开始写controller层,调用之前写的方法

  这里需要注意的是,offset和limit 是前台传来的页码和每页显示的数量,区别于bootstraptable 的offset和limit,那个offset表示的是偏移量,即如果每页显示10条数据,那么bootstrap中的第二页表示的offset就是10,第一页和第三页分别是0和20。而我这里的offset就是指代的pageNum。

@RequestMapping(value = "/AlarmInfo/list", method = {RequestMethod.GET,RequestMethod.POST}) 
  @ResponseBody 
  public Datagrid alarmInfo(AlarmParamModel model,@RequestParam(value="offset",defaultValue="0",required=false)Integer pageNum,  
      @RequestParam(value="limit",defaultValue="10",required=false)Integer pageSize)  
  { 
    Datagrid datagrid = this.alarmMgrService.selectallList(model,pageNum, pageSize); 
    return datagrid; 
  } 

10. 到现在前台的请求已经可以获取后台的数据并且分页了,我再将我的前台bootstrap table 的配置贴一下

$('#tb_departments').bootstrapTable({ 
      url: 'http://10.1.234.134:8088/api/AlarmInfo/list',     //请求后台的URL(*) 
      method: 'get',           //请求方式(*) 
      striped: false,           //是否显示行间隔色 
      cache: false,            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) 
      pagination: true,          //是否显示分页(*) 
      onlyInfoPagination:true,     //设置为 true 只显示总数据数,而不显示分页按钮。需要 pagination='True' 
      sortable: true,           //是否启用排序 
      sortOrder: "asc",          //排序方式 
      queryParams: oTableInit.queryParams,//传递参数(*) 
      sidePagination: "server",      //分页方式:client客户端分页,server服务端分页(*) 
      pageNumber:1,            //初始化加载第一页,默认第一页 
      pageSize: 10,            //每页的记录行数(*) 
      pageList: [10, 25, 50, 100],    //可供选择的每页的行数(*) 
      search: false,            //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大 
      strictSearch: true, 
      showColumns: false,         //是否显示所有的列 
      showRefresh: false,         //是否显示刷新按钮 
      minimumCountColumns: 2,       //最少允许的列数 
      clickToSelect: true,        //是否启用点击选中行 
      checkboxHeader:true,       //add 
      height: 500,            //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度 
      uniqueId: "id",           //每一行的唯一标识,一般为主键列 
      showToggle:false,          //是否显示详细视图和列表视图的切换按钮 
      cardView: false,          //是否显示详细视图 
      detailView: true, 
      detailFormatter:detailFormatter , 
      paginationHAlign:"left", 
      paginationDetailHAlign:"right", 

这里我没有用bootstrap自带的分页按钮,我是自己用jq写的按钮组,在下一篇文章我会把按钮代码贴出来,这样可自定义的程度会高一些~  你也可以直接用bootstraptable子带的分页按钮,把配置改下就好。

以上所述是小编给大家介绍的SpringMvc+Mybatis+Pagehelper分页详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# springmvcmybatis分页  # springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能  # SpringBoot+Mybatis分页插件PageHelper实现分页效果  # Spring Boot+Mybatis+Pagehelper分页实现  # Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法  # SpringBoot集成MyBatis的分页插件PageHelper实例代码  # Spring集成MyBatis和PageHelper分页插件整合过程详解  # 分页  # 每页  # 的是  # 设置为  # 第一页  # 默认为  # 我用  # 需要注意  # 小编  # 服务端  # 客户端  # 行数  # 我是  # 就会  # 行间  # 第一个  # 在此  # 你也  # 就好  # 而不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 再谈Python中的字符串与字符编码(推荐)  在centOS 7安装mysql 5.7的详细教程  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  简历在线制作网站免费版,如何创建个人简历?  装修招标网站设计制作流程,装修招标流程?  中国移动官方网站首页入口 中国移动官网网页登录  Python函数文档自动校验_规范解析【教程】  如何快速登录WAP自助建站平台?  如何在宝塔面板中修改默认建站目录?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  javascript日期怎么处理_如何格式化输出  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何在云指建站中生成FTP站点?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何处理CORS跨域请求?(配置示例)  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  教你用AI润色文章,让你的文字表达更专业  如何用美橙互联一键搭建多站合一网站?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  php 三元运算符实例详细介绍  网站制作价目表怎么做,珍爱网婚介费用多少?  原生JS获取元素集合的子元素宽度实例  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  海南网站制作公司有哪些,海口网是哪家的?  WordPress 子目录安装中正确处理脚本路径的完整指南  制作公司内部网站有哪些,内网如何建网站?  如何用PHP快速搭建高效网站?分步指南  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  ,在苏州找工作,上哪个网站比较好?  音乐网站服务器如何优化API响应速度?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在IIS服务器上快速部署高效网站?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何在IIS中新建站点并解决端口绑定冲突?  Python文本处理实践_日志清洗解析【指导】  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  如何用IIS7快速搭建并优化网站站点?  Android Socket接口实现即时通讯实例代码  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?