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;
}
}


}


相关文章推荐

MyBatis拦截器动态修改SQL语句及参数值(场景:查询中字段值中特殊字符自动转义)

拦截器基础: 配置

spring+Mybatis+ PageHelper实现分页

  • 2017年08月01日 17:41
  • 12.69MB
  • 下载

Struts+Spring+MyBatis MVC模式实现分页分页查询

首先引用一个写好的翻页模板工具类 Java代码 import java.util.List; /* * 翻页模板工具类 * * */ public final c...
  • dahe5
  • dahe5
  • 2013年02月27日 22:35
  • 253

(J2EE)Struts+Spring+MyBatis整合实现分页分页查询

首先引用一个写好的翻页模板工具类 import java.util.List; /* * 翻页模板工具类 * * */ ...

Maven+Mybatis+Spring+SpringMVC实现分页

一、项目搭建 Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建 二、分页插件的介绍 博主采用的插件是PageHelper这个插件,使用起来十分方便。该插件支持以下...

SSM(Spring,springmvc,mybatis)+maven+AJAX实现分页功能

SSM(Spring,springmvc,mybatis)+maven+AJAX实现分页功能简介经过这段时间的工作,有一种强烈的写博客的想法,或是为了分享,或是为了记录自己的点滴,也是为了加深印象,也...

Datatables结合struts2+spring+mybatis实现服务器分页,解决大数据量加载缓慢

在项目中用到datatables比较多,但是当datatables加载超过1000多的时候就会出现有点缓慢的的样子,这个时候如果继续增加数据量让datatables去处理,那会是一个让人抓狂的事情,幸...

Spring +Mybatis +oracle 实现数据库分页

设计思想: 1、分页sql与业务sql解耦合设计。 2、多线并发执行count(*)查询sql及分页sql。 3、站在巨人的肩膀上进行优化。 上代码: PageInterceptor...

bootstrap table + spring + springmvc + mybatis 实现从前端到后端的表格分页

利用bootstrap table + java + spring + springmvc + mybatis 实现从前端到后端完整的分页流程  以上这些插件可以到这里下载Boots...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mybatis+spring实现分页
举报原因:
原因补充:

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