当前位置: 移动技术网 > IT编程>开发语言>Java > SpringMvc+Mybatis+Pagehelper分页详解

SpringMvc+Mybatis+Pagehelper分页详解

2019年07月22日  | 移动技术网IT编程  | 我要评论

最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现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分页详解,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网