码迷,mamicode.com
首页 > 其他好文 > 详细

史上最最最简单的mybatis分页=_=

时间:2014-10-22 13:04:11      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:style   io   os   ar   java   for   strong   sp   文件   

import com.mybatis.page.support.PageSqlGenerator;
import com.mybatis.page.support.OraclePagerSqlGenerator;
import com.mybatis.page.support.PageRowBounds;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class PagePlugin implements Interceptor {
    private static PageSqlGenerator sqlGenerator = new OraclePagerSqlGenerator();
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        final Object[] args = invocation.getArgs();
        RowBounds rowBounds = (RowBounds) args[2];
        if (rowBounds instanceof PageRowBounds) {
            Executor executor = (Executor) invocation.getTarget();
            MappedStatement mappedStatement = (MappedStatement) args[0];
            Object parameter = args[1];
            PageRowBounds pageRowBounds = (PageRowBounds) args[2];
            ResultHandler resultHandler = (ResultHandler) args[3];
            BoundSql boundSql = mappedStatement.getBoundSql(parameter);
            PageSqlSqlSource sqlSource = new PageSqlSqlSource(boundSql);
            MappedStatement statement = buildMappedStatement(mappedStatement, sqlSource);
            MetaObject msObject = SystemMetaObject.forObject(statement);
            msObject.setValue("sqlSource.boundSql.sql", sqlGenerator.getPagerSql(boundSql.getSql(), rowBounds));
            args[0] = statement;
            StatementHandler statementHandler = mappedStatement.getConfiguration().newStatementHandler(executor, mappedStatement, parameter, rowBounds, resultHandler, boundSql);
            ResultSet rs = null;
            try (PreparedStatement stmt = executor.getTransaction().getConnection().prepareStatement(sqlGenerator.getCountSql(boundSql.getSql()))) {
                statementHandler.parameterize(stmt);
                rs = stmt.executeQuery();
                int totalCount = 0;
                if (rs.next()) {
                    totalCount = rs.getInt("totalCount");
                }
                pageRowBounds.setTotalCount(totalCount);
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (Throwable ignored) {
                    }
                }
            }
        }
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object target) {
        if (target instanceof Executor) {
            return Plugin.wrap(target, this);
        } else {
            return target;
        }
    }
    @Override
    public void setProperties(Properties properties) {}
    private class PageSqlSqlSource implements SqlSource {
        BoundSql boundSql;
        public PageSqlSqlSource(BoundSql boundSql) {
            this.boundSql = boundSql;
        }
        public BoundSql getBoundSql(Object parameterObject) {
            return boundSql;
        }
    }
    private MappedStatement buildMappedStatement(MappedStatement ms, SqlSource sqlSource) {
        MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), sqlSource, ms.getSqlCommandType());
        builder.resource(ms.getResource());
        builder.fetchSize(ms.getFetchSize());
        builder.statementType(ms.getStatementType());
        builder.keyGenerator(ms.getKeyGenerator());
        if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {
            StringBuilder keyProperties = new StringBuilder();
            for (String keyProperty : ms.getKeyProperties()) {
                keyProperties.append(keyProperty).append(",");
            }
            keyProperties.delete(keyProperties.length() - 1, keyProperties.length());
            builder.keyProperty(keyProperties.toString());
        }
        builder.timeout(ms.getTimeout());
        builder.parameterMap(ms.getParameterMap());
        builder.resultMaps(ms.getResultMaps());
        builder.resultSetType(ms.getResultSetType());
        builder.cache(ms.getCache());
        builder.flushCacheRequired(ms.isFlushCacheRequired());
        builder.useCache(ms.isUseCache());
        return builder.build();
    }
}
import org.apache.ibatis.session.RowBounds;
public class PageRowBounds extends RowBounds {
 public final static int NO_TOTAL_COUNT = -1;
 private int totalCount = NO_TOTAL_COUNT;
 public PageRowBounds() {
  super();
 }
 public PageRowBounds(int offset, int limit) {
  super(offset, limit);
 }
 public void setTotalCount(int totalCount) {
  this.totalCount = totalCount;
 }
 public int getTotalCount() {
  return totalCount;
 }
}
 
import org.apache.ibatis.session.RowBounds;
public interface PageSqlGenerator {
 public String getPagerSql(String sql, RowBounds rowBounds);
 public String getCountSql(String sql);
}
 
import org.apache.ibatis.session.RowBounds;
public class OraclePagerSqlGenerator implements PageSqlGenerator {
 public String getPagerSql(String sql, RowBounds rowBounds) {
  if (rowBounds.getLimit() == Integer.MAX_VALUE) {
   return sql;
  } else {
   return getPagerSql(sql, rowBounds.getOffset(), rowBounds.getLimit());
  }
 }
 public String getPagerSql(String sql, int offset, int limit) {
        return "select * from (select inrow.*, rownum rn from (" + sql + ") inrow where rownum <=" + (limit + offset) + ") where rn >= " + offset;
 }
 public String getCountSql(String sql) {
        return "select count(*) totalCount from (" + sql + ")";
 }
}

配置文件

  在mybatis配置文件中添加

    <plugins>
        <plugin interceptor="com.mybatis.page.plugins.PagePlugin"/>
    </plugins>

 

测试代码

    @Test
    public void testPage() throws Exception {
        PageRowBounds pageRowBounds = new PageRowBounds(0,3);
        HashMap<String,String> hashMap = Maps.newHashMap();
        hashMap.put("name","男");
        List<Student> students = sqlSession.selectList("com.mybatis.mapper.StudentMapper.page",hashMap,pageRowBounds);
        System.out.println(pageRowBounds.getTotalCount());
        students.forEach(System.out::println);
        pageRowBounds = new PageRowBounds(0,5);
        students = sqlSession.selectList("com.mybatis.mapper.StudentMapper.page",hashMap,pageRowBounds);
        System.out.println(pageRowBounds.getTotalCount());
        for(Student student : students){
            System.out.println(student);
        }
    }

总结:随便写写的,嘿嘿。

史上最最最简单的mybatis分页=_=

标签:style   io   os   ar   java   for   strong   sp   文件   

原文地址:http://my.oschina.net/u/726057/blog/336073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!