Mybatis pageHelper 配合jquery DataTable实现分页效果

快来打我* 2022-05-29 01:38 366阅读 0赞
  1. Hibernate中集成了分页的后台方法,Mybatis中没有,想要方便的使用分页功能,就必须使用牛人开发的pageHelper插件。前台配合jquerydatatable或者jqGrid实现列表效果,本次使用的是datatable

首先想看官方详细文档请看,非常全面

http://datatables.club/

另外我找到一片非常详细的介绍datatable的文章

https://www.cnblogs.com/xiashengwang/p/8087181.html

  1. **一 . pagehelper配置及使用介绍**
  2. 1.我用的maven工程,首先引入依赖
  3. <!--分页-->
  4. <dependency>
  5. <groupId>com.github.pagehelper</groupId>
  6. <artifactId>pagehelper</artifactId>
  7. <version>4.1.1</version>
  8. </dependency>

2.在mybatis配置文件spring-mybatis.xml中配置

  1. <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <!-- 自动扫描mapping.xml文件 -->
  5. <property name="mapperLocations">
  6. <array>
  7. <value>classpath:com/zhuhuixin/webmana/dao/mapper/xml/*.xml</value>
  8. <value>classpath:com/zhuhuixin/webshow/dao/mapper/xml/*.xml</value>
  9. </array>
  10. </property>
  11. <property name="plugins"> //在此处配置
  12. <array>
  13. <bean class="com.github.pagehelper.PageHelper">
  14. <property name="properties">
  15. <value>
  16. dialect=mysql
  17. reasonable=true
  18. </value>
  19. </property>
  20. </bean>
  21. </array>
  22. </property>
  23. </bean>

3.datatable将会默认发送给你draw,start(开始条数),length(每页条数),但pagehelper要的参数为当前页码和每页条数,所以要将start处理一下,currentPage=start/length+1。

  1. 设置完PageHelper.startPage(currentPage,pageSize)后的第一个使用查询方法,mybatis会自动使用分页功能,查询出的list就是分页后的值
  2. // 获取用户列表
  3. @ResponseBody
  4. @RequestMapping(value = "listUser", produces = "text/plain;charset=UTF-8")
  5. public String listUser(Integer start,Integer length,HttpServletRequest req) {
  6. List<TSystemUser> list = new ArrayList<TSystemUser>();
  7. Map resultMap = new HashMap();
  8. PageHelper.startPage((start/length+1),length); //第一个参数为当前页码,第二个为每页的条数
  9. try {
  10. list = userService.findUserByCondition(userParam); //之后的第一个查询方法
  11. Page<TSystemUser> pageBean = new Page<TSystemUser>(new PageInfo<TSystemUser>(list),req);
  12. //如果直接则自动去掉为null的字段,不想去掉需要这样处理
  13. return JSON.toJSONString(pageBean, SerializerFeature.WriteMapNullValue);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. resultMap.put("success","false");
  17. resultMap.put("msg",e.getMessage());
  18. }
  19. return JSON.toJSONString(resultMap);
  20. }
  21. PageInfo类说明
  22. public class PageInfo<T> implements Serializable {
  23. private static final long serialVersionUID = 1L;
  24. //当前页
  25. private int pageNum;
  26. //每页的数量
  27. private int pageSize;
  28. //当前页的数量
  29. private int size;
  30. //由于startRow和endRow不常用,这里说个具体的用法
  31. //可以在页面中"显示startRow到endRow 共size条数据"
  32. //当前页面第一个元素在数据库中的行号
  33. private int startRow;
  34. //当前页面最后一个元素在数据库中的行号
  35. private int endRow;
  36. //总记录数
  37. private long total;
  38. //总页数
  39. private int pages;
  40. //结果集
  41. private List<T> list;
  42. //前一页
  43. private int prePage;
  44. //下一页
  45. private int nextPage;
  46. //是否为第一页
  47. private boolean isFirstPage = false;
  48. //是否为最后一页
  49. private boolean isLastPage = false;
  50. //是否有前一页
  51. private boolean hasPreviousPage = false;
  52. //是否有下一页
  53. private boolean hasNextPage = false;
  54. //导航页码数
  55. private int navigatePages;
  56. //所有导航页号
  57. private int[] navigatepageNums;
  58. //导航条上的第一页
  59. private int navigateFirstPage;
  60. //导航条上的最后一页
  61. private int navigateLastPage;
  62. public PageInfo() {
  63. }
  64. /**
  65. * 包装Page对象
  66. *
  67. * @param list
  68. */
  69. public PageInfo(List<T> list) {
  70. this(list, 8);
  71. }
  72. /**
  73. * 包装Page对象
  74. *
  75. * @param list page结果
  76. * @param navigatePages 页码数量
  77. */
  78. public PageInfo(List<T> list, int navigatePages) {
  79. if (list instanceof Page) {
  80. Page page = (Page) list;
  81. this.pageNum = page.getPageNum();
  82. this.pageSize = page.getPageSize();
  83. this.pages = page.getPages();
  84. this.list = page;
  85. this.size = page.size();
  86. this.total = page.getTotal();
  87. //由于结果是>startRow的,所以实际的需要+1
  88. if (this.size == 0) {
  89. this.startRow = 0;
  90. this.endRow = 0;
  91. } else {
  92. this.startRow = page.getStartRow() + 1;
  93. //计算实际的endRow(最后一页的时候特殊)
  94. this.endRow = this.startRow - 1 + this.size;
  95. }
  96. } else if (list instanceof Collection) {
  97. this.pageNum = 1;
  98. this.pageSize = list.size();
  99. this.pages = this.pageSize > 0 ? 1 : 0;
  100. this.list = list;
  101. this.size = list.size();
  102. this.total = list.size();
  103. this.startRow = 0;
  104. this.endRow = list.size() > 0 ? list.size() - 1 : 0;
  105. }
  106. if (list instanceof Collection) {
  107. this.navigatePages = navigatePages;
  108. //计算导航页
  109. calcNavigatepageNums();
  110. //计算前后页,第一页,最后一页
  111. calcPage();
  112. //判断页面边界
  113. judgePageBoudary();
  114. }
  115. }
  116. .......
  117. }
  118. 本来查询完需要用 PageInfo data=new PageInfo<>(list)封装就行,但是我们要返回给datatable合适的值,所以我将data二次封装。直接返回pagebean则为datatable需要接受的参数。
  119. **这里要注意不要使用JSON.toJSONString(pagebean),因为此方法默认值为null的字段被自动去除,没有字段前台的datatable就会报错。用使用JSON.toJSONString(pageBean,SerializerFeature.WriteMapNullValue)才能正常返回。**

封装类:

  1. public class Page<T> {
  2. /**
  3. * <p>Title: </p>
  4. * <p>Description: 构造函数,传入一个com.github.pagehelper.PageInfo对象</p>
  5. *
  6. * @param pageInfo
  7. */
  8. public Page(PageInfo<T> pageInfo,HttpServletRequest req) {
  9. try {
  10. this.setDraw(req.getParameter("draw"));//从request中获取的draw在发回去
  11. this.setPageSize(pageInfo.getPageSize());
  12. this.setRecordsTotal(pageInfo.getTotal());
  13. this.setRecordsFiltered(pageInfo.getTotal());
  14. this.setData(pageInfo.getList());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. // 当前页
  20. private String draw;
  21. // 总页数
  22. private Integer total;
  23. // 每页显示多少
  24. private Integer pageSize;
  25. // 总记录数
  26. private long recordsTotal;
  27. private long recordsFiltered;
  28. // 记录
  29. private List<T> data;
  30. public String getDraw() {
  31. return draw;
  32. }
  33. public void setDraw(String draw) {
  34. this.draw = draw;
  35. }
  36. public Integer getTotal() {
  37. return total;
  38. }
  39. public void setTotal(Integer total) {
  40. this.total = total;
  41. }
  42. public Integer getPageSize() {
  43. return pageSize;
  44. }
  45. public void setPageSize(Integer pageSize) {
  46. this.pageSize = pageSize;
  47. }
  48. public long getRecordsTotal() {
  49. return recordsTotal;
  50. }
  51. public void setRecordsTotal(long recordsTotal) {
  52. this.recordsTotal = recordsTotal;
  53. }
  54. public long getRecordsFiltered() {
  55. return recordsFiltered;
  56. }
  57. public void setRecordsFiltered(long recordsFiltered) {
  58. this.recordsFiltered = recordsFiltered;
  59. }
  60. public List<T> getData() {
  61. return data;
  62. }
  63. public void setData(List<T> data) {
  64. this.data = data;
  65. }
  66. }

二 . 前台datatable的配置及使用

  1. 要注意前台传给后台的参数和需要接受的参数。
  2. 前端传递参数:
  3. columns[0][data] 0
  4. columns[0][name]
  5. columns[0][orderable] true
  6. columns[0][search][regex] false
  7. columns[0][search][value]
  8. columns[0][searchable] true
  9. columns[1][data] 1
  10. columns[1][name]
  11. columns[1][orderable] true
  12. columns[1][search][regex] false
  13. columns[1][search][value]
  14. columns[1][searchable] true
  15. columns[2][data] 2
  16. columns[2][name]
  17. columns[2][orderable] true
  18. columns[2][search][regex] false
  19. columns[2][search][value]
  20. columns[2][searchable] true
  21. columns[3][data] 3 // data[3]
  22. columns[3][name]
  23. columns[3][orderable] true //可以排序
  24. columns[3][search][regex] false //搜索内容不支持正则表达式
  25. columns[3][search][value] //搜索的内容
  26. columns[3][searchable] true //可以被搜索
  27. draw 1 //浏览器cache的编号,递增不可重复
  28. length 10 //预读长度= 预读页数*每页行数
  29. order[0][column] 0 //按第一列排序
  30. order[0][dir] asc
  31. search[regex] false //搜索内容不支持正则表达式
  32. search[value] //输入的搜索的内容
  33. start 0//起始位子,如第一页就从
  34. 返回值格式:
  35. {
  36. "draw": 10, //浏览器cache的编号,递增不可重复
  37. "recordsTotal": 57, //数据总行数
  38. "recordsFiltered": 57, //数据总行数
  39. "data": [
  40. [
  41. "Cara",
  42. "Stevens",
  43. "Sales Assistant",
  44. "New York",
  45. "6th Dec 11",
  46. "$145,600"
  47. ],
  48. [
  49. "Shou",
  50. "Itou",
  51. "Regional Marketing",
  52. "Tokyo",
  53. "14th Aug 11",
  54. "$163,000"
  55. ]
  56. ]
  57. }
  58. 我封装的pagebean符合接受参数要求,所以直接开始使用。如果不封装,想自定义设置接受参数,需要加入dataSrc(下面有示例),依次把drawrecordstotal,recordsfiltered,data设置一遍(**注意drawrecordstotal,recordsfiltered,data必须为json的一级子集,不然无效**),最后返回**json.data**
  59. 栗子:
  60. var tableObj = null;
  61. var tableColumns = [
  62. {data:"userId",className:'text-c',title: "<input type='checkbox' name='checklist' id='checkall' />", width:10},
  63. {data:"loginName", title:"登录名"},
  64. {data:"userName", title:"姓名"},
  65. {data:"userGender", title:"性别"},
  66. {data:"userPhone", title:"电话"},
  67. {data:"userStatus", title:"是否启用"},
  68. {data:"userId", title:"操作", width:100}
  69. ];
  70. tableObj = $('.table-sort').DataTable({
  71. serverSide:true,//设为true为后台处理分页
  72. searching:false,
  73. ordering:false,
  74. processing:true,
  75. stateSave:false,
  76. autoWidth:false,
  77. ajax:{
  78. url:"listUser.do",
  79. type:"post",
  80. data:function(d){
  81. // d.currentPage= d.start; //可以改变往前台传的参数名
  82. // d.pageSize= d.length;
  83. return $.extend( {}, d, { //往前台传自定义参数要这么写
  84. "info": $('#info').val(),
  85. "orgId": $('#orgId').val(),
  86. "roleId": $('#roleId').val(),
  87. "userLimit": $("select[name='userLimit']").val()
  88. });
  89. },
  90. /*dataSrc: function (json) { // 想处理返回参数时这样做,因为我已经封装了返回参数,这里就不需要了
  91. /!*console.log(json)
  92. json.recordsTotal=json.total;
  93. json.recordsFiltered=json.total;
  94. json.data=json.list;*!/
  95. return json.data;
  96. },*/
  97. },
  98. columns:tableColumns,
  99. columnDefs: [
  100. {
  101. //第一列checkbox
  102. targets: 0,
  103. render: function(data, type, row, meta) {
  104. return '<input type="checkbox" name="checklist" value="' + data + '" />'
  105. }
  106. }
  107. ]
  108. });

recordstotal,recordsfiltered为总记录数,在pageInfo里面自带,draw为前台传给后台的,后台要原样返回,不然分页效果会出错。

  1. 总之用起来有点麻烦,耐心研究吧,配置好后还是很好用的

-——————————————————————————————————————————————————

补充:

最近又用到了这个插件,有一些问题弄了半天才解决,来记录一下

1.配置参数问题:旧版本配置参数名字都比较奇怪,前面总有类似“a”,”b”之类的前缀,比如‘autoWidth’成了‘bAutoWidth’,不过新版本的名字都正常了,直接写‘autoWidth’就行了,不要被某些文档搞晕;

2.如果数据源不直接用ajax请求,而是用参数data参数渲染,则在data中传入对象数组即可,注意不是json字符串

  1. var tableObj = $('.table-right').DataTable({
  2. ordering:false,
  3. paging: false,//开启表格分页
  4. autoWidth:false,
  5. data:[{"GROUPID":"11","GROUPNAME":"名字一"},{"GROUPID":"22","GROUPNAME":"名字二"}],
  6. columns:[
  7. {data:"userId",className:'text-c',title: "<input type='checkbox' name='checklist' id='checkall2' />", width:10},
  8. {data:"GROUPID", title:"营业厅编码"},
  9. {data:"GROUPNAME", title:"营业厅名称"}
  10. ],
  11. columnDefs: [
  12. {
  13. //第一列checkbox
  14. targets: 0,
  15. render: function(data, type, row, meta) {
  16. return '<input type="checkbox" name="checklist" class="checklist2" value="' + row.GROUPID + '" />'
  17. }
  18. }
  19. ],
  20. });

3.重新加载表格

  1. function reloadTable() {
  2. //参数1:当服务器返回数据并重绘完毕时执行此回调方法,回调方法返回的是服务器返回的数据
  3. //参数2:重置(默认或者设置为true)或者保持分页信息(设置为false)
  4. tableObj.ajax.reload(function(data){}, false);
  5. }

4.换url重新加载

  1. table.ajax.url( 'newData.json').load();

5.清空表格数据

  1. tableObj1.clear().draw()

6.销毁表格

  1. tableObj1.destroy(false)

false为销毁数据但html还在,true直接连html也销毁了,慎用true

发表评论

表情:
评论列表 (有 0 条评论,366人围观)

还没有评论,来说两句吧...

相关阅读

    相关 datatables实现

    datatables实现分页分为客户端分页和服务端分页两种,客户端分页很简单,只要把返回的所有数据根据dataSrc设置好就可以了。 这里说一下服务端分页的实现。 html