189 8069 5689

Mybatis中RowBounds分页原理是什么

本篇文章给大家分享的是有关Mybatis中RowBounds分页原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联拥有一支富有激情的企业网站制作团队,在互联网网站建设行业深耕10年,专业且经验丰富。10年网站优化营销经验,我们已为数千家中小企业提供了成都网站设计、网站制作解决方案,按需定制设计,设计满意,售后服务无忧。所有客户皆提供一年免费网站维护!

Mybatis可以通过传递RowBounds对象,来进行数据库数据的分页操作,然而遗憾的是,该分页操作是对ResultSet结果集进行分页,也就是人们常说的逻辑分页,而非物理分页。

RowBounds对象的源码如下:

public class RowBounds { public static final int NO_ROW_OFFSET = 0; public static final int NO_ROW_LIMIT = Integer.MAX_VALUE; public static final RowBounds DEFAULT = new RowBounds(); private int offset; private int limit; public RowBounds() {  this.offset = NO_ROW_OFFSET;  this.limit = NO_ROW_LIMIT; } public RowBounds(int offset, int limit) {  this.offset = offset;  this.limit = limit; } public int getOffset() {  return offset; } public int getLimit() {  return limit; }}

对数据库数据进行分页,依靠offset和limit两个参数,表示从第几条开始,取多少条。也就是人们常说的start,limit。

下面看看Mybatis的如何进行分页的。

org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap()方法源码。

private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler resultHandler, RowBounds rowBounds, ResultMapping parentMapping)   throws SQLException {  DefaultResultContext resultContext = new DefaultResultContext();  // 跳到offset位置,准备读取  skipRows(rsw.getResultSet(), rowBounds);  // 读取limit条数据  while (shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {   ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, null);   Object rowValue = getRowValue(rsw, discriminatedResultMap);   storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());  } }   private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {  if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {   if (rowBounds.getOffset() != RowBounds.NO_ROW_OFFSET) {    // 直接定位    rs.absolute(rowBounds.getOffset());   }  } else {   // 只能逐条滚动到指定位置   for (int i = 0; i < rowBounds.getOffset(); i++) {    rs.next();   }  } }

说明,Mybatis的分页是对结果集进行的分页。

假设查询结果总共是100条记录,而我们只需要分页后的10条,是不是意味着100条记录在内存中,我们对内存分页获得了10条数据呢?

非也,JDBC驱动并不是把所有结果加载至内存中,而是只加载小部分数据至内存中,如果还需要从数据库中取更多记录,它会再次去获取部分数据,这就是fetch size的用处。和我们从银行卡里取钱是一个道理,卡里的钱都是你的,但是我们一次取200元,用完不够再去取,此时我们的fetch size = 200元。

因此,Mybatis的逻辑分页性能,并不像很多人想的那么差,很多人认为是对内存进行的分页。

最优方案,自然是物理分页了,也就是查询结果,就是我们分页后的结果,性能是最好的。如果你一定要物理分页,该如何解决呢?

1. Sql中带有offset,limit参数,自己控制参数值,直接查询分页结果。

2. 使用第三方开发的Mybatis分页插件。

3. 修改Mybatis源码,给Sql追加自己的物理分页Subsql。

以上就是Mybatis中RowBounds分页原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站标题:Mybatis中RowBounds分页原理是什么
转载源于:http://cdxtjz.cn/article/pdpjos.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。