`
cywhoyi
  • 浏览: 418664 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

myibatis分页

    博客分类:
  • JAVA
 
阅读更多

采用的myibaits的插件方式

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.ResultMap;
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;



@Intercepts( { @Signature(type = Executor.class, method = "query", args = {
		MappedStatement.class, Object.class, RowBounds.class,
		ResultHandler.class }) })
public class SelectCountSqlInterceptor2 implements Interceptor {

	public static String COUNT = "_count";

	private static int MAPPED_STATEMENT_INDEX = 0;

	private static int PARAMETER_INDEX = 1;

	@Override
	public Object intercept(Invocation invocation) throws Throwable {

		processCountSql(invocation.getArgs());

		return invocation.proceed();
	}

	@SuppressWarnings("rawtypes")
	private void processCountSql(final Object[] queryArgs) {

		if (queryArgs[PARAMETER_INDEX] instanceof Map) {
			Map parameter = (Map) queryArgs[PARAMETER_INDEX];
			if (parameter.containsKey(COUNT)) {
				MappedStatement ms = (MappedStatement) queryArgs[MAPPED_STATEMENT_INDEX];
				BoundSql boundSql = ms.getBoundSql(parameter);
				String sql = ms.getBoundSql(parameter).getSql().trim();
				BoundSql newBoundSql = new BoundSql(ms.getConfiguration(),
						getCountSQL(sql), boundSql.getParameterMappings(),
						boundSql.getParameterObject());
				MappedStatement newMs = copyFromMappedStatement(ms,
						new OffsetLimitInterceptor.BoundSqlSqlSource(newBoundSql));
				queryArgs[MAPPED_STATEMENT_INDEX] = newMs;
			}
		}
	}

	// see: MapperBuilderAssistant
	@SuppressWarnings({ "unchecked", "rawtypes" })
	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());

		// setStatementTimeout()
		builder.timeout(ms.getTimeout());

		// setParameterMap()
		builder.parameterMap(ms.getParameterMap());

		// setStatementResultMap()
		List<ResultMap> resultMaps = new ArrayList<ResultMap>();
		String id = "-inline";
		if (ms.getResultMaps() != null) {
			id = ms.getResultMaps().get(0).getId() + "-inline";
		}
		ResultMap resultMap = new ResultMap.Builder(null, id, Long.class,
				new ArrayList()).build();
		resultMaps.add(resultMap);
		builder.resultMaps(resultMaps);
		builder.resultSetType(ms.getResultSetType());

		// setStatementCache()
		builder.cache(ms.getCache());
		builder.flushCacheRequired(ms.isFlushCacheRequired());
		builder.useCache(ms.isUseCache());

		return builder.build();
	}

	private String getCountSQL(String sql) {

		String lowerCaseSQL = sql.toLowerCase().replace("\n", " ").replace("\t", " ");
		int index = lowerCaseSQL.indexOf(" order ");

		if (index != -1) {
			sql = sql.substring(0, index);
		}

		return "SELECT COUNT(*) from ( select 1 as col_c " + sql.substring(lowerCaseSQL.indexOf(" from "))  +" )   cnt";
	}

	@Override
	public Object plugin(Object target) {

		return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {

	}
}

 

分享到:
评论

相关推荐

    SpringMVC3.0+MyIbatis3.0(分页示例

    本示例聚焦于如何在SpringMVC 3.0和MyBatis 3.0环境中实现分页功能,这在处理大量数据时尤其重要,能够提高用户体验并减轻服务器压力。 **SpringMVC 3.0** SpringMVC是Spring框架的一部分,它是一个基于模型-视图-...

    SpringMVC3.0+MyIbatis3.0(分页示例)

    在本项目中,"SpringMVC3.0+MyIbatis3.0(分页示例)" 是一个结合了SpringMVC和MyBatis两大框架的实战应用,主要展示了如何在实际开发中实现数据的分页展示。这个项目可能是为了教学或者演示目的,通过源码分析,可以...

    Myibatis+mysql(适用于新手入门)

    在"Myibatis+mysql(适用于新手入门)"这个学习例子中,我们将重点了解如何结合 MyBatis 和 MySQL 数据库进行开发。MySQL 是一个广泛使用的开源关系型数据库管理系统,以其高效性和易用性深受开发者喜爱。 1. **...

    ssi(struts2 spring myibatis)

    整合的struts2 spring myibatis easyUI基础框架 1.myibatis 的分页 2.异常处理机制 3.logback日记整合 4.oracle agile 整合(不需要agile,可以直接删除代码) 5.其他一些小东西的整合和整理 6.项目中有详细的注解

    MyiBatis_用户手册

    MyiBatis_用户手册包含以下资源: 1.iBatis2.0 开发指南中文版 2.MyiBatis3 用户指南中文版 3.MyiBatis Spring 1.0.0-snapshot 参考文档 以上都是pdf格式文档

    myIbatis入门示例、myIbatis helloword示例、myIbatis第一个示例

    本教程将带你一步步走进MyBatis的世界,通过"myIbatis入门示例、myIbatis helloworld示例、myIbatis第一个示例",让你快速掌握MyBatis的核心概念和基本用法。 1. MyBatis简介 MyBatis由Mike Keith和Clinton Begin...

    MyIbatis3.0入门实例

    MyIbatis3.0入门+进阶实例,直接把资源工程导入到MyEclise里就可以运行,导入到Eclipse里也可以, 包含: ---ibatis_3_学习笔记.pdf ---ibatis3__发布_入门示例.pdf 可以带你熟练使用MyIbatis3.0,实例代码对MyIbatis3.0...

    springMVC+Myibatis框架整合实例

    SpringMVC和MyBatis是两个非常流行的Java Web开发框架,它们在企业级应用中广泛使用。...将这两个框架整合起来,可以构建出高效、灵活的Web应用。 SpringMVC的核心组件包括DispatcherServlet、ModelAndView、...

    myibatis+spring+springmvc框架整合

    在IT行业中,构建高效、可维护的Web应用是开发者的核心任务之一。MyBatis、Spring和SpringMVC是Java Web开发中的三个重要框架,它们各司其职,共同构成了强大的后端开发工具链。本教程将详细介绍如何整合这三个框架...

    spring mvc3.2.3+ myibatis3.2.2

    spring mvc3.2.3+ myibatis3.2.2 分 dao service pojo mapper controllor等层,有敢于网上下载多不适用,故作一层次分明功能较全面(列表,登录验证,增加)的功能验证性web程序以为分享,因程序为功能验证性程序,...

    SpringMvc3+MyIbatis3

    SpringMvc3和MyIbatis3是当前流行的Java企业级开发框架和持久层框架,它们各自拥有强大的功能和灵活性,适合用于复杂、高性能的应用系统。SpringMvc是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架...

    MyIbatIS中文版电子书

    《MyIbatIS中文版电子书》是一本旨在帮助初学者轻松入门MyBatis框架的教程,涵盖了从基础到进阶的全方位知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,解决了在Java中操作数据库时...

    myibatis+spring源码

    《深入解析MyBatis与Spring整合的源码》 在Java开发领域,MyBatis和Spring框架的结合使用已经成为一种常见的实践,它们的整合能够帮助开发者更好地管理数据库操作和业务逻辑。本文将深入探讨MyBatis与Spring整合的...

    springMVC+myibatis的maven项目架构

    综上所述,"springMVC+myibatis的maven项目架构"是一个完整的Java Web解决方案,它利用SpringMVC处理Web请求,MyBatis负责数据访问,而Maven确保了项目的构建和依赖管理。此外,项目还提供了实用的Word和Excel工具类...

    springmvc-myibatis-heibernate

    Spring MVC、MyBatis 和 Hibernate 是 Java Web 开发中三个非常重要的框架,它们分别负责不同的职责。Spring MVC 是一个基于模型-视图-控制器(MVC)架构模式的Web应用框架,MyBatis 是一个优秀的持久层框架,而...

    myibatis3和springMVC整合

    MyBatis3与SpringMVC的整合是Java开发中常见的技术组合,主要用于构建高效、灵活的Web应用程序。这种整合能够充分利用MyBatis的SQL映射功能和SpringMVC的MVC设计模式,实现数据访问层与业务逻辑层的解耦。...

    myibatis开发官方帮助文档

    【标题】"myibatis开发官方帮助文档"涵盖了MyBatis这一流行持久层框架的核心概念、使用方法和最佳实践。MyBatis是一个优秀的Java库,它允许开发者将SQL语句直接集成到Java代码中,提供了比传统的JDBC更为便捷且灵活...

    myibatis实战教程

    7. MyBatis的分页实现,通过自定义插件或特定的分页查询方法。 8. 动态SQL语句,MyBatis允许在映射文件中编写条件语句,实现灵活的查询逻辑。 9. MyBatis代码生成工具的使用,自动创建Mapper接口、Mapper XML文件和...

Global site tag (gtag.js) - Google Analytics