spring boot 集成pagehelper的使用方法-mile米乐体育

目录

  • 前言:
  • 一、基本集成
    • 引入jar包
    • yml配置文件中添加相关配置
    • 封装相关分页方法
    • 示例代码
    • 前段传入参数
    • 执行结果
  • 二、分页中的排序字段如何防止sql注入问题
  • 三、复杂的sql分页语句
  • 四、分页失效的常见的场景有哪些?
  • 五、大表数据pagehelper分页性能如何
  • 总结:

前言:

项目中数据分页是一个很常见的需求,目前大部分项目都会使用pagehelper进行分页,那么在使用的过程中是否考虑如下问题?

一、基本集成

引入jar包

com.github.pagehelper pagehelper-spring-boot-starter ${pagehelper.version}

yml配置文件中添加相关配置

pagehelper: helperdialect: mysql reasonable: true supportmethodsarguments: true params: count=countsql

封装相关分页方法

分页参数类 public class pageparam implements serializable { private static final long serialversionuid = -7916211163897873899l; private int pagenum=1; private int pagesize=10; //条件参数 private t param; //排序字段 private string orderby; public int getpagesize() { return pagesize; } public void setpagesize(int pagesize) { this.pagesize = pagesize; } public int getpagenum() { return pagenum; } public void setpagenum(int pagenum) { this.pagenum = pagenum; } public t getparam() { return param; } public void setparam(t param) { this.param = param; } public string getorderby() { return orderby; } public void setorderby(string orderby) { //需要注意sql注入 this.orderby = orderby; } } 分页结果类 public class pagedlist implements serializable { private static final long serialversionuid = -1253790062865437768l; private int pagenum = 1; private list data = null; private int pagecount = 0; private int recordcount = -1; private int pagingtype = 0; private int pagesize; private string orderby; /** * @return the pagesize */ public int getpagesize() { return pagesize; } /** * @param pagesize * the pagesize to set */ public void setpagesize(int pagesize) { if (pagesize <= 0) { return; } this.pagesize = pagesize; } /** * @return the pagecount */ public int getpagecount() { return pagecount; } /** * @param pagecount * the pagecount to set */ public void setpagecount(int pagecount) { if (pagecount <= 0) { return; } this.pagecount = pagecount; } /** * @return the recordcount */ public int getrecordcount() { return recordcount; } /** * @param recordcount * the recordcount to set */ public void setrecordcount(int recordcount) { this.recordcount = recordcount; calcpagecount(); } private void calcpagecount() { if (this.recordcount < 0) { return; } int tmp = this.recordcount % getpagesize(); this.pagecount = (tmp == 0 ? (this.recordcount / getpagesize()) : (this.recordcount / getpagesize() 1)); if (this.pagenum > this.pagecount && this.pagecount != 0) { this.pagenum = this.pagecount; } this.pagenum = this.pagecount; } public void setdata(list data) { this.data = data; if (objectutil.isnotempty(data) && this.recordcount == -1) { this.recordcount = data.size(); } } public list getdata() { return data; } /** * @return the pagingtype */ public int getpagingtype() { return pagingtype; } /** * @param pagingtype * the pagingtype to set */ public void setpagingtype(int pagingtype) { this.pagingtype = pagingtype; } public void setorderby(string orderby) { this.orderby = orderby; } public int getpagenum() { return pagenum; } public void setpagenum(int pagenum) { this.pagenum = pagenum; } public string getorderby() { return orderby; } } 分页工具类 public class pageutils implements serializable { private static final long serialversionuid = 377943433889798799l; public static pagedlist exportpagedlist(pageparam pageparam) { pagedlist pl = new pagedlist(); // pagesize int pagesize = pageparam.getpagesize(); if (pagesize <= 0) { pagesize = 10; } else { pl.setpagesize(pagesize); } int pagenum = pageparam.getpagenum(); pl.setpagenum(pagenum); string orderby= pageparam.getorderby(); if(stringutil.isnotempty(orderby)) { //防止sql注入 string orderbysql=sqlfilter.sqlinject(orderby); pl.setorderby(orderbysql); } return pl; } public static pagedlist topagelist(pageinfo spage) { pagedlist pagedlist = new pagedlist(); pagedlist.setpagesize((int) spage.getpagesize()); pagedlist.setpagenum((int) spage.getpagenum()); pagedlist.setrecordcount((int) spage.gettotal()); pagedlist.setdata(spage.getlist()); pagedlist.setpagecount((int) spage.getpages()); return pagedlist; } }

示例代码

@postmapping("getpagelist") public result getpagelist(@requestbody pageparam pageparm) { //接收参数 pagedlist pl =pageutils.exportpagedlist(pageparm); return result.success(userservice.querypagelist(pl, pageparm.getparam())); } public pagedlist querypagelist(pagedlist page,tuser user) { pageinfo pageinfo= pagehelper.startpage(page).doselectpageinfo(()-> list(user)); //转换结果 return pageutils.topagelist(pageinfo); }

前段传入参数

{ "pagesize":10, "pagenum":"1", //查询条件 "param":{ "name":"张三210001" }, //排序字段 "orderby":"agedesc" }

执行结果

2022-04-15 22:26:39.914 [http-nio-9090-exec-9] debug [613920d89eb54bfd8601c93ec8572dcf] c.s.f.m.usermapper.querypagelist - ==> preparing: select * from t_user u left默认是查询自定义的count语句是否存在,如果存在就用自定义的语句,否则就在外层包装查询的语句,而自定义count语句只需要在在查询语句名称后面添加_count即可。例如

查询集合的语句名称为querypagelist,那么查询count的语句为querypagelist_count,返回long类型即可。

四、分页失效的常见的场景有哪些?

1.pagehelper分页查询有个特殊的要求,查询下sql语句一定要紧跟在分页查询的后面,否则分页查询会失效。之前采用的如下写法容易失效,建议采用java8的写法

pagehelper.startpage(pagedlist.getpagenum(),pagedlist.getpagesize()); //紧跟分页查询后面 list list = list(user); pageinfo pageinfo =new pageinfo<>(list); return pageutils.topagelist(pageinfo);

2.注意pagehelper的reasonable 默认为false,遇到查询页数大于总页数时,出现分页失败

pagehelper的reasonable 默认为false,遇到查询页数大于总页数时,查询为空;当reasonable设置为true时,遇到查询页数大于总页数时,查询最后一页数据;

3.pagehelper先开启分页,后对list数据操作将会导致分页错误

示例代码:

public pageinfo getuserpagelist(int pagenum, int pagesize) { pagehelper.startpage(pagenum,pagesize); list tuservosbyview = usermapper.getuserlist(); list tuservos = new arraylist<>(); for (tuservo tuservo : tuservosbyview) { tuservo tuservosingle = new tuservo(); tuservosingle.sethdid(tuservo.gethdid()); tuservos.adhttp://www.cppcns.comd(tuservosingle); } pageinfo pageviewinfo = new pageinfo<>(tuservos); return pageviewinfo; }

4.pagehelper先对list数据操作,后开启分页,将会导致分页失效

示例代码:

public pageinfo getuserpagelist(int pagenum, int pagesize) { list tuservosbyview = usermapper.getuserlist(); list tuservos = new arraylist<>(); for (tuservo tuservo : tuservosbyview) { tuservo tuservosingle = new tuservo(); tuservosingle.sethdid(tuservo.gethdid()); } pagehelper.startpage(pageno,pagesize); pageinfo pageviewinfo = new pageinfo<>(tuservos); return pageviewinfo; }

大家需要注意下,抽时间可以去验证下结果。

五、大表数据pagehelper分页性能如何

pagehelper 对于大表查询数据量越大,性能越差,这是因为pagehelper分页是自动在sql语句后面拼接limit没有进行相关的优化,一旦数据大,性能就比较慢。

例如:

优化前sql语句:

select d.* from tag_detail d limit 10000000,10

查询的时间大概需要10秒左右,执行速度比较慢。

优化后sql语句:

select d.* from tag_detail d inner join (select oid from tag_detail limit 10000000,10) t on d.oid= t.oid;

子查询先通过分页查询主键字段,然后进行关联查询,经过优化后,查询时间大概为1秒左右。性能大幅度提升。

总结:

本文讲解了pagehelper的基本的使用和相关的问题,这些都是我从实际的项目中总结出来的问题以及相关的mile米乐体育的解决方案,大家在使用的时候要特别注意,不要放同样的错误。

到此这篇关于spring boot 集成pagehelper的使用方法的文章就介绍到这了,更多相关spring boot 集成pagehelper内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图