SpringMvc+Mybatis+Pagehelper分页详解

最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现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分页详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Spring MVC结合Spring Data JPA实现按条件查询和分页

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有. 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 (实现方法主要在SbglServiceImpl.java类中) 前台表现:用kkpaper表现出来 实现效果: 1.实体类 package com.jinhetech.yogurt.sbgl.entity; im

  • Spring Data JPA 复杂/多条件组合分页查询

    话不多说,请看代码: public Map<String, Object> getWeeklyBySearch(final Map<String, String> serArgs, String pageNum, String pageSize) throws Exception { // TODO Auto-generated method stub Map<String,Object> resultMap=new HashMap<String, Object&

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • springboot用thymeleaf模板的paginate分页完整代码

    本文根据一个简单的user表为例,展示 springboot集成mybatis,再到前端分页完整代码(新手自学,不足之处欢迎纠正): 先看java部分 pom.xml 加入 <!--支持 Web 应用开发,包含 Tomcat 和 spring-mvc. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web&l

  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能. 下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHei

  • springmvc 分页查询的简单实现示例代码

    目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数据并显示. 对于数据量并不大的简单的管理系统而言,第一种实现方法相对来说容易使用较少的代码实现分页这一功能,本文也正是为大家介绍这种方法: 代码片段: 1,Page.java package com.cm.contract.common; import org.apache.commons.lang.Strin

  • Spring Data JPA实现分页Pageable的实例代码

    在JPA中提供了很方便的分页功能,那就是Pageable(org.springframework.data.domain.Pageable)以及它的实现类PageRequest(org.springframework.data.domain.PageRequest),详细的可以见示例代码. 1.改变CustomerRepository方法​ /** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和

  • struts2+spring+hibernate分页代码[比较多]第1/7页

    dao层接口: Java代码 复制代码 代码如下: package com.last999.im.news.dao; import java.util.*; import com.last999.im.news.entity.KindEntity; import com.last999.im.news.web.PageTool; public interface KindEntityDao{ public KindEntity get(String uuid); public void save

  • spring data jpa分页查询示例代码

    最近项目上用就hibernate+spring data jpa,一开始感觉还不错,但是随着对业务的复杂,要求处理一些复杂的sql,就顺便研究了下,把结果记录下,以便日后查看.用到Specification,需要继承JpaSpecificationExecutor接口.(下面代码有的分页从0开始作为第一页,有的从1开始作为作为第一页,我也忘记,请自己测试) DAO层: import java.util.List; import org.springframework.data.domain.Pa

  • 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询

    前言 基于SpringMVC+Bootstrap+DataTables实现数据表格服务端分页.模糊查询(非DataTables Search),页面异步刷新. 说明:sp:message标签是使用了SpringMVC国际化 效果 DataTable表格 关键字查询 自定义关键字查询,非DataTable Search 代码 HTML代码 查询条件代码 <!-- 查询.添加.批量删除.导出.刷新 --> <div class="row-fluid"> <di

随机推荐