`
longgangbai
  • 浏览: 7341046 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IBatis框架的一些问题的扩展(四)

阅读更多

由于Ibatis的分页采用逻辑分页通过针对Ibatis分页的特殊处理支持物理分页。

实现思路:由于Ibatis各种数据操纵最终要调用SqlExecutor实现各种数据操作的功能。通过重写SqlExecutor 中特定的方法实现,相关的功能。

 

SqlExecutor 源码中通过逻辑分页调用

public void executeQuery(StatementScope statementScope, Connection conn, String sql, Object parameters[], int skipResults, int maxResults, RowHandlerCallback callback)

        throws SQLException;

 

通过自定义扩展的IbatisSqlExecutor类:

package com.framework.app.ibatis;

import java.sql.Connection;

import java.sql.SQLException;

import com.ibatis.sqlmap.engine.execution.SqlExecutor;

import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback;

import com.ibatis.sqlmap.engine.scope.StatementScope;

 

public class LimitSqlExecutor extends SqlExecutor {

    private Dialect dialect;

    private boolean enableLimit = true;

    public Dialect getDialect() {

        return dialect;

    }

    public void setDialect(Dialect dialect) {

        if (dialect != null) {

            System.out.println("[iBATIS] 设置 ibatis LimitSqlExecutor.dialect = "

                    + dialect.getClass().getName());

        }

        this.dialect = dialect;

    }

    public boolean isEnableLimit() {

        return enableLimit;

    }

    public void setEnableLimit(boolean enableLimit) {

        this.enableLimit = enableLimit;

    }

    public void executeQuery(StatementScope request, Connection conn, String sql,

            Object[] parameters, int skipResults, int maxResults,

            RowHandlerCallback callback) throws SQLException {

        String limitSql = sql;

        int changedSkipResults = skipResults;

        int changedMaxResults = maxResults;

        if (supportsLimit()

                && (skipResults != NO_SKIPPED_RESULTS || maxResults != NO_MAXIMUM_RESULTS)) {

            limitSql = limitSql.trim();

            if (dialect.supportsLimitOffset()) {

                limitSql = dialect.getLimitString(sql, skipResults, maxResults);

                changedSkipResults = NO_SKIPPED_RESULTS;

            } else {

                limitSql = dialect.getLimitString(sql, 0, maxResults);

            }

            changedMaxResults = NO_MAXIMUM_RESULTS;

        }

        super.executeQuery(request, conn, limitSql, parameters,

                changedSkipResults, changedMaxResults, callback);

    }

    public boolean supportsLimit() {

        if (enableLimit && dialect != null) {

            return dialect.supportsLimit();

        }

        return false;

    }

}

 

使用如下:

通过注入的方式将重新自定的LimitSqlExecutor注入的SqlExecutor

 

	@Override
	@SuppressWarnings({ "unchecked", "deprecation" })
	public Pagination queryForPaginatedList(String itemSqlId,
			String countSqlId, Object parameter, int skip, int max) {
		if (sqlMapClient instanceof ExtendedSqlMapClient) {
			LimitSqlExecutor limitSqlExecutor = new LimitSqlExecutor();
			limitSqlExecutor.setDialect(new OracleDialect());
			RefUtils.setFieldValue(((ExtendedSqlMapClient) sqlMapClient)
					.getDelegate(), "sqlExecutor", SqlExecutor.class,
					limitSqlExecutor);
		}

		try {
			// 偏移值
			int offset = (skip - 1) * max;
			// 数据项
			List listItem = sqlMapClient.queryForList(itemSqlId, parameter,
					offset, max);
			// 总页数
			int totalResult = queryForTotalResult(countSqlId, parameter);
			return new Pagination(listItem, totalResult, offset, max);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException(e);
		}
	}

 

 

 备注:这种方法不是很好,但是考虑到执行分页的方法不是很多,所以就这样了,最好采用在类加载器类对垒的重新加载时注入相关的类,可能更好。

分享到:
评论

相关推荐

    ssh2+ibatis框架

    SSH2+IBATIS框架是Java开发中常用的一套企业级应用开发框架组合,它将Spring、Hibernate、Struts2和iBatis等组件融合在一起,以提高开发效率和实现松耦合。以下是对这些框架及其整合方式的详细说明: **Spring框架*...

    ibatis框架简单应用

    Ibatis 主要解决的问题是简化 JDBC 的繁琐工作,通过 XML 或注解方式配置 SQL 语句,使得业务逻辑和数据访问层之间有更好的解耦。 **核心概念** 1. **SqlMapConfig.xml**: 这是 Ibatis 的全局配置文件,包含了数据...

    SpringMvc+ibatis框架

    SpringMvc和iBatis是Java开发中常用的两个框架,它们在Web应用开发中扮演着重要的角色。SpringMvc作为Spring框架的一部分,主要用于处理HTTP请求和视图的渲染,而iBatis则是一个轻量级的数据访问层框架,它将SQL与...

    ibatis 框架原理实现

    在这个自己编写的Ibatis框架实现中,我们可以看到类似的思路和核心功能。 1. **XML配置文件**: XML文件是Ibatis框架的核心,它存储了SQL语句、参数映射以及结果集映射等信息。在`sqlmap`目录下,可能包含了多个...

    SpringMvc+Ibatis框架

    iBatis框架则提供了一种将SQL语句与Java代码分离的方式,通过XML配置文件或注解来定义SQL语句,使得数据库操作更易于维护和扩展。它的核心概念有SqlSessionFactory、SqlSession和Mapper。SqlSessionFactory创建...

    springmvc+ibatis 框架

    Spring MVC 和 iBatis 是两个在 Java Web 开发中广泛使用的框架,它们组合起来可以构建高效、灵活且可维护的Web应用程序。Spring MVC 作为Spring框架的一部分,是用于构建前端控制器(DispatcherServlet)的MVC设计...

    struts2+spring+Ibatis框架包

    这个“struts2+spring+iBatis框架包”集成了这三个框架,使得开发者能够快速构建基于MVC(Model-View-Controller)模式的Web应用。 Struts2作为MVC框架,负责处理应用程序的控制逻辑。它通过Action类和配置文件定义...

    struts+spring+ibatis框架集合教程

    3. iBatis框架:iBatis是一个SQL映射框架,它将SQL语句与Java代码分离,提供了一种灵活的方式来执行数据库操作。通过XML或注解方式定义SQL语句,iBatis可以动态地生成和执行SQL,避免了传统的JDBC代码繁琐的模板式...

    iBATIS框架源码剖析-任钢

    《iBATIS框架源码剖析》这本书,作者任钢深入探讨了iBATIS的核心机制和实现原理,以下是对该框架的一些关键知识点的详细阐述。 1. **动态SQL**:iBATIS的一大亮点是它的动态SQL功能。通过在XML映射文件中使用条件...

    struts+spring+ibatis框架

    Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自负责应用程序的不同层面,共同构建了一个灵活且强大的企业级应用开发解决方案。这里,我们深入探讨这三个框架以及它们如何协同工作。 **Struts框架...

    spring struts ibatis 开发框架

    总的来说,Spring Struts iBatis框架组合提供了一个强大而灵活的开发环境,适合开发大型、复杂的企业级应用。通过熟练掌握这三个框架,开发者可以构建出符合现代开发标准的、易于维护的系统。在学习和使用过程中,...

    ibatis框架源代码

    通过对这些组件的源码阅读,我们可以学习到如何设计一个高效、可扩展的持久层框架,同时也可以借鉴Ibatis的优秀实践,比如它的动态SQL支持、缓存机制以及事务管理等。此外,源码中的异常处理、日志记录、单元测试等...

    struts,ibatis框架

    iBatis框架: 1. **SQL映射**:iBatis的核心是XML或注解方式定义的SQL语句,将SQL与Java代码分离,增强了可读性和维护性。 2. **动态SQL**:iBatis支持动态SQL,允许在SQL语句中根据条件动态生成不同的查询,提高...

    ibatis框架实现的增删改查

    本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...

    传智播客ibatis教程_ibatis优点总结

    6. **良好的扩展性**:iBATIS允许开发者通过插件进行扩展,例如,可以通过拦截器实现日志记录、性能监控等功能。 7. **与各种数据库兼容**:iBATIS不绑定特定的数据库,可以方便地切换不同的数据库系统,适应不同的...

    Ibatis框架三层架构项目源码.rar

    Ibatis框架是一个轻量级的Java持久层框架,它提供了SQL映射功能,将复杂的SQL语句与Java代码分离,使开发更为灵活高效。在这个"Ibatis框架三层架构项目"中,我们可以看到它按照标准的软件工程设计模式进行了分层,...

    struts2+spring+ibatis框架实例

    "struts2+spring+ibatis框架实例"是基于这三个框架的一个集成示例,它利用MySQL作为后端数据库。下面我们将详细探讨这三个框架及其在实际项目中的应用。 **Struts2框架** Struts2是MVC(模型-视图-控制器)架构模式...

Global site tag (gtag.js) - Google Analytics