mysql 分页查询拦截器_mysql 分页拦截器,类似hibernate方言

package com.epdc.common.dialect;

/**

*

* @author lsh

*

*/

public class OracleDialect extends Dialect {

public String getLimitString(String sql, int offset, int limit) {

sql = sql.trim();

boolean isForUpdate = false;

if (sql.toLowerCase().endsWith(" for update")) {

sql = sql.substring(0, sql.length() - 11);

isForUpdate = true;

}

StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);

pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");

pagingSelect.append(sql);

pagingSelect.append(" ) row_ ) where rownum_ > "+offset+" and rownum_ <= "+(offset + limit));

if (isForUpdate) {

pagingSelect.append(" for update");

}

return pagingSelect.toString();

}

}

package com.epdc.common.intercept;

import java.sql.Connection;

import java.util.Properties;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.ibatis.executor.statement.StatementHandler;

import org.apache.ibatis.mapping.BoundSql;

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.reflection.MetaObject;

import org.apache.ibatis.session.Configuration;

import org.apache.ibatis.session.RowBounds;

import com.epdc.common.dialect.Dialect;

import com.epdc.common.dialect.OracleDialect;

@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})

public class PaginationInterceptor implements Interceptor{

private final static Log log = LogFactory.getLog(PaginationInterceptor.class);

@Override

public Object intercept(Invocation invocation) throws Throwable {

StatementHandler statementHandler = (StatementHandler)invocation.getTarget();

BoundSql boundSql = statementHandler.getBoundSql();

MetaObject metaStatementHandler = MetaObject.forObject(statementHandler);

RowBounds rowBounds = (RowBounds)metaStatementHandler.getValue("delegate.rowBounds");

if(rowBounds == null || rowBounds == RowBounds.DEFAULT){

return invocation.proceed();

}

Configuration configuration = (Configuration)metaStatementHandler.getValue("delegate.configuration");

Dialect.Type databaseType = null;

try{

databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty("dialect").toUpperCase());

} catch(Exception e){

//ignore

}

if(databaseType == null){

throw new RuntimeException("the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty("dialect"));

}

Dialect dialect = null;

switch(databaseType){

//case MYSQL:

//dialect = new MySql5Dialect();

case ORACLE:

dialect = new OracleDialect();

}

String originalSql = (String)metaStatementHandler.getValue("delegate.boundSql.sql");

metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit()) );

metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET );

metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT );

if(log.isDebugEnabled()){

log.debug("SQL : " + boundSql.getSql());

}

return invocation.proceed();

}

@Override

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

@Override

public void setProperties(Properties properties) {

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值