手写分页sql_MyBatis-Plus 分页查询以及自定义sql分页的实现

手写分页sql_MyBatis-Plus 分页查询以及自定义sql分页的实现一 引言分页查询每个人程序猿几乎都使用过 但是有部分同学不懂什么是物理分页和逻辑分页 物理分页 相当于执行了 limit 分页语句 返回部分数据 物理分页只返回部分数据占用内存小 能够获取数据库最新的状态 实施性比较强 一般适用于数据量比较大 数据更新比较频繁的场景 逻辑分页 一次性把全部的数据取出来 通过程序进行筛选数据 如果数据量大的情况下会消耗大量的内存 由于逻辑分页只需要读取数据库一次 不能获

一、引言

分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。

逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

那么MP中的物理分页怎么实现呢? 往下看往下看

二、配置

创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

/

* @Auther: IT贱男

* @Date: 2019/6/12 15:06

* @Description: MybatisPlus配置类

*/

@Configuration

public class MyBatisPlusConfig {

/

* 分页插件

* @return

*/

@Bean

public PaginationInterceptor paginationInterceptor() {

return new PaginationInterceptor();

}

}

三、具体分页实现

MP的Wrapper提供了两种分页查询的方式,源码如下:

/

* 根据 entity 条件,查询全部记录(并翻页)

*

* @param page 分页查询条件(可以为 RowBounds.DEFAULT)

* @param queryWrapper 实体对象封装操作类(可以为 null)

*/

IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

/

* 根据 Wrapper 条件,查询全部记录(并翻页)

*

* @param page 分页查询条件

* @param queryWrapper 实体对象封装操作类

*/

IPage> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

/

* 分页查询

*/

@Test

public void selectByPage() {

QueryWrapper wrapper = new QueryWrapper();

wrapper.like(“name”, “雨”).lt(“age”, 40);

Page page = new Page<>(1,2);

//IPage userIPage = userMapper.selectPage(page, wrapper);

IPage> mapIPage = userMapper.selectMapsPage(page, wrapper);

System.out.println(“总页数”+mapIPage.getPages());

System.out.println(“总记录数”+mapIPage.getTotal());

List> records = mapIPage.getRecords();

records.forEach(System.out::println);

}

以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?

DEBUG==> Parameters: %雨%(String), 40(Integer)

TRACE<==    Columns: COUNT(1)

TRACE<==        Row: 2

DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?

DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)

TRACE<==    Columns: id, name, age, email, manager_id, create_time

TRACE<==        Row: 2, 张雨琪, 31, , , 2019-01-14 09:15:15

TRACE<==        Row: 3, 刘红雨, 31, , , 2019-01-14 09:48:16

DEBUG<==      Total: 2

总页数1

总记录数2

现在我们有需求只要查询数据即可, 不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可。

Page page = new Page<>(1,2,false);

四、自定义sql分页查询

有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,

先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。

步骤一:在mapper文件中,编写对应的分页查询接口。

步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。

/

* 自定义sql分页

* @param page

* @param queryWrapper 看这里看这里,如果自定义的方法中需要用到wrapper查询条件,需要这样写

* @return

*/

IPage selectMyPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

SELECT * FROM user ${ew.customSqlSegment}

/

* 自定义sql分页查询

*/

@Test

public void selectByMyPage() {

QueryWrapper wrapper = new QueryWrapper();

wrapper.like(“name”, “雨”).lt(“age”, 40);

Page page = new Page<>(1,2);

IPage mapIPage = userMapper.selectMyPage(page, wrapper);

System.out.println(“总页数”+mapIPage.getPages());

System.out.println(“总记录数”+mapIPage.getTotal());

List records = mapIPage.getRecords();

records.forEach(System.out::println);

}

五、多表sql分页查询

看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。

小编以简单的为主,sql如下: his_ipd_encounter、his_user 两张表

select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid

mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象

/

*

* 用户 Mapper 接口

*

*

* @author IT贱男

* @since 2019-06-14

*/

public interface UserMapper extends MyMapper {

/

* 多表查询分页

* @param page

* @return

*/

IPage selectByHisName(IPage page);

}

测试如下:通过查看日志,执行的sql加了分页条件的。

@Test

public void select(){

// 创建分页参数

Page page = new Page<>(1,2);

IPage result = userMapper.selectByHisName(page);

// 获取数据

List records = result.getRecords();

records.forEach(System.out::println);

System.out.println(“总页数 = “+ result.getPages());

}

ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.

INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)

select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid

DEBUG==>  Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid

DEBUG==> Parameters:

TRACE<==    Columns: COUNT(1)

TRACE<==        Row: 117

DEBUG==>  Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,?

DEBUG==> Parameters: 0(Long), 2(Long)

TRACE<==    Columns: realname

TRACE<==        Row: 胡伯云

TRACE<==        Row: 安元慧

DEBUG<==      Total: 2

Time:20 ms – ID:com.example.demo.mapper.UserMapper.selectByHisName

Execute SQL:

com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce

胡伯云

安元慧

总页数 = 59

到此这篇关于MyBatis-Plus 分页查询以及自定义sql分页的实现的文章就介绍到这了,更多相关MyBatis-Plus 自定义sql分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178698.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:41
下一篇 2026年3月26日 下午4:41


相关推荐

  • 我们来玩Lockerz

    我们来玩Lockerz想仅仅点击鼠标就可以获得时尚的包包 iPodNano ipodtouch applegiftcar 甚至 MacBookPro 40 寸液晶电视 那么你真的应该来玩玩儿 Lockerz 什么是 Lockerz Lockerz http www lockerz com 是一个新型态的网站 它成立于 09 年 3 月 由美国最大的媒体公司之一美国有线电视公司 Liberty

    2026年3月20日
    2
  • Springboot文件上传_maven上传jar包到远程仓库

    Springboot文件上传_maven上传jar包到远程仓库springboot文件上传机制:1.访问路径2. 上传完成后返回访问文件地址3. 我们只需要访问返回的地址就可以访问到图片4. yaml配置文件(localpath是实际存储的地址)5. 添加配置类,进行访问地址和存储地址映射 @Value(“${file.upload.suffixPath}”) private String uploadSuffixPath; @Value(“${file.upload.localPath}”) private Strin

    2022年8月8日
    5
  • 10.2 网页插入背景音乐「建议收藏」

    10.2 网页插入背景音乐「建议收藏」一、bgsound标签简介在网页中可以为某个网页设置背景音乐,使用的是bgsound标签。bgsound是用以插入背景音乐,但只适用于IE浏览器,在Firefox等中未必适用。语法:背景音乐的文件可以是avi、mp3等声音文件。“背景音乐的地址”可以是相对路径,也可以是绝对路径。强烈不推荐使用绝对路径。使用bgsound加入背景音乐与使用embed加入音频不一样,加入音频是有操

    2025年11月11日
    3
  • php设置header参数_php发送get请求

    php设置header参数_php发送get请求voidheader(stringstring[,boolreplace[,inthttp_response_code]])voidheader(stringstring[,boolreplace[,inthttp_response_code]])header()是用来发送HTTPHeader的。replace是个可选的参数,指示是否替代一个先期相

    2022年8月24日
    11
  • 什么是404页面,如何正确设置制作404页面

    什么是404页面,如何正确设置制作404页面
    什么是404页面?
      404网页是用户尝试访问网站不存在的网页(由于用户点击了损坏的链接、网页已被删除或用户输入了错误的网址)时看到的页面。之所以称为404网页,是因为针对丢失网页的请求,网络服务器会返回404HTTP状态代码,表明该网页未找到。
    404页面的目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开。
    404对搜索引擎优化seo的影响
      搜索引擎通过HTTP状态码来识别网页的状态。当

    2022年7月27日
    14
  • 网路层协议——IGMP协议「建议收藏」

    网路层协议——IGMP协议「建议收藏」一、组播地址1、IP多播的基本概念①IP多播(以前曾译为组播)已成为互联网的一个热门课题。目的:更好地支持一对多通信,网络中的带宽压力。●一对多通信:一个源点发送到许多个终点。例如,实时信息的交付(如新闻、股市行情等),软件更新,交互式会议及其他多媒体通信。2、组播IP地址的特点①它使用D类IP地址作为目的地址。②组播数据包不产生ICMP差错报文。③组播地址只能用于目的地址而不能用于源地址。3、组播MAC地址…

    2025年11月15日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号