广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Boot 集成PageHelper的使用方法
  • 662
分享到

Spring Boot 集成PageHelper的使用方法

2024-04-02 19:04:59 662人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言:一、基本集成引入jar包Yml配置文件中添加相关配置封装相关分页方法示例代码前段传入参数执行结果二、分页中的排序字段如何防止sql注入问题三、复杂的SQL分页语句四、分页失

前言:

项目中数据分页是一个很常见的需求,目前大部分项目都会使用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过滤处理,关于这个问题其实在上述的分页封装类中已经进行了解决

示例代码:

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 d
INNER JOIN 
    (SELECT oid FROM tag_detail LIMIT 10000000,10) t
ON d.oid= t.oid;

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

总结:

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

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

--结束END--

本文标题: Spring Boot 集成PageHelper的使用方法

本文链接: https://www.lsjlt.com/news/146705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Spring Boot 集成PageHelper的使用方法
    目录前言:一、基本集成引入jar包Yml配置文件中添加相关配置封装相关分页方法示例代码前段传入参数执行结果二、分页中的排序字段如何防止SQL注入问题三、复杂的SQL分页语句四、分页失...
    99+
    2022-11-13
  • Spring Boot怎么集成PageHelper使用
    这篇文章主要介绍了Spring Boot怎么集成PageHelper使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么集成PageHelper使用文章都会有所收获,...
    99+
    2023-06-30
  • spring boot集成redisson的方法
    本文小编为大家详细介绍“spring boot集成redisson的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot集成redisson的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • spring boot集成测试的方法
    这篇文章主要介绍“spring boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spri...
    99+
    2022-10-19
  • Spring Boot 集成 Kafkad的实现方法
    本篇内容介绍了“Spring Boot 集成 Kafkad的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring Boot 作...
    99+
    2023-06-14
  • 使用 Spring Boot 集成 Nacos
    使用 Spring Boot 集成 Nacos 在本篇博客中,我们将介绍如何使用 Spring Boot 框架来集成 Nacos,实现服务的注册与发现。Nacos 是一个开源的动态服务发现、配置和服务...
    99+
    2023-09-21
    spring boot java spring cloud
  • Spring Boot集成Shiro并使用SHA-256加密密码的方法
    这篇文章主要介绍“Spring Boot集成Shiro并使用SHA-256加密密码的方法”,在日常操作中,相信很多人在Spring Boot集成Shiro并使用SHA-256加密密码的方法问题上存在疑惑,小...
    99+
    2022-10-19
  • Spring Boot使用注解集成Redis缓存的方法是什么
    这篇文章主要介绍“Spring Boot使用注解集成Redis缓存的方法是什么”,在日常操作中,相信很多人在Spring Boot使用注解集成Redis缓存的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-04
  • Spring Boot集成springfox-swagger2构建restful API的方法教程
    前言之前跟大家分享了Spring MVC集成springfox-swagger2构建restful API,简单写了如何在springmvc中集成swagger2。这边记录下在springboot中如何集成swagger2。其实使用基本相同...
    99+
    2023-05-31
    springboot springfox-swagger2 restful
  • 开发脚手架集成Spring Boot Actuator监控的方法
    今天小编给大家分享一下开发脚手架集成Spring Boot Actuator监控的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-06-30
  • Spring Boot 项目集成Redis的方式详解
    集成方式 使用Jedis Jedis是Redis官方推荐的面向Java的操作Redis的客户端,是对服务端直连后进行操作。如果直接使用Jedis进行连接,多线程环境下是非线程安全的...
    99+
    2022-11-12
  • 新鲜速递:Spring Boot 3 项目快速集成 Spring Security 6的方法
    准备 Spring Boot 3正式版本已发版了半个月,Spring Security6也一并更新,但是网络上的相关中文文档较少,盲目进行集成容易出错,所以本文讲如何快速集成。这里不再赘述Spring Boot3和Spring Securi...
    99+
    2023-08-25
    spring spring boot java
  • Spring Boot集成Shiro并利用MongoDB做Session存储的方法详解
    前言shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/ 它提供了很方便的权限认证和登录的功能.而springboot作为一个开源框架,必然提供了和shiro整合的功能!之前项目鉴权一直使用的...
    99+
    2023-05-30
    springboot session存储 shiro
  • 教你在Spring Boot微服务中集成gRPC通讯的方法
    一、首先声明gRPC接口 这里引入的是最新的gRpc-core 1.37版本, 采用的grcp-spring-boot-starter封装的版本进行实现,github地址: http...
    99+
    2022-11-12
  • Sprint Boot 集成MongoDB的操作方法
    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,...
    99+
    2023-05-30
    spring boot mongodb
  • spring boot集成WebSocket日志实时输出到web页面的方法
    本篇内容介绍了“spring boot集成WebSocket日志实时输出到web页面的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2023-06-29
  • 使用Spring boot如何实现对Mybatis进行集成
    使用Spring boot如何实现对Mybatis进行集成?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。本章目标整合 Mybatis ,并集成 Druid 数据...
    99+
    2023-05-31
    springboot mybatis
  • spring cloud gateway集成hystrix的方法
    本篇内容介绍了“spring cloud gateway集成hystrix的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring ...
    99+
    2023-06-20
  • 在Spring Boot 中使用Spring security 如何实现对CAS进行集成
    今天就跟大家聊聊有关在Spring Boot 中使用Spring security 如何实现对CAS进行集成,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.创建工程创建Maven工...
    99+
    2023-05-31
    spring security cas
  • spring集成kafka的方法是什么
    Spring集成Kafka的方法如下: 引入依赖:在项目的pom.xml文件中添加spring-kafka依赖。 <dep...
    99+
    2023-10-20
    spring kafka
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作