mybatis+spring实现分页

原创 2015年07月08日 11:02:35

重点是要实现interceptor的接口,然后在配置sqlSessionFactory设置configLocation的值指向classpath:MyBatis-Configuration.xml,MyBatis-Configuration.xml重点是设置<configuration>
<plugins>  
        <!-- 指定数据库分页方言Dialect, 其它方言:OracleDialect,SQLServerDialect,SybaseDialect,DB2Dialect,PostgreSQLDialect,MySQLDialect,DerbyDialect-->  
        <plugin interceptor="com.toone.core.framework.dao.page.OffsetLimitInterceptor">  
            <!--<property name="databaseType" value="mysql"/>  -->
        </plugin>
    </plugins>
</configuration>

来指定分页拦截器

拦截器的实现

package com.toone.core.framework.dao.page;






import java.util.Properties;


import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.MappedStatement.Builder;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.toone.core.utils.ArrayUtil;


/**
 * 参考网络实现
 * @author 刘正军
 *
 */
@Intercepts({ @Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class,
ResultHandler.class }) })
public class OffsetLimitInterceptor implements Interceptor {
public static Logger LOG = LoggerFactory.getLogger(OffsetLimitInterceptor.class);
static int MAPPED_STATEMENT_INDEX = 0;
static int PARAMETER_INDEX = 1;
static int ROWBOUNDS_INDEX = 2;
static int RESULT_HANDLER_INDEX = 3;


Dialect dialect=new MySQLDialect();


public Object intercept(Invocation invocation) throws Throwable {
processIntercept(invocation.getArgs());
return invocation.proceed();
}


void processIntercept(final Object[] queryArgs) {
MappedStatement ms = (MappedStatement) queryArgs[MAPPED_STATEMENT_INDEX];
Object parameter = queryArgs[PARAMETER_INDEX];
final RowBounds rowBounds = (RowBounds) queryArgs[ROWBOUNDS_INDEX];
int offset = rowBounds.getOffset();
int limit = rowBounds.getLimit();


if (dialect.supportsLimit()
&& (offset != RowBounds.NO_ROW_OFFSET || limit != RowBounds.NO_ROW_LIMIT)) {
BoundSql boundSql = ms.getBoundSql(parameter);
String sql = boundSql.getSql().trim();
if (dialect.supportsLimitOffset()) {
sql = dialect.getLimitString(sql, offset, limit);
offset = RowBounds.NO_ROW_OFFSET;
} else {
sql = dialect.getLimitString(sql, 0, limit);
}
limit = RowBounds.NO_ROW_LIMIT;


queryArgs[ROWBOUNDS_INDEX] = new RowBounds(offset, limit);
BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql,
boundSql.getParameterMappings(),
boundSql.getParameterObject());
MappedStatement newMs = copyFromMappedStatement(ms,
new BoundSqlSqlSource(newBoundSql));
queryArgs[MAPPED_STATEMENT_INDEX] = newMs;
}
}


private MappedStatement copyFromMappedStatement(MappedStatement ms,
SqlSource newSqlSource) {
Builder builder = new MappedStatement.Builder(ms.getConfiguration(),
ms.getId(), newSqlSource, ms.getSqlCommandType());
builder.resource(ms.getResource());
builder.fetchSize(ms.getFetchSize());
builder.statementType(ms.getStatementType());
builder.keyGenerator(ms.getKeyGenerator());
builder.keyProperty(ArrayUtil.arrayToString(ms.getKeyProperties()));
builder.timeout(ms.getTimeout());
builder.parameterMap(ms.getParameterMap());
builder.resultMaps(ms.getResultMaps());
builder.cache(ms.getCache());
MappedStatement newMs = builder.build();
return newMs;
}


public Object plugin(Object target) {
return Plugin.wrap(target, this);
}

public void setProperties(Properties properties) {  


   }  


public static class BoundSqlSqlSource implements SqlSource {
BoundSql boundSql;


public BoundSqlSqlSource(BoundSql boundSql) {
this.boundSql = boundSql;
}


public BoundSql getBoundSql(Object parameterObject) {
return boundSql;
}
}


}


Oracle怎么实现分页

分页查询格式: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A  WHERE ROWNUM ) W...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2016年09月25日 11:55
  • 2847

数据分页实现简介

数据分页在动态网站设计里是一门必须要掌握的技能,我们要将数据库里大量的数据有条理的显示在页面上,就必须要使用到数据分页,让显示到界面的数据是最有价值的数据。那么我通过下面的例子简单的介绍一下。    ...
  • why15732625998
  • why15732625998
  • 2016年06月10日 08:32
  • 1931

javascript实现分页效果

一般的页面我们实现分页效果都是用跳转的形式,但是有些需求需要我们在不跳转页面的同时完成分页效果,简单的一个实现例子:window.onload = function(){ page...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2015年06月18日 16:24
  • 1820

php+ajax实现分页

ajaxpage.php【这里是数据展示页面的代码】: http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js” type=”...
  • will5451
  • will5451
  • 2016年07月26日 18:00
  • 772

JQuery实现分页功能

使用JQuery实现分页功能。 1、分页栏HTML码 2、 CSS样式文件 .g-cf:after {clear: both;content: "";displ...
  • pan_junbiao
  • pan_junbiao
  • 2013年02月15日 10:30
  • 20648

js分页实现,前端实现。

主要是借鉴了网上一个例子,自己重新加了样式,添加了跳转,修改了一些小地方,用于和大家一起分享,前端分页的技巧,表格 的数据是我已经写好了,其实大家也可以前端渲染表格然后再分页,都是可以的。 ...
  • liuzijiang1123
  • liuzijiang1123
  • 2017年01月05日 18:32
  • 8181

分页实现后端逻辑

由于项目需要,写了个提供给h5,还有客户端的分页接口。而公司使用的框架 laravel 自带的框架paginate套用不方便,因为paginate的分页是原理是在对数据库进行query的时候分页,相当...
  • situjiang
  • situjiang
  • 2016年05月04日 11:40
  • 1983

Servlet——实现数据分页显示

本文讲述了Servlet中连接数据库以及实现数据分页显示的方法。
  • ggGavin
  • ggGavin
  • 2016年05月06日 22:39
  • 6773

深入浅出Mybatis-分页

Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量和limit取结果),在大数据量的情况下这样的分页基本上是没有用的。本文基于插件,通过拦截StatementHandler重写s...
  • hupanfeng
  • hupanfeng
  • 2013年07月07日 21:25
  • 156964

jquery自定义插件实现分页效果

jquery自定义插件实现分页效果,简单好用
  • GISShiXiSheng
  • GISShiXiSheng
  • 2014年10月13日 18:01
  • 3423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mybatis+spring实现分页
举报原因:
原因补充:

(最多只允许输入30个字)