采用的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) { } }
相关推荐
本示例聚焦于如何在SpringMVC 3.0和MyBatis 3.0环境中实现分页功能,这在处理大量数据时尤其重要,能够提高用户体验并减轻服务器压力。 **SpringMVC 3.0** SpringMVC是Spring框架的一部分,它是一个基于模型-视图-...
在本项目中,"SpringMVC3.0+MyIbatis3.0(分页示例)" 是一个结合了SpringMVC和MyBatis两大框架的实战应用,主要展示了如何在实际开发中实现数据的分页展示。这个项目可能是为了教学或者演示目的,通过源码分析,可以...
在"Myibatis+mysql(适用于新手入门)"这个学习例子中,我们将重点了解如何结合 MyBatis 和 MySQL 数据库进行开发。MySQL 是一个广泛使用的开源关系型数据库管理系统,以其高效性和易用性深受开发者喜爱。 1. **...
整合的struts2 spring myibatis easyUI基础框架 1.myibatis 的分页 2.异常处理机制 3.logback日记整合 4.oracle agile 整合(不需要agile,可以直接删除代码) 5.其他一些小东西的整合和整理 6.项目中有详细的注解
MyiBatis_用户手册包含以下资源: 1.iBatis2.0 开发指南中文版 2.MyiBatis3 用户指南中文版 3.MyiBatis Spring 1.0.0-snapshot 参考文档 以上都是pdf格式文档
本教程将带你一步步走进MyBatis的世界,通过"myIbatis入门示例、myIbatis helloworld示例、myIbatis第一个示例",让你快速掌握MyBatis的核心概念和基本用法。 1. MyBatis简介 MyBatis由Mike Keith和Clinton Begin...
MyIbatis3.0入门+进阶实例,直接把资源工程导入到MyEclise里就可以运行,导入到Eclipse里也可以, 包含: ---ibatis_3_学习笔记.pdf ---ibatis3__发布_入门示例.pdf 可以带你熟练使用MyIbatis3.0,实例代码对MyIbatis3.0...
SpringMVC和MyBatis是两个非常流行的Java Web开发框架,它们在企业级应用中广泛使用。...将这两个框架整合起来,可以构建出高效、灵活的Web应用。 SpringMVC的核心组件包括DispatcherServlet、ModelAndView、...
在IT行业中,构建高效、可维护的Web应用是开发者的核心任务之一。MyBatis、Spring和SpringMVC是Java Web开发中的三个重要框架,它们各司其职,共同构成了强大的后端开发工具链。本教程将详细介绍如何整合这三个框架...
spring mvc3.2.3+ myibatis3.2.2 分 dao service pojo mapper controllor等层,有敢于网上下载多不适用,故作一层次分明功能较全面(列表,登录验证,增加)的功能验证性web程序以为分享,因程序为功能验证性程序,...
SpringMvc3和MyIbatis3是当前流行的Java企业级开发框架和持久层框架,它们各自拥有强大的功能和灵活性,适合用于复杂、高性能的应用系统。SpringMvc是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架...
《MyIbatIS中文版电子书》是一本旨在帮助初学者轻松入门MyBatis框架的教程,涵盖了从基础到进阶的全方位知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,解决了在Java中操作数据库时...
《深入解析MyBatis与Spring整合的源码》 在Java开发领域,MyBatis和Spring框架的结合使用已经成为一种常见的实践,它们的整合能够帮助开发者更好地管理数据库操作和业务逻辑。本文将深入探讨MyBatis与Spring整合的...
综上所述,"springMVC+myibatis的maven项目架构"是一个完整的Java Web解决方案,它利用SpringMVC处理Web请求,MyBatis负责数据访问,而Maven确保了项目的构建和依赖管理。此外,项目还提供了实用的Word和Excel工具类...
Spring MVC、MyBatis 和 Hibernate 是 Java Web 开发中三个非常重要的框架,它们分别负责不同的职责。Spring MVC 是一个基于模型-视图-控制器(MVC)架构模式的Web应用框架,MyBatis 是一个优秀的持久层框架,而...
MyBatis3与SpringMVC的整合是Java开发中常见的技术组合,主要用于构建高效、灵活的Web应用程序。这种整合能够充分利用MyBatis的SQL映射功能和SpringMVC的MVC设计模式,实现数据访问层与业务逻辑层的解耦。...
【标题】"myibatis开发官方帮助文档"涵盖了MyBatis这一流行持久层框架的核心概念、使用方法和最佳实践。MyBatis是一个优秀的Java库,它允许开发者将SQL语句直接集成到Java代码中,提供了比传统的JDBC更为便捷且灵活...
7. MyBatis的分页实现,通过自定义插件或特定的分页查询方法。 8. 动态SQL语句,MyBatis允许在映射文件中编写条件语句,实现灵活的查询逻辑。 9. MyBatis代码生成工具的使用,自动创建Mapper接口、Mapper XML文件和...