在ibatis中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象,
实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second
忍不住看了一下源,发现ibatis的分页依赖于数据库的jdbcDriver.
调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
分页处理的函数如下
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
try {
request.setResultSet(rs);
ResultMap resultMap = request.getResultMap();
if (resultMap != null) {
// Skip Results
if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
if (skipResults > 0) {
rs.absolute(skipResults);
}
} else {
for (int i = 0; i < skipResults; i++) {
if (!rs.next()) {
return;
}
}
}
// Get Results
int resultsFetched = 0;
while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {
Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);
callback.handleResultObject(request, columnValues, rs);
resultsFetched++;
}
}
} finally {
request.setResultSet(null);
}
}
返回的PaginatedList实际上是PaginatedDataList类的对象,每次翻页的时候最后都会调用
private List getList(int idx, int localPageSize) throws SQLException {
return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize);
}
这个方法,可见ibatis的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,马上会死翘翘。
分享到:
相关推荐
NULL 博文链接:https://jsufly.iteye.com/blog/508249
iBATIS框架源码剖析源码 iBATIS框架源码剖析源码 iBATIS框架源码剖析源码
NULL 博文链接:https://tianke645.iteye.com/blog/876116
ibatis的原码 ibatis源码 ibatis源码 ibatis源码
iBATIS框架源码剖析
ibatis 分页功能,使用了标签page.tld。本代码不能单独运行,技术能力欠缺或者代码阅读能力不是很好的朋友,请勿下载。
ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件 ibatis_likehbm高效分页组件 ibatis_likehbm...
ibatis分页源码
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在争议的地方,其中一个不方便的地方就是分页,目前的处理方式都是在sqlMap中写针对特定数据库的物理分页Sql语句,对于...
spring+ibatis+oracle分页缓存源码
ibatis框架源码剖析书中附带的光盘,ibatis源码分析
NULL 博文链接:https://joint.iteye.com/blog/557830
ibatis实现分页技术,其中的分页都已经封装好了,大家需要的话可以下载下来看下
通过修改ibatis源码实现sql分页。由于ibatis默认分页是全部查出,然后再从中取出相应的数据实现分页,效率底。所以需要扩展
ibatis 物理分页jar ,与官方ibatis不冲突,可直接使用。
一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但...本文讲述的就是如何在不重新编译ibatis源码的前提下,为ibatis引入hibernate式的物理分页机制。
Ibatis .net 分页 查询, 可以参考下, Ibatis .net 分页 查询
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。
iBatis分页源代码解析.chm,ibatis介绍等