首页 > 其他分享 >面试官:说一下 MyBatis 的 3 种分页方式?

面试官:说一下 MyBatis 的 3 种分页方式?

时间:2024-11-29 09:29:40浏览次数:8  
标签:10 面试官 分页 userMapper List PageHelper limit user MyBatis

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

注意:由于 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分页插件

官方GitHub地址:

https://github.com/pagehelper/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>
 

业务层代码

配置MyBatis核心配置文件

图片

执行结果

图片

总结:

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

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

 //第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum, 
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectLike(user);
    }
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));
 

拓展

图片

这种方式十分方便快捷好用!推荐使用!

篇幅有限,不可能所有用法都演示一遍!有兴趣的小伙伴可以自行测试一遍!

悄悄的说,反正我是全部试了一遍,还整合了Spring,加了拦截器测试了!

标签:10,面试官,分页,userMapper,List,PageHelper,limit,user,MyBatis
From: https://blog.csdn.net/2401_85910670/article/details/144127614

相关文章

  • 面试官:为什么数据库连接池不采用 IO 多路复用?
    今天我们聊一个不常见的Java面试题:为什么数据库连接池不采用IO多路复用?这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcatconnectionpool等技术来与DB连接,哪怕整个程序已经变成以Netty为核心。这到底......
  • 面试官: Nginx 的优化思路有哪些?网站的防盗链如何做?
    前几天,有个读者向我吐槽,找了很久的工作,好不容易熬到到了二面(技术面,如果过了就基本定了)。谁知道没有准备充分,被一道题给直接挂掉了。这道题就是:Nginx的优化思路有哪些?网站的防盗链如何做?实际工作中有哪些类似的安全经验?结果支支吾吾半天没讲到重点,结果就可想而知了。。。所......
  • MybatisPlus
    MybatisPlusMybatisPlus入门案例官方网站:https://baomidou.com/只做增强,引入不会对现有工程产生影响操作步骤引入依赖依赖中集成了Mybatis和mybatisPlus中的所有功能。<!--MybatisPlus--><dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus......
  • 在开源项目中写自己的服务,被mybatisplus里面一个拦截报错
    错误信息如下##Errorqueryingdatabase.Cause:java.lang.IllegalStateException:Nothread-boundrequestfound:Areyoureferringtorequestattributesoutsideofanactualwebrequest,orprocessingarequestoutsideoftheoriginallyreceivingthread?Ify......
  • MyBatis的优缺点深度剖析
    MyBatis,作为一款优秀的持久层框架,在Java应用程序的数据库操作中扮演着重要角色。它简化了JDBC的繁琐操作,提供了灵活的数据映射和动态SQL功能。然而,任何技术都有其两面性,MyBatis也不例外。本文将深入剖析MyBatis的优缺点,帮助读者更全面地了解这一框架。MyBatis的优点1.简单......
  • 强大的jquery下拉分页选择插件SelectPage
    SelectPage.js是一款强大的jquery下拉分页选择插件。SelectPage.js下拉分页选择插件界面简洁,支持下拉,分页,键盘操作等功能。它的特点还有:在线演示  下载 插件基于jQuery开发,可在Bootstrap2、3环境下使用,亦可在原生无UI框架的环境下直接使用。兼容Bootstrap2、3样式,以及非......
  • 【Mybatis-Plus】在项目中非常实用的小技巧
    目录防止全表更新和删除逻辑删除方式一:类中字段配置方式二:配置文件全局配置 通用枚举枚举类的创建@EnumValue注解的作用是什么?自动填充使用场景使用步骤1.在实体类中对应的属性上添加相关注解2.添加全局处理器字段类型处理器字段类型处理器的实现方式防止全......
  • .NET9 EFcore支持早期MSSQL数据库 ROW_NUMBER()分页
    前言NET程序员是很幸福的,MS在上个月发布了NET9.0RTM,带来了不少的新特性,但是呢,我们是不是还有很多同学软硬件都还没更上,比如,自己的电脑还在跑Win7,公司服务器还在跑MSSQL2005-2008的!这不就引入了我们本文要探索的问题,因为MS早在EFcore3.1后就不再内置支持ROW_NUMBER()了,......
  • Mybatis PLUS查询对List使用OR模糊查询
    MybatisPLUS查询对List使用OR模糊查询1、版本2、代码3、效果1、版本MybatisPLUS版本:3.5.7注意:版本3.1.2及以下是需要return的因当前为高版本,代码中已将return注释。2、代码QueryWrapper<Object>queryWrapper=newQueryWrapper<>();List<String>value......
  • 自定义MyBatis分页插件和自定义慢SQL统计插件实践
    ......