我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Boot怎么集成PageHelper使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Boot怎么集成PageHelper使用

这篇文章主要介绍了Spring Boot怎么集成PageHelper使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么集成PageHelper使用文章都会有所收获,下面我们一起来看看吧。

一、基本集成

引入jar包

  <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.version}</version> </dependency>

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

pagehelper:    helperDialect: mysql    reasonable: true    supportMethodsArguments: true    params: count=countSql

封装相关分页方法

分页参数类 public class PageParam<T> 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<T> implements Serializable{    private static final long serialVersionUID = -1253790062865437768L;    private int pageNum = 1;    private List<T> data = null;    private int pageCount = 0;    private int recordCount = -1;    private int pagingType = 0;    private int pageSize;    private String orderBy;        public int getPageSize()    {        return pageSize;    }        public void setPageSize(int pageSize)    {        if (pageSize <= 0)        {            return;        }        this.pageSize = pageSize;    }        public int getPageCount()    {        return pageCount;    }        public void setPageCount(int pageCount)    {        if (pageCount <= 0)        {            return;        }        this.pageCount = pageCount;    }        public int getRecordCount()    {        return recordCount;    }        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<T> data)    {        this.data = data;        if (ObjectUtil.isNotEmpty(data) && this.recordCount == -1)        {            this.recordCount = data.size();        }    }    public List<T> getData()    {        return data;    }        public int getPagingType()    {        return pagingType;    }        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 <T> PagedList<T> exportPagedList(PageParam<T> pageParam)    {        PagedList<T> pl = new PagedList<T>();        // 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 <T>PagedList<T> toPageList(PageInfo<T> spage)    {        PagedList<T> pagedList = new PagedList<T>();        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<TUser> pageParm)    {       //接收参数        PagedList<TUser> pl =PageUtils.exportPagedList(pageParm);        return Result.success(userService.queryPageList(pl, pageParm.getParam()));    }  public PagedList<TUser> queryPageList(PagedList<TUser> page,TUser user)    {       PageInfo<TUser> pageInfo= PageHelper.startPage(page).doSelectPageInfo(()-> list(user));       //转换结果       return PageUtils.toPageList(pageInfo);    }

前段传入参数

{    "pageSize":10,    "pageNum":"1",    //查询条件     "param":{         "name":"张三210001"    },    //排序字段    "orderBy":"age desc"}

执行结果

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 JOIN t_user_role ur ON ur.userOid = u.oid WHERE name = ? order by age desc LIMIT ? 
2022-04-15 22:26:39.919 [http-nio-9090-exec-9] DEBUG [613920d89eb54bfd8601c93ec8572dcf] c.s.f.m.UserMapper.queryPageList - ==> Parameters: 张三210001(String), 10(Integer)
2022-04-15 22:26:40.267 [http-nio-9090-exec-9] DEBUG [613920d89eb54bfd8601c93ec8572dcf] c.s.f.m.UserMapper.queryPageList - <==      Total: 1

基础的分页查询已经发完成了,下面解答上面的问题的方法

二、分页中的排序字段如何防止SQL注入问题

对于前段传入的排序字段,我们需要进行SQL过滤处理,关于这个问题其实在上述的分页封装类中已经进行了解决

Spring Boot怎么集成PageHelper使用

示例代码:

public class SQLFilter{    public static String sqlInject(String str)    {        if (StringUtil.isBlank(str))        {            return null;        }        // 去掉'|"|;|\字符        str = StringUtil.replace(str, "'", "");        str = StringUtil.replace(str, "\"", "");        str = StringUtil.replace(str, ";", "");        str = StringUtil.replace(str, "\\", "");        // 转换成小写        str = str.toLowerCase();        // 非法字符        String[] keywords = { "master", "truncate", "insert", "select",                "delete", "update", "declare", "alert", "drop" };        // 判断是否包含非法字符        for (String keyword : keywords)        {            if (str.indexOf(keyword) != -1)            {                throw new SysException("包含非法字符");            }        }        return str;    }}

三、复杂的SQL分页语句

复杂的SQL分页语句,需要自定义SQL的count语句如何实现呢?

PageHelper实现分页,默认是查询自定义的count语句是否存在,如果存在就用自定义的语句,否则就在外层包装查询的语句,而自定义count语句只需要在在查询语句名称后面添加_COUNT即可。例如

查询集合的语句名称为queryPageList,那么查询count的语句为queryPageList_COUNT,返回Long类型即可。

<select id="queryPageList_COUNT" resultType="java.lang.Long"> select count(1) from t_user  u  left join t_user_role ur on ur.userOid=u.oid <where>  <if test="name != null">name=#{name}</if> </where></select>

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

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

  PageHelper.startPage(pagedList.getPageNum(),pagedList.getPageSize());        //紧跟分页查询后面        List<TUser> list = list(user);        PageInfo<TUser> pageInfo =new PageInfo<>(list);        return PageUtils.toPageList(pageInfo);

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

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

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

示例代码:

    public PageInfo<TUserVO> getUserPageList(int pageNum, int pageSize) {        PageHelper.startPage(pageNum,pageSize);        List<TUserVO> tUserVOsByView = userMapper.getUserList();        List<TUserVO> TUserVOs = new ArrayList<>();        for (TUserVO TUserVO : tUserVOsByView) {            TUserVO TUserVOSingle = new TUserVO();            TUserVOSingle.setHdId(TUserVO.getHdId());            TUserVOs.add(TUserVOSingle);        }        PageInfo<TUserVO> pageViewInfo = new PageInfo<>(TUserVOs);        return pageViewInfo;    }

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

示例代码:

    public PageInfo<TUserVO> getUserPageList(int pageNum, int pageSize) {               List<TUserVO> tUserVOsByView = userMapper.getUserList();        List<TUserVO> TUserVOs = new ArrayList<>();        for (TUserVO TUserVO : tUserVOsByView) {            TUserVO TUserVOSingle = new TUserVO();            TUserVOSingle.setHdId(TUserVO.getHdId());        }        PageHelper.startPage(pageNo,pageSize);        PageInfo<TUserVO> 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 dINNER JOIN     (SELECT oid FROM tag_detail LIMIT 10000000,10) tON d.oid= t.oid;

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

关于“Spring Boot怎么集成PageHelper使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Spring Boot怎么集成PageHelper使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Boot怎么集成PageHelper使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Boot怎么集成PageHelper使用

这篇文章主要介绍了Spring Boot怎么集成PageHelper使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么集成PageHelper使用文章都会有所收获,下面我们一起来看看吧
2023-06-30

Spring boot怎么集成MQTT

这篇“Spring boot怎么集成MQTT”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring boot怎么集成MQ
2023-06-30

Spring Boot中怎么集成Redis

本篇文章为大家展示了Spring Boot中怎么集成Redis,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。添加依赖使用像 Redis 这类的 NoSQL 数据库就必须要依赖 spring-data
2023-06-16

怎么使用Spring Boot集成ShedLock分布式定时任务

这篇文章给大家分享的是有关怎么使用Spring Boot集成ShedLock分布式定时任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ShedLock是什么?以下是ShedLock锁提供者,通过外部存储实现
2023-06-15

Spring Boot集成Swagger2怎么构建API文档

这篇文章主要讲解了“Spring Boot集成Swagger2怎么构建API文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot集成Swagger2怎么构建API文档”吧
2023-06-29

Spring Boot集成接口管理工具Knife4j怎么用

这篇文章主要讲解了“Spring Boot集成接口管理工具Knife4j怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot集成接口管理工具Knife4j怎么用”吧!集
2023-06-30

怎么使用Spring Boot

本篇内容介绍了“怎么使用Spring Boot”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 关闭指定的自动配置通过上面的 @Enabl
2023-06-02

使用Spring boot如何实现对Mybatis进行集成

使用Spring boot如何实现对Mybatis进行集成?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。本章目标整合 Mybatis ,并集成 Druid 数据
2023-05-31

Spring Boot中怎么使用集中式缓存Redis

本篇内容介绍了“Spring Boot中怎么使用集中式缓存Redis”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!动手试试User实体的定义
2023-06-27

Spring Boot中怎么使用Spring MVC

本篇内容主要讲解“Spring Boot中怎么使用Spring MVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot中怎么使用Spring MVC”吧!1.MVCMVC 是
2023-07-06

在Spring Boot 中使用Spring security 如何实现对CAS进行集成

今天就跟大家聊聊有关在Spring Boot 中使用Spring security 如何实现对CAS进行集成,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.创建工程创建Maven工
2023-05-31

Spring Boot使用注解集成Redis缓存的方法是什么

这篇文章主要介绍“Spring Boot使用注解集成Redis缓存的方法是什么”,在日常操作中,相信很多人在Spring Boot使用注解集成Redis缓存的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
2023-06-04

Spring Boot怎么集成JWT实现前后端认证

本文小编为大家详细介绍“Spring Boot怎么集成JWT实现前后端认证”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot怎么集成JWT实现前后端认证”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
2023-06-30

spring boot集成kafka的spring-kafka底层原理是什么

这篇“spring boot集成kafka的spring-kafka底层原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
2023-06-29

Spring Boot中怎么使用Swagger

小编给大家分享一下Spring Boot中怎么使用Swagger,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Swagger 简介Swagger 是一个方便 API 开发的框架,它有以下优点:自动生成在线文档,后端开发人员
2023-06-20

使用Spring Boot如何实现对Dubbo框架进行集成

这期内容当中小编将会给大家带来有关使用Spring Boot如何实现对Dubbo框架进行集成,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.创建工程在pom.xml中加入依赖创建工程名为:(1)spri
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录