Mybatis分页

简介: 本文介绍五种分页实现方式:MyBatis自带RowBounds内存分页、PageHelper插件分页、SQL物理分页、数组分页及拦截器分页。对比逻辑分页与物理分页的优劣,指出大数据量下应优先选用物理分页,避免内存溢出,提升系统性能。

1 自带rowbound分页

先将所有的结果集查询出来ResultSet,再进行内存分页(limit)


2 第三方插件pagehelper

会将一个查询SQL变成两部分执行,假设SQL是:select name from user;

①自动识别数据库类型,添加对应的分页关键字,如MySQL则limit,Oracle则rownum,DB2则fetch,查找出上面SQL的结果

②查找出上面结果,查询结果的总条数count

3 SQL分页

依赖limit进行实现,或者rownum等自身的SQL实现

4 数组分页


简而言之:查全部再subList


首先在dao层,创建StudentMapper接口,用于对数据库的操作。在接口中定义通过数组分页的查询方法,如下所示:

List<Student> queryStudentsByArray();

方法很简单,就是获取所有的数据,通过list接收后进行分页操作。创建StudentMapper.xml文件,编写查询的sql语句:

<select id="queryStudentsByArray"  resultMap="studentmapper"> select * from student </select>

可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。接下来在service层获取数据并且进行分页实现:

定义IStuService接口,并且定义分页方法:

List<Student> queryStudentsByArray(int currPage, int pageSize);

通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。

创建IStuService接口实现类StuServiceIml对方法实现,对获取到的数组通过currPage和pageSize进行分页:

@Override    
public List<Student> queryStudentsByArray(int currPage, int pageSize) { 
    List<Student> students = studentMapper.queryStudentsByArray(); 
    //  从第几条数据开始        
    int firstIndex = (currPage - 1) * pageSize; 
    //  到第几条数据结束        
  int lastIndex = currPage * pageSize; return students.subList(firstIndex, lastIndex); 
}

通过subList方法,获取到两个索引间的所有数据。

最后在controller中创建测试方法:

@ResponseBody      
@RequestMapping("/student/array/{currPage}/{pageSize}") 
public List<Student> getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) { 
  List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize); 
    return student; 
}

通过用户传入的currPage和pageSize获取指定数据。

5 拦截器分页

自定义拦截器实现了拦截所有以ByPage【或自己约束的都是可以的】结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句。

6 总结

逻辑分页:即内存分页,就是mybatis自带的rowbounds,内存开销大,数据量小效率比物理分页快,但大数据量,易内存溢出

物理分页:上述2345,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。

物理分页总是优先于逻辑分页。

相关文章
|
JSON JavaScript 定位技术
Echarts 绘制地图(中国、省市、区县),保姆级教程!
Echarts 绘制地图(中国、省市、区县),保姆级教程!
25391 154
|
SQL XML Java
Invalid bound statement (not found): com.zheng.mapper.UserMapper.login
这篇文章解释了MyBatis中接口与Mapper配置文件映射绑定失败的原因,并提供了解决步骤,包括确保Mapper.xml文件的namespace与Mapper接口的类路径相同,接口方法名与XML中定义的statement id相同,以及接口方法的输入输出参数类型与Mapper.xml中定义的sql的parameterType和resultType类型匹配。
Invalid bound statement (not found): com.zheng.mapper.UserMapper.login
|
XML Java 数据库连接
【异常解决】解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
【异常解决】解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
608 0
|
XML SQL 数据格式
Invalid bound statement (not found)错误的可能原因
Invalid bound statement (not found)错误的可能原因
1282 0
SpringCloud 和 SpringBoot 版本选型
SpringCloud 和 SpringBoot 版本选型
SpringCloud 和 SpringBoot 版本选型
|
缓存 Java Nacos
第01篇:分布式注册中心
什么是`注册中心`,`注册中心` 往往是在分布式的应用体系下才会遇到的。对于分布式体系应用都是横向进行扩展。如下图`User App`这个服务,具有2台服务器 但是当用户从网关进来访问, 网关是如何知道这个 `User App`有几台服务及每台服务的网络地址是什么呢? 所以就需要有一个地方能收集到每台应用的地址及命名。 往往这个地方就被叫做 `注册中心`。分布式环境下的应用在启动时候都会向这个地方来注册自己的网络地址,及命名。
689 0
第01篇:分布式注册中心
mybatis-plus使用代码配置configuration
mybatis-plus使用代码配置configuration
545 0
|
网络安全 Docker 容器
Docker容器进入的4种方式
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80598027  在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。
1802 0
|
网络协议 Shell Nacos
nacos简介安装配置创建
nacos简介安装配置创建
784 1
|
测试技术
深入了解:Meter 查看 TPS 数据
TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。
深入了解:Meter 查看 TPS 数据