MyBatisPlus和MyBatis的分页查询原理;limit 和 offset 实现分页,limit a offset b(跳过b条数据后取a条数据); MyBatisPlus和MyBatis的区

1. MyBatisPlus的分页查询原理

MyBatisPlus的分页查询原理主要是通过将大数据量集分割成较小的部分来返回结果,以减少一次性加载和显示的数据量。以下是MyBatisPlus分页查询原理的详细解释:
一、分页查询的基本流程

1、 接收分页参数:
在分页查询中,通常会接收两个关键的参数——当前页码(current)和每页显示的数据量(size)。这些参数决定了用户希望查看哪一部分数据。

2、 计算偏移量:
根据当前页码和每页显示数据量,计算出从数据库中哪一行数据开始获取。偏移量(start)的计算公式为:(current - 1) * size。start的值就是数据集中的起始位置。

3、执行分页查询:
    在SQL查询中使用Limit子句来限制查询返回的记录数。Limit子句接受两个参数——偏移量(start)和每页显示的记录数(size),指示数据库从偏移量处开始,返回指定数量的记录。
    例如,SQL语句“select * from table_name limit start, size”    将从start位置开始获取,获取size条记录。

4、构建查询条件:
    分页查询中,通常还会结合其他条件(如筛选条件)来进一步缩小查询范围。条件可以通过where子句进行过滤,以满足查询要求。

5、返回结果:
    数据库执行查询后,将结果集返回给应用程序。程序将结果进行展示,用户使用时可以通过调整页码和每页记录数,查看不同的部分。

二、MyBatisPlus分页查询的实现方式

1、物理分页:
    通过数据库本身提供的分页功能来实现。在MyBatisPlus中,可以通过Page对象来配置分页参数,并使用原生SQL或XML映射文件来执行分页查询。
    例如,创建Page对象并配置分页参数,然后通过Mapper接口的selectPage方法执行分页查询。查询结果会按照指定的分页参数返回。

2、内存分页:
    在内存中实现分页的一种方式。它将所有数据都加载到内存中,然后在内存中进行分页处理。
    这种方法在数据量较小的情况下可以使用,但在数据量较大的情况下可能会导致内存溢出。因此,一般不推荐使用内存分页。

3、伪分页:
    指通过在客户端进行分页处理来实现的一种方式。它将所有数据都加载到客户端,然后在客户端进行分页展示。
    这种方法会导致大量的数据传输和客户端处理,性能较差。因此,伪分页也不推荐使用。

三、MyBatisPlus分页查询的优化

1、 索引优化:
在查询涉及的字段上创建合适的索引,可以显著提高查询效率。
应避免创建不必要的索引,仅在查询中经常使用的字段上创建索引。同时,需要定期检查索引的使用情况,并删除不必要的索引。

2、SQL语句优化:
    选择合理的分区键可以优化查询性能,因为它可以减少需要扫描的数据量。
    应避免不必要的关联查询,仅在需要时进行关联查询。同时,需要优化关联查询中的连接条件。

3、 使用分页插件:
MyBatisPlus提供了内置的分页方法,可以方便地进行分页查询。
同时,也可以使用PageHelper等分页插件来简化分页查询操作。这些插件可以在执行SQL语句之前对SQL语句进行修改,添加分页相关的参数。

综上所述,MyBatisPlus的分页查询原理是通过将大数据量集分割成较小的部分来返回结果,并提供了物理分页、内存分页和伪分页三种实现方式。在实际开发中,应根据具体情况选择合适的分页方法,并考虑性能和资源利用等因素进行优化。

2.MyBatis的分页查询原理

MyBatis的分页查询原理涉及多个方面,以下是对其原理的详细解释:

一、RowBounds对象分页

MyBatis提供了RowBounds对象来进行分页查询。RowBounds对象可以指定查询结果的起始行和返回的行数。

配置RowBounds:在查询时,可以传入一个RowBounds对象来指定查询的起始行和返回的行数。
执行查询:MyBatis会根据RowBounds对象中的参数,在查询结果中截取相应的数据行进行返回。

二、SQL语句分页

在MyBatis中,分页查询还可以通过直接在SQL语句中使用LIMIT和OFFSET关键字来实现。

LIMIT和OFFSET:LIMIT关键字用于指定返回的记录数,而OFFSET关键字用于指定查询的起始位置。
动态拼接SQL:根据用户输入的分页参数(如页码和每页显示的记录数),动态拼接SQL语句,使其包含LIMIT和OFFSET子句。
执行查询:执行拼接后的SQL语句,返回指定范围内的数据。

三、拦截器分页

MyBatis的分页查询还可以通过拦截器来实现。拦截器可以拦截SQL语句的执行,并在执行前或执行后对SQL进行处理。

编写拦截器:编写自定义的拦截器,用于拦截SQL语句的执行。
修改SQL:在拦截器中,根据传入的分页参数,修改SQL语句,添加上LIMIT或者rownum等分页关键字。
执行查询:将修改后的SQL语句传递给数据库执行,返回分页结果。

四、分页插件

为了简化分页查询的实现,MyBatis还可以借助分页插件,如PageHelper。

引入插件:在项目中引入PageHelper分页插件的依赖。
配置插件:在MyBatis的配置文件中添加PageHelper插件的配置。
使用插件:在Mapper接口中编写分页查询方法时,只需传入当前页码和每页显示的记录数,PageHelper插件会自动处理分页逻辑。
执行查询:调用Mapper接口的分页查询方法,返回分页结果。

五、总结

MyBatis的分页查询原理可以通过RowBounds对象、SQL语句分页、拦截器分页以及分页插件等多种方式实现。具体选择哪种方式取决于项目的需求和技术栈。在实际应用中,需要根据数据量、查询性能等因素综合考虑,选择最适合的分页方案。同时,无论采用哪种方式,都需要确保分页参数的正确性和安全性,避免SQL注入等安全风险。

3.MyBatisPlus和MyBatis的区别

MyBatisPlus和MyBatis都是Java中常用的持久层框架,它们在数据库操作中发挥着重要作用,但两者之间存在一些明显的区别。以下是对MyBatisPlus和MyBatis区别的详细阐述:
一、实现方式

MyBatis:
    基于XML或注解方式进行数据库操作的持久化框架。
    提供了简单的CRUD操作以及动态生成SQL等功能。

MyBatisPlus:
    在MyBatis框架上的封装,只做增强不做改变。
    增强了简化后的API,使得开发更加方便,并且在性能、效率、易用性方面都有一定优化。

二、功能支持

MyBatis:
    相对较为原始,需要手写大量的SQL以完成各种功能的实现。
    提供了缓存机制、与其他框架的集成等丰富的功能。

MyBatisPlus:
    提供了很多额外的功能,如条件构造器、代码生成器、分页插件、JSON处理器、枚举处理器等实用组件。
    这些功能使得开发者可以轻松快速完成业务逻辑的开发。

三、编程风格

MyBatis:
    编程风格更加传统,需要定义mapper.xml文件。
    根据传入的参数使用相应的SQL查询语句,需要实现MyBatis提供的各种方法。

MyBatisPlus:
    具有很多针对CRUD进行的简化方法。
    通过继承BaseMapper以及使用Lambda表达式,可以以类似使用接口编程的方式进行数据库操作。

四、关键特性

MyBatis:
    提供了灵活的SQL定制能力,支持原生SQL、动态SQL和存储过程。
    缓存机制包括一级缓存和二级缓存,可以显著提高数据库查询的性能。

MyBatisPlus:
    在MyBatis的基础上提供了更多的功能和工具,如分页查询、逻辑删除、乐观锁等。
    代码生成器可以根据数据库表结构自动生成实体类、Mapper接口和Mapper XML文件,省去了手动编写大量重复代码的工作。

五、适用场景

MyBatis:
    更加灵活和轻量级,适用于对数据库操作有较高要求的项目。
    在需要手写复杂SQL或进行高级映射时,MyBatis可能更合适。

MyBatisPlus:
    提供了更丰富的功能和更便捷的操作方式,适用于大多数企业级应用的开发。
    在需要快速开发、减少代码重复和提高开发效率时,MyBatisPlus是更好的选择。

综上所述,MyBatisPlus和MyBatis各有优势,开发者可以根据项目的具体需求和团队的技术栈来选择合适的框架。

4.limit 和 offset 实现分页

LIMIT 子句用于指定返回记录的数量。它告诉数据库引擎你想要从查询结果中获取多少条记录。LIMIT 通常与 OFFSET 一起使用,以实现分页功能。OFFSET 子句用于指定从查询结果的哪一条记录开始返回。它定义了一个偏移量,即跳过指定数量的记录后再开始返回数据。OFFSET 通常与 LIMIT 一起使用,以确定返回记录的具体范围。

1、直接取前三条数据
select* from user limit 3
如果offset 后的数字大于表的总数据量,那么查不出数据,不报错;limit 0 查不出数据,不报错。

2、跳过1条数据(跳过第1条),取第2,3,4这三条数据
select * from user limit 1,3;
注意:pqsql是 不支持 LIMIT #,# 语法的 ,Hint: LIMIT和OFFSET子句要分隔开

3、跳过1条数据(跳过第1条),取第2,3,4这三条数据
select * from user limit 3 offset 1;
如果offset 后的数字大于表的总数据量,那么查不出数据,不报错

解释:

1、当 limit后面跟一个参数的时候,该参数表示要取的数据的数量

例如 select* from user limit 3 表示直接取前三条数据

2、当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量,例如

select * from user limit 1,3;

就是跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据

3、当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。

例如select * from user limit 3 offset 1;表示跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值