广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis如何使用PageHelper实现分页查询
  • 395
分享到

MyBatis如何使用PageHelper实现分页查询

2024-04-02 19:04:59 395人浏览 八月长安

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

摘要

目录使用PageHelper实现分页查询1、创建数据表2、创建项目2.1 创建实体类(Entity层)2.2 数据库映射层(Mapper层)3、运行测试mybatis PageHel

使用PageHelper实现分页查询

【实例】MyBatis使用PageHelper实现分页查询,并显示分页信息。执行效果如下图:

1、创建数据表

Mysql数据库中创建用户信息表(tb_user),并添加数据。


-- 判断数据表是否存在,存在则删除
DROP TABLE IF EXISTS tb_user;
 
-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
( 
	user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
	user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',
	province VARCHAR(50) NOT NULL COMMENT '省份',
	create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) COMMENT = '用户信息表';
 
-- 添加数据
INSERT INTO tb_user(user_name,province) VALUES
('pan_junbiao的博客_01','广东省'),('pan_junbiao的博客_02','黑龙江省'),('pan_junbiao的博客_03','山东省'),('pan_junbiao的博客_04','安徽省'),('pan_junbiao的博客_05','黑龙江省'),
('pan_junbiao的博客_06','江苏省'),('pan_junbiao的博客_07','黑龙江省'),('pan_junbiao的博客_08','广东省'),('pan_junbiao的博客_09','陕西省'),('pan_junbiao的博客_10','广东省'),
('pan_junbiao的博客_11','广东省'),('pan_junbiao的博客_12','江苏省'),('pan_junbiao的博客_13','陕西省'),('pan_junbiao的博客_14','安徽省'),('pan_junbiao的博客_15','山东省'),
('pan_junbiao的博客_16','陕西省'),('pan_junbiao的博客_17','安徽省'),('pan_junbiao的博客_18','江苏省'),('pan_junbiao的博客_19','黑龙江省'),('pan_junbiao的博客_20','安徽省'),
('pan_junbiao的博客_21','江苏省'),('pan_junbiao的博客_22','广东省'),('pan_junbiao的博客_23','安徽省'),('pan_junbiao的博客_24','陕西省'),('pan_junbiao的博客_25','广东省'),
('pan_junbiao的博客_26','广东省'),('pan_junbiao的博客_27','安徽省'),('pan_junbiao的博客_28','山东省'),('pan_junbiao的博客_29','山东省'),('pan_junbiao的博客_30','黑龙江省'),
('pan_junbiao的博客_31','广东省'),('pan_junbiao的博客_32','江苏省'),('pan_junbiao的博客_33','陕西省'),('pan_junbiao的博客_34','安徽省'),('pan_junbiao的博客_35','山东省');

2、创建项目

(1)创建SpringBoot项目,项目结构如下图:

(2)添加pom.xml配置信息

在pom.xml配置文件中添加PageHelper、 mysql的JDBC数据库驱动。


<!-- SpringBoot/MyBatis使用PageHelper分页控件 -->
<dependency>
    <groupId>com.GitHub.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.13</version>
</dependency>
 
<!-- Mysql的JDBC数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>

(3)配置相关信息

将默认的application.properties文件的后缀修改为“.yml”,即配置文件名称为:application.yml,并配置以下信息:


spring:
  #DataSource数据源
  datasource:
    url: jdbc:mysql://localhost:3306/db_admin?useSSL=false&amp
    username: root
    passWord: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
 
#MyBatis配置
mybatis:
  type-aliases-package: com.pjb.entity #别名定义
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定 MyBatis 所用日志的具体实现,未指定时将自动查找
    map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射
    lazy-loading-enabled: true #开启延时加载开关
    aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是false
    lazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载
    cache-enabled: true #打开全局缓存开关(二级环境),默认值就是true
 
#MyBatis使用pageHelper分页
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true

配置说明:

helper-dialect:配置使用哪种数据库语言,不配置的话pageHelper也会自动检测。

reasonable:在启用合理化时,如果 pageNum<1,则会查询第一页;如果 pageNum>pages,则会查询最后一页。

support-methods-arguments:支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

2.1 创建实体类(Entity层)

在com.pjb.entity包中,创建UserInfo类(用户信息实体类)。


package com.pjb.entity; 
import org.springframework.stereotype.Component;
import java.util.Date;
 

@Component
public class UserInfo
{
    private int userId; //用户编号
    private String userName; //用户姓名
    private String province; //省份
    private Date createTime; //注册时间
 
    //省略getter与setter方法...
 
    @Override
    public String toString()
    {
        return "编号:" + this.getUserId() +" 姓名:" + this.getUserName() + " 省份:" + this.getProvince();
    }
}

在com.pjb.entity包中,创建UserSearchParam类(用户查询条件类)。


package com.pjb.entity; 

public class UserSearchParam
{
    private String userName; //用户姓名
    private String province; //省份 
    //省略getter与setter方法...
}

2.2 数据库映射层(Mapper层)

在com.pjb.mapper包中,创建UserMapper接口(用户信息Mapper动态代理接口)。


package com.pjb.mapper; 
import com.pjb.entity.UserInfo;
import com.pjb.entity.UserSearchParam;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.jdbc.SQL;
import org.springframework.stereotype.Repository; 
import java.util.List;
 

@Mapper
@Repository
public interface UserMapper
{
    
    @SelectProvider(type = UserSqlBuilder.class, method = "searchUserList")
    public List<UserInfo> searchUserList(UserSearchParam param);
 
    //建议将SQL Builder以映射器接口内部类的形式进行定义
    public class UserSqlBuilder
    {
        public String searchUserList(UserSearchParam param)
        {
            return new SQL()
            {
                {
                    SELECT("*");
                    FROM("tb_user");
                    WHERE("1 = 1");
                    if(param!=null)
                    {
                        //用户姓名
                        if(param.getUserName()!=null && param.getUserName().length()>0)
                        {
                            WHERE("user_name like '%${userName}%'");
                        }
 
                        //省份
                        if(param.getProvince()!=null && param.getProvince().length()>0)
                        {
                            WHERE("province = #{province}");
                        }
                    }
                }
            }.toString();
        }
    }
}

3、运行测试

【运行】查询第2页的用户数据,每页10条数据,并根据创建时间排序


@Autowired
private UserMapper userMapper; 

@Test
public void searchUserByParam()
{
    int pageIndex = 2; ///获取第2页的数据
    int pageSize = 10; //每页10条数据
    String orderBy = "create_time ASC"; //排序
 
    //分页信息
    PageHelper.startPage(pageIndex, pageSize, orderBy);
 
    //查询条件类
    UserSearchParam userSearchParam = new UserSearchParam();
    //userSearchParam.setUserName("pan_junbiao的博客"); //查询条件1
    //userSearchParam.setProvince("广东省"); //查询条件2
 
    //执行分页查询
    PageInfo<UserInfo> userInfoPage = new PageInfo<UserInfo>(userMapper.searchUserList(userSearchParam));
 
    //打印用户列表
    System.out.println("\n");
    List<UserInfo> userInfoList = userInfoPage.getList();
    userInfoList.stream().forEach(System.out::println);
 
    //打印分页信息
    System.out.println("当前页码:第" + userInfoPage.getPageNum() + "页");
    System.out.println("分页大小:每页" + userInfoPage.getPageSize() + "条");
    System.out.println("数据总数:共" + userInfoPage.getTotal() + "条");
    System.out.println("总页数:共" + userInfoPage.getPages() + "页");
}

PageInfo类提供的相关属性如下:

执行结果:

MyBatis PageHelper的使用

1、引入pagehelper的jar包

如果是Maven项目,pom里添加依赖:


<dependency>                           
  <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>4.1.4</version>
</dependency>

2、在mybatis的配置文件中配置拦截(也可以在spring配置文件中配置)

小编在mybatis配置文件SqlMapConfig.xml中配置的


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "Http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <plugins>
      <plugin interceptor="com.github.pagehelper.PageHelper">
          <!--设置数据可类型oracle,Mysql,MariaDB,SQLite,Hsqldb,postgresql六种数据库-->
          <property name="dialect" value="mysql"/>
      </plugin>
  </plugins>
</configuration>

在spring中配置如下:


<!--配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="typeAliasesPackage" value="com.aoChine.model.entity" />
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
 
        <!-- 配置mybatis分页插件PageHelper -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!-- 什么都不配,使用默认的配置 -->
                        <value></value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

3、代码中如何实现

Service中一个方法示例:

EasyUIDataGridResult是自己封装的一个pojo,如下:


public class EasyUIDataGridResult implements Serializable { 
    private long total;
    private List 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;
    } 
}

如果不需要的话直接返回PageInfo就可以

4、注意事项 分页不安全的情况

分页不安全的情况

PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

如下代码是不安全的:


PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

写成如下便安全了:


List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

另外也可以手动清理ThreadLocal存储的分页参数:


PageHelper.clearPage();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MyBatis如何使用PageHelper实现分页查询

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

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

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

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

下载Word文档
猜你喜欢
  • MyBatis如何使用PageHelper实现分页查询
    目录使用PageHelper实现分页查询1、创建数据表2、创建项目2.1 创建实体类(Entity层)2.2 数据库映射层(Mapper层)3、运行测试MyBatis PageHel...
    99+
    2022-11-12
  • Mybatis分页查询的实现(Rowbounds和PageHelper)
    我们实现查询除了 @org.junit.Test public void test02(){ SqlSession session = MybatisUtil...
    99+
    2022-11-13
  • Mybatis利用分页插件PageHelper快速实现分页查询
    目录前言 首先创建一个Maven项目 数据库中创建一张表设置Mybatis配置文件 编写pojo实体类和mapper接口和mapper映射文件创建测试类总结前言 Mybatis算是...
    99+
    2022-11-12
  • springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能
    完整案例: SpringBoot + laypage分页 + 模糊查询 完整案例 下面在通过实例代码介绍下springboot +mybatis 使用PageHelper实现分页并带...
    99+
    2022-11-13
  • Mybatis实现分页查询
    一. 简单分页查询——limit 使用select查询时,如果结果集数据量较大,一个页面难以处理,就会采用分页查询。 分页查询,就是从结果集中拿出指定的第n页到第m页的数据来显示。 // limit分页公式 // currentP...
    99+
    2023-09-12
    mybatis java mysql
  • SpringBoot如何整合PageHelper实现分页查询功能
    这篇文章主要介绍了SpringBoot如何整合PageHelper实现分页查询功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用方法导入依赖在中央仓库sonatype中搜...
    99+
    2023-06-29
  • MyBatis分页插件PageHelper如何使用
    本篇内容介绍了“MyBatis分页插件PageHelper如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyBatis使⽤PageH...
    99+
    2023-07-05
  • Mybatis-Plus实现分页查询
    Mybatis-Plus实现分页查询 文章目录 Mybatis-Plus实现分页查询1.1技术概述1.2技术详述1.2.1配置分页插件1.2.2自定义分页1、如果你的mapper没有继承BaseMapper2、如果你的mapper继...
    99+
    2023-08-17
    mybatis java spring boot
  • 如何使用mybatis-plus实现分页查询功能
    今天就跟大家聊聊有关使用mybatis-plus如何实现分页查询功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 引入依赖...
    99+
    2022-11-13
  • ssm框架+PageHelper插件如何实现分页查询功能
    这篇文章主要介绍了ssm框架+PageHelper插件如何实现分页查询功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。通过搭建ssm框架,然后通过mybatis的分页插件p...
    99+
    2023-06-15
  • Mybatis分页查询怎么实现
    小编给大家分享一下Mybatis分页查询怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们实现查询除了@org.junit.Test  ...
    99+
    2023-06-28
  • ssm框架+PageHelper插件实现分页查询功能
    通过搭建ssm框架,然后通过mybatis的分页插件pagehelp进行分页查询。 源码:https://gitee.com/smfx1314/pagehelper 看一下项目结构:...
    99+
    2022-11-12
  • SpringBoot整合PageHelper实现分页查询功能详解
    前言 本文介绍的是MyBatis 分页插件 PageHelper,如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页...
    99+
    2022-11-13
  • js如何使用Pagination+PageHelper实现分页
    目录一、分页的原理:1.1 分页的原理1.2 真假分页二、后端-PageHelper的使用:三、前端-Pagination的使用:  四、分页中的细节:一、分页的...
    99+
    2022-11-13
  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)
    目录 1 MyBatisPlusConfig2 UserPagination3 Mapper3.1 UserMapper.java3.2 UserMap...
    99+
    2022-11-12
  • 怎么在java中使用mybatis实现分页查询
    这篇文章给大家介绍怎么在java中使用mybatis实现分页查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4....
    99+
    2023-06-14
  • Oracle使用MyBatis中RowBounds实现分页查询功能
    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便。 使用MyBatis中的RowBounds进行分页查...
    99+
    2022-10-18
  • MyBatis-Plus 分页查询的实现示例
    方法: 使用selectPage()方法,第一个参数是传入分页方法(传入当前页和当前显示多少条数据),第二个参数是传入查询条件(如果查询全部的话,可以传null)。 前提: 表中的...
    99+
    2022-11-13
  • mybatis批量查询分页怎么实现
    MyBatis提供了两种方法来实现批量查询分页:1. 使用`RowBounds`实现分页查询:`RowBounds`是MyBatis...
    99+
    2023-09-05
    mybatis
  • Mybatis怎么快速实现分页查询
    这篇文章主要讲解了“Mybatis怎么快速实现分页查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis怎么快速实现分页查询”吧!目录前言首先创建一个Maven项目数据库中创建一张...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作