Java中mybatis的三种分页方式

目录
  • 前言
  • 一、Limit分页
  • 二、RowBounds分页(不推荐使用)
  • 三、Mybatis_PageHelper分页插件

前言

分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力!

注意:由于 java 允许的最大整数为 2147483647,所以 limit 能使用的最大整数也是 2147483647,一次性取出大量数据可能引起内存溢出,所以在大数据查询场合慎重使用!

一、Limit分页

语法:

limit ${startPos},${pageSize}

在实际项目中我们一般会加上为空为null判断,如下:

<if test="startPos!=null and pageSize!=null">
    limit ${startPos},${pageSize}
</if>

业务层代码:

<select id="getUserInfo1" parameterType="map" resultType="dayu">
    select * from user
    <if test="startPos!=null and pageSize!=null">
        limit ${startPos},${pageSize}
    </if>
</select>
List<User> getUserInfo1(Map<String,Object> map);
@Test
 public void selectUser() {
     SqlSession session = MybatisUtils.getSession();
     UserMapper mapper = session.getMapper(UserMapper.class);
     //这里塞值
      Map<String,Object> parms = new HashMap<>();
      parms.put("startPos","0");
      parms.put("pageSize","5");
     List<User> users = mapper.getUserInfo1(parms);
     for (User map: users){
         System.out.println(map);
    }
     session.close();
}

执行结果:

传入0,10时:

总结:

  • limit 0,10;
  • 0 代表从第0条数据开始
  • 10 代表查10条数据
  • 等到第二页的时候就是 limit 10,10;

以此类推!

这些内容其实就时MySQL中的内容,不作再详细讲解了。

二、RowBounds分页(不推荐使用)

RowBounds帮我们省略了limit的内容,我们只需要在业务层关注分页即可!无须再传入指定数据!

但是,这个属于逻辑分页,即实际上sql查询的是所有的数据,在业务层进行了分页而已,比较占用内存,而且数据更新不及时,可能会有一定的滞后性!不推荐使用!

RowBounds对象有2个属性,offset和limit。

  • offset:起始行数
  • limit:需要的数据行数

因此,取出来的数据就是:从第offset+1行开始,取limit行

业务层代码:

@Test
public void selectUserRowBounds() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    // List<User> users = session.selectList("com.dy.mapper.UserMapper.getUserInfoRowBounds",null,new RowBounds(0, 5));
    List<User> users = mapper.getUserInfoRowBounds(new RowBounds(0,5));
    for (User map: users){
        System.out.println(map);
    }
    session.close();
}
List<User> getUserInfoRowBounds(RowBounds rowBounds);
<select id="getUserInfoRowBounds" resultType="dayu">
   select * from user
</select>

执行查看结果:

三、Mybatis_PageHelper分页插件

引入jar包:

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

配置MyBatis核心配置文件:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>

业务层代码:

@Test
public void selectUserPageHelper() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    //第二种,Mapper接口方式的调用,推荐这种使用方式。
    PageHelper.startPage(1, 3);
    List<User> list = mapper.getUserInfo();
    //用PageInfo将包装起来
    PageInfo page = new PageInfo(list);
    for (User map: list){
        System.out.println(map);
    }
    System.out.println("page:---"+page);
    session.close();
}

执行结果:

总结:

PageHelper还是很好用的,也是物理分页!

实际上我们一般用第二种比较多:Mapper接口方式的调用

@Test
public void selectUserPageHelper() {
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    //第二种,Mapper接口方式的调用,推荐这种使用方式。
    PageHelper.startPage(1, 3);
    List<User> list = mapper.getUserInfo();
    //用PageInfo将包装起来
    PageInfo page = new PageInfo(list);
    for (User map: list){
        System.out.println(map);
    }
    System.out.println("page:---"+page);
    session.close();
}

拓展:

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());

到此这篇关于Java中mybatis的三种分页方式的文章就介绍到这了,更多相关Java mybatis分页内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java使用MyBatis框架分页的5种方式

    本文为大家分享了Java使用MyBatis框架分页的五种方式,供大家参考,具体内容如下 初始准备 1.创建分页对象类,方便模块间传值 //PageInfo.java import lombok.Data; @Data public class PageInfo { private int pageNo; private int pageSize; } 2.定义DAO层接口 import org.apache.ibatis.session.RowBounds; import org.springf

  • 详解mybatis三种分页方式

    目录 前言 一.Limit分页 二.RowBounds分页(不推荐使用) 三.Mybatis_PageHelper分页插件 总结: 前言 分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力! 注意:由于 java 允许的最大整数为 2147483647,所以 limit 能使用的最大整数也是 2147483647,一次性取出大量数据可能引起内存溢出,所以在大数据查询场合慎

  • Mybatis分页的4种方式实例

    数组分页 查询出全部数据,然后再list中截取需要的部分. mybatis接口 List<Student> queryStudentsByArray(); xml配置文件 <select id="queryStudentsByArray" resultMap="studentmapper"> select * from student </select> service 接口 List<Student> querySt

  • Java中mybatis的三种分页方式

    目录 前言 一.Limit分页 二.RowBounds分页(不推荐使用) 三.Mybatis_PageHelper分页插件 前言 分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力! 注意:由于 java 允许的最大整数为 2147483647,所以 limit 能使用的最大整数也是 2147483647,一次性取出大量数据可能引起内存溢出,所以在大数据查询场合慎重使用!

  • Java中switch的三种用法方式

    Java中switch的三种用法详解: switch居然有三种方式 ? 作为一个接触java不久的人来说,这确实让我吃了一惊! 根据版本,在java14开始, switch语句有了一个很大的调整, 这就让swicth语句有了更多的操作和选择,在代码上,更加的简便灵活, 让我们试试这神奇的switch吧! 使用switch这个关键词, 我们可以很好的解决if-else 中多重选择的尴尬场面! Java中switch的三种用法详解: switch 标准方式 switch - > 用法: switch

  • java中HashMap的7种遍历方式与性能分析

    目录 1.遍历方式 1.1 迭代器 EntrySet 1.2 迭代器 KeySet 1.3 ForEach EntrySet 1.4 ForEach KeySet 1.5 Lambda 表达式 1.6 Stream API 单线程 1.7 Stream API 多线程 1.8 代码汇总 2.性能分析 2.1 引入依赖 2.2 编写测试类 2.3 测试结果 2.4 分析 2.5 总结 1.遍历方式 1.1 迭代器 EntrySet /** * 1. 迭代器 EntrySet */ @Test pu

  • Django Rest framework三种分页方式详解

    前言 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来. 因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取. 同样,展示的时候也是一样的,我们必定会对数据进行分页显示. 本文将详细讲述DRF为我们提供的三种分页方式. 全局配置 REST_FRAMEWORK = { # 对所有分页器生效,但优先级低 'PAGE_SIZE': 5, # 每页显示5条数据 } 我们先准备好用于测试分页的数据以及序列化类 数据表 from django.d

  • oracle 使用rownum的三种分页方式

    rownum是Oracle数据库中的一个特有关键字,返回的是一个数字代表记录的行号. 基础知识:rownum只能做<或者<=的条件查询,如果要rownum进行51到100这样的范围判断,需要先查询出每一行的rownum,再用那个序号做判断 获取51到100的数据 三种分页的写法: 1.使用minus,原理就是查询出前100行的数据 减去 查询出前50行的数据 select * from DATA_TABLE_SQL where rownum<=100 minus select * fro

  • Java中Singleton的3种实现方式详解

    一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当今面向对象程序的实际开发中,Singleton 通常被用来代表一个无状态的对象,例如函数和那些本质上唯一的系统组件. 值得注意的是,使类成为 Singleton 会使得它的客户端测试变得非常困难,因为我们不可能给Singleton替换模拟实现,除非我们实现一个充当其类型的接口. 实现 Singleton 有三

  • Java中定时任务的6种实现方式

    目录 1.线程等待实现 2.JDK自带Timer实现 2.1 核心方法 2.2使用示例 2.2.1指定延迟执行一次 2.2.2固定间隔执行 2.2.3固定速率执行 2.3 schedule与scheduleAtFixedRate区别 2.3.1schedule侧重保持间隔时间的稳定 2.3.2scheduleAtFixedRate保持执行频率的稳定 2.4 Timer的缺陷 3.JDK自带ScheduledExecutorService 3.1 scheduleAtFixedRate方法 3.2

  • Spring中Bean的三种实例化方式详解

    目录 一.环境准备 二.构造方法实例化 三.分析Spring的错误信息 四.静态工厂实例化 4.1 工厂方式创建bean 4.2 静态工厂实例化 五.实例工厂与FactoryBean 5.1 环境准备 5.2 实例工厂实例化 5.3 FactoryBean的使用 六.bean实例化小结 一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二.构造方法实例化 在

  • 浅谈java中String的两种赋值方式的区别

    类似普通对象,通过new创建字符串对象.String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收. 直接赋值.如String str = "Hello&

随机推荐