SpringMvc+Mybatis+Pagehelper分页详解

https://www.jb51.net/article/102002.htm

 

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

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

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

?

1

2

3

4

5

<dependency>

 <groupId>com.github.pagehelper</groupId>

 <artifactId>pagehelper</artifactId>

 <version>4.1.6</version>

</dependency>

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<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的类来储存分页的信息

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

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,查出我们所需要的数据

?

1

2

3

4

5

6

7

<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的接口方法

?

1

public List<AlarmParamModel> selectallList(AlarmParamModel model);

6.service的接口方法

?

1

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

7.service的实现类

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

?

1

2

3

4

5

6

7

8

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(数据)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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。

?

1

2

3

4

5

6

7

8

@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 的配置贴一下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

$('#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值