关于mybatis物理分页和逻辑分页的问题,求大神帮忙看看

能够成功运行的前提是你已经將mybatis+spring的运行环境搭建好了,并且将mybatis-pager-1.0.0.jar也放置到classpath下之后,直接运行测试类就可以了

注意1:mybatis-pager-1.0.0.jar该包就是浪费我昨天一整天也没整出来的分页jar包,裏面目前只适用于mysql和oracle两种数据库使用其他的数据库还在研究中。

}

我们知道MyBatis内置的分页机制采用的昰内存分页也就是通过获取指向全部数据的ResultSet结果集,然后再对ResultSet进行分页处理在数据量大的情况下,这种分页效率极低本文将介绍一種简易的通过拦截器的方式实现物理分页

首先,介绍一下使用自定义拦截器来进行物理分页的必要性我们知道MyBatis中的SqlSession接口中提供一个带分頁功能的方法:

使用该方法,我们在查询时可以通过为selectList(..)方法提供一个RowBounds参数来使该语句带有分页功能,举个例如假设我需要取出查询记錄的前三条记录,可以这样:

这时我们获取到的记录就是查询记录的前三条记录(select * from users的查询结果)

这时我们会有个疑问既然MyBatis已经为我们提供了分页的处理类,为何我们还要再重复造轮子(再手动写一个拦截器)呢

这是因为MyBatis内置的分页处理器,是通过内存进行分页结合上媔的例子就是MyBatis首先执行select * from

0,3(假设是MySql数据库),这样效率显然是极低的所以我们如果在实际应用中,有两种方式来解决这个问题

下面将介绍苐2种解决方式

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下MyBatis 允许使用插件来拦截的方法调用包括:

// 前面是允许鼡插件拦截的类名,括号里是允许用插件拦截的方法名
 
MyBatis是在StatementHandler中的prepare(...)方法中完成对sql的解析所以我们需要在这个方法前设置一个拦截器也就是plugin來进行sql语句的置换,下面是具体的代码:

// select语句正则表达式匹配: ^代表开头位置 \s代表空格 $代表结尾位置 *代表任意多个 .代表任意字符 // 如果sql语句昰select语句的话则进行查看是否需要分页处理 // rowBounds中绑定了我们自定义的分页信息,包括起始位置offset和取出记录条数limit // 如果rowBound不为空且rowBounds的起始位置不為0,则代表我们需要进行分页处理 // 这两步是必须的因为在前面置换好sql语句以后,实际的结果集就是我们想要的所以offset和limit必须重置为初始值 * 利用反射获取指定对象的指定属性 // 遍历target的属性及其父类的属性 // 没找到该属性则继承查找父类的属性,所以不处理该异常 * 利用反射为指定對象的指定属性写入值 // 遍历target的属性及其父类的属性 // 没找到该属性则继承查找父类的属性,所以不处理该异常

1)代码中为了尽量保持简单噫懂没有使用过多的工具集,具体应用中对对象的私有属性赋值获取和赋值操作可以通过MyBatis内置的类或apache的commons-lang工具来处理

2)该例子使用MySql作为示唎没有考虑其它数据库,具体应用中可以考虑通过配置文件中来设置数据库并动态的根据配置文件来决定sql语句的具体装配,同样为了簡单性在此就不举例了


 

在映射文件中添加查询语句
}

Mybatis提供了一个简单的逻辑分页使用類RowBounds(物理分页当然就是我们在sql语句中指定limit和offset值)在DefaultSqlSession提供的某些查询接口中我们可以看到RowBounds是作为参数用来进行分页的,如下接口:

 
 
 
 
 
 
总结:Mybatis嘚逻辑分页比较简单简单来说就是取出所有满足条件的数据,然后舍弃掉前面offset条数据然后再取剩下的数据的limit条
}

我要回帖

更多关于 mybatis物理分页和逻辑分页 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信