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

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

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

时间: 2024-10-10 09:12:47

史上最最最简单的mybatis分页=_=的相关文章

史上图形最简单Linux-Unix-Windows批量管理服务器软件工具

Windows 下 批量管理,批量监控,批量操作,批量安全扫描 linux Solaris Aix HP-Unix Windows 等操作系统界面最简洁的图形工具. 批量执行多台服务器命令,批量修改密码,批量执行服务器脚本,批量上传文件,解放你的双手,五分钟批量执行上千台服务器命令. Unix 实验室服务器批量管理监控系统,简称 UnixShellManager UnixShellManager 分简装版, 标准版,企业版. UnixShellManager 实验室批量管理监控系统,能够实现对

史上最简单的 MyBatis 教程

1 前言 MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于"internet"和"abatis"的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013年11月其又迁移到 Github.MyBatis 是一个基于 Java 的支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,相比于基于面向对象使用 HQL 语言的

史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与IXMLDOMElement接口有何联系.区别 节点如果是数组,怎么操作? 如何为属性插入属性 字符串的转换与输出 主要代码 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常

开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http://blog.csdn.net/caoyouxing/article/details/42418591 主题 开源 安卓开发 http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自

史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发

书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战>就是一本写给没钱没身份没资历的创业小白看的APP书,看完这本书你可以拥有自己的一个APP,不用花钱就能移植到其他移动平台,支持iOS,Android,Windows Phone!!!!!!!!找个最便宜的来练手吧!  小白APP交流Q群:  348632872 清华大学出版社推出的<构建跨平台APP:j

史上最简单的 Spring MVC 教程(十)

1 前言 在史上最简单的 Spring MVC 教程(九)中,咱们已经实现了图片的上传及显示功能,那么接下来,在本篇博文中,咱们更进一步,以实体类(Person)中的字段"name"和控制器(PersonController)中的方法 updatePersonList 为例,实现参数的校验功能. 2 注解示例 - 参数校验 老规矩,首先给出项目结构图: 在给出代码之前, 咱们先明确参数校验的步骤: 导入参数校验的 jar 包: 在实体上配置需要校验的属性: 在控制器的方法中用注解 @V

史上最简单的带流控功能的http server

s.py import time import SimpleHTTPServer import SocketServer BYTES_PER_SECOND=160*1024 class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): def do_GET(self): """Serve a GET request.""" f = self.send_head() i

史上最简单的软件破解——5行脚本代码完美破解99%的过期软件

如果你看到了这篇博文,绝对保证不虚此行.仅仅5行脚本代码,即可破解99%的过期软件. 这件事的背景:最近在找了一些学习资料,其中有Rational Rose画的图,好久没用过它了.今天安装好,导入许可文件,结果问题出现了,提示没有激活.怎么回事??仔细一看,原来许可文件到2013年12月份就过期了(乌鸦飘过...) 在网上找了半天也没有找到一个新的许可文件,结果一狠心,手动改了一下日期,再启动,ok了,把时间再改回来.本来事儿到这儿就完了.但是结果光今天一天就手动改了好几次系统时间,这就太让人无

Android 自定义控件打造史上最简单的侧滑菜单

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39185641 ,本文出自[张鸿洋的博客] 侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最