`
dongwujing
  • 浏览: 798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转spring中ibatis的批处理方式

 
阅读更多

最近做一个小项目,用到Spring+iBatis。突然遇到一个很久远,却很实在的问题:在Spring下怎么使用iBatis的批处理实现?

大概是太久没有写Dao了,这部分真的忘得太干净了。

从4个层面分析这部分实现:
iBatis的基本实现
基于事务的iBatis的基本实现
基于事务的Spring+iBatis实现
基于回调方式的Spring+iBatis实现


1.iBatis的基本实现
iBatis通过SqlMapClient提供了一组方法用于批处理实现:
startBatch() 开始批处理
executeBatch() 执行批处理

代码如下:
Java代码
public void create(List<Reply> replyList) { 
 
    try { 
        // 开始批处理 
        sqlMapClient.startBatch(); 
 
        for (Reply reply: replyList) { 
            // 插入操作 
            sqlMapClient.insert("Reply.create", reply); 
        } 
        // 执行批处理 
        sqlMapClient.executeBatch(); 
 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 


这是基于iBatis的最基本实现,如果你一步一步debug,你会发现:其实,数据库已经执行了插入操作!
因此,除了这两个核心方法外,你还需要开启事务支持。否则,上述代码只不过是个空架子!
2.基于事务的iBatis的基本实现
事务处理:
startTransaction() 开始事务
commitTransaction() 提交事务
endTransaction() 结束事务


我们以insert操作为例,把它们结合到一起:
Java代码
public void create(List<Reply> replyList) { 
 
    try { 
        // 开始事务 
        sqlMapClient.startTransaction(); 
        // 开始批处理 
        sqlMapClient.startBatch(); 
 
        for (Reply reply: replyList) { 
            // 插入操作 
            sqlMapClient.insert("Reply.create", reply); 
        } 
        // 执行批处理 
        sqlMapClient.executeBatch(); 
 
        // 提交事务 
        sqlMapClient.commitTransaction(); 
 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } finally {   
             try { 
            // 结束事务 
            sqlMapClient.endTransaction(); 
                } catch (SQLException e) { 
                         e.printStackTrace(); 
                     } 
    }   


replyList是一个List,要把这个List插入到数据库,就需要经过这三个步骤:
开始批处理 startBatch()
插入      insert()
执行批处理 executeBatch()
如果要在Spring+iBatis中进行批处理实现,需要注意使用同一个sqlMapClient!同时,将提交事务的工作交给Spring统一处理!

3.基于事务的Spring+iBatis实现
Java代码
public void create(List<Reply> replyList) { 
    if (!CollectionUtils.isEmpty(replyList)) { 
        // 注意使用同一个SqlMapClient会话 
        SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient(); 
 
        try { 
            // 开始事务 
            sqlMapClient.startTransaction(); 
            // 开始批处理 
            sqlMapClient.startBatch(); 
            for (Reply reply : replyList) { 
                // 插入操作 
                sqlMapClient.insert("Reply.create", reply); 
            } 
 
            // 执行批处理 
            sqlMapClient.executeBatch(); 
            // 提交事务 交给Spring统一控制 
            // sqlMapClient.commitTransaction(); 
 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally {   
                 try { 
                // 结束事务 
                sqlMapClient.endTransaction(); 
                    } catch (SQLException e) { 
                             e.printStackTrace(); 
                         } 
        }   
    } 


注意使用同一个sqlMapClient:
SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();
如果直接sqlMapClientTemplate执行insert()方法,将会造成异常!

想想,还有什么问题?其实问题很明显,虽然解决了批处理实现的问题,却造成了事务代码入侵的新问题。 这么做,有点恶心!
除此之外,异常的处理也很恶心,不能够简单的包装为 DataAccessException 就无法被Spring当作统一的数据库操作异常做处理。


4.基于回调方式的Spring+iBatis实现
如果观察过Spring的源代码,你一定知道,Spring为了保持事务统一控制,在实现ORM框架时通常都采用了回调模式,从而避免了事务代码入侵的可能!
修改后的代码如下:
Java代码
@SuppressWarnings("unchecked") 
public void create(final List<Reply> replyList) { 
    // 执行回调 
    sqlMapClientTemplate.execute(new SqlMapClientCallback() { 
        // 实现回调接口 
        public Object doInSqlMapClient(SqlMapExecutor executor) 
                throws SQLException { 
            // 开始批处理 
            executor.startBatch(); 
            for (Reply reply : replyList) { 
                // 插入操作 
                executor.insert("Reply.create", reply); 
 
            } 
            // 执行批处理 
            executor.executeBatch(); 
 
            return null; 
 
        } 
    }); 
 


注意,待遍历的参数replyList需要加入final标识!即,待遍历对象不能修改!
引用public void create(final List<Reply> replyList)
这样做,就将事务处理的控制权完全交给了Spring!
简述:
SqlMapClientCallback 回调接口
doInSqlMapClient(SqlMapExecutor executor) 回调实现方法
DataAccessException 最终可能抛出的异常

通过上述修改,最终能够解决第三种实现方式中的种种不足!

Spring对iBatis提供的支持还是不够完善,即便是现在最新的Spring3.0.4。最开始,本打算用Spring3.0+iBatis3.0,结果Spring报错,说找不到“com.ibatis.xxxxx”完全是iBatis2.x的包路径!汗颜~ 还是Hibernate比较得宠!
分享到:
评论

相关推荐

    ibatis批处理.doc

    尽管Spring已经配置了事务管理,但在实际使用iBATIS批处理时,仍需要在代码中显式地开启和提交事务。这是因为iBATIS的批处理需要在一个事务内执行,才能确保所有操作作为一个整体执行。例如,下面的代码展示了如何在...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    ibatis的两种方式实现批处理.doc

    iBatis批处理实现方式浅析 iBatis是一个功能强大的持久层框架,提供了多种方式来实现批处理操作。批处理是指将多个SQL语句组合成一个批处理单元,然后将其执行到数据库中,以提高数据库操作的效率。在iBatis中,...

    SpringBatch批处理 刘相编

    基本篇重点讲述了数据批处理的核心概念、典型的作业配置、作业步配置,以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS...

    Spring iBatis Learning Notes

    Java JDBC作为低级别的API,在实际应用中存在诸多不便之处,因此业界尝试通过多种方式对其进行增强,比如EJB、JDO、Hibernate、Toplink(来自Oracle)、iBatis、SQL Executor以及Spring JDBC支持等技术。 #### 二、...

    ibatis批量处理

    ### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一...此外,合理选择不同的实现方式(如直接使用iBatis API、基于Spring事务管理或使用回调方式),可以使程序更加灵活、高效。

    axis2 ibatis spring简单资料

    8. **Hibernate 配置**:虽然主要讨论的是 Axis2、iBatis 和 Spring,但文件中还提到了 Hibernate 的配置,如 dialect(数据库方言)、jdbc 的批处理大小和获取数据的大小、是否显示 SQL 语句以及自动更新数据库结构...

    iBATIS&Spring合奏(一)--DAO

    标题中的“iBATIS&Spring合奏(一)--DAO”指的是在Java开发中,将iBATIS和Spring框架结合使用来实现数据访问层(DAO)的一种技术整合。iBATIS是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,提供...

    iBATIS-SqlMaps中文教程集合

    - Spring与iBATIS整合:讲解如何将iBATIS与Spring框架集成,实现依赖注入和事务管理。 - 性能优化:提供性能调优的策略,包括缓存使用、批处理等技巧。 这四本教程全面覆盖了iBATIS的核心概念和实践应用,无论你...

    ibatis api,ibatis文档,ibatis说明文档

    1. 安装和配置:介绍如何将Ibatis集成到项目中,包括Maven或Gradle依赖、Spring整合等。 2. 映射文件和SQL语句:讲解如何编写XML映射文件,包括插入、更新、删除和查询等操作。 3. 动态SQL:Ibatis的动态SQL功能...

    ibatis 中文手册

    Ibatis 的主要目标是简化 Java 应用中的数据访问,通过提供一种映射 SQL 语句到 Java 方法的方式,使开发人员可以更专注于业务逻辑而不是数据库操作。Ibatis 提倡“SQL 应该写在 XML 中”,这样可以避免 SQL 污染...

    ibatis jar包.zip

    8. **与其他框架集成**:iBATIS可以很好地与Spring框架集成,提供更完整的应用程序上下文管理和AOP(面向切面编程)支持。 9. **性能优化**:通过预编译SQL语句、批处理等技术,iBATIS能够有效地提高数据库操作的性能...

    ibatis的3个jar包.rar

    在使用Ibatis时,开发者可以根据项目的规模和需求选择不同的集成方式,如Spring框架中的Ibatis整合,实现更高级的事务管理和依赖注入。 总的来说,这三者构成了Ibatis的基本运行环境,对于理解Ibatis的工作原理和...

    iBATIS_DAO-2.2.0.638

    iBATIS DAO是Java开发中的一个关键组件,它在企业级应用中被广泛...同时,由于iBATIS与Spring框架的良好整合,使得在Spring环境下使用iBATIS变得更加便捷,可以实现依赖注入和AOP切面编程,进一步提升开发的灵活性。

    iBatis 轻量级持久层架构

    在Spring框架中嵌入iBatis,可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力,简化数据访问层的管理。集成iBatis的主要步骤包括配置SqlSessionFactoryBean,定义DataSource,以及将DAO接口与XML映射文件...

    ibatis资料(官方文档)

    Ibatis,全称为“SQL Maps”,是一个开源的Java持久层框架,它允许程序员将SQL语句与Java代码分离,提供了一种灵活的方式来控制数据库交互。官方文档是学习和理解Ibatis核心特性和最佳实践的重要资源。现在,让我们...

    ibatis框架源码剖析光盘资料

    同时,它支持Spring的事务管理,可以无缝集成到Spring应用中。 总的来说,ibatis框架源码的学习不仅可以帮助我们理解其工作原理,提升开发效率,还能为我们提供一种思考问题的角度,理解数据访问层的设计模式。通过...

    spring面试题.doc

    1. **依赖注入(DI)**:在Spring中,DI可以通过以下几种方式进行: - Setter注入:通过调用Bean的setter方法设置依赖对象。 - 构造器注入:通过构造函数传递依赖对象。 - 注解注入:使用`@Autowired`,`@...

    ibatis开发指南(中文)及API(中文)

    1. **简介**:解释了Ibatis的基本理念,即SQL映射框架,以及它如何与Spring等其他框架集成。 2. **安装与配置**:介绍了如何将Ibatis纳入到Java项目中,包括Maven依赖的添加、配置文件的设置等。 3. **...

    Manning iBATIS in Action

    最后,书中通过一系列的实际案例展示了iBATIS在各种应用场景下的解决方案,包括Web应用、批处理任务和分布式系统。这些案例不仅帮助读者巩固理论知识,还能提供实践经验。 总的来说,《Manning iBATIS in Action》...

Global site tag (gtag.js) - Google Analytics