用 iabtis
<iterate conjunction="">
批量提交,缺点是提交数量有限制,size<1000;
批量提交: http://fengxiaoshuang429201406254717.iteye.com/blog/2392798
大量数据的话用事物提交:
我这边设置的是,一条一条insert,满5000条,事物提交;
如果过来一万条数据,事物会分成两批提交;
service impl实现层:
/** 5000条提交一次 */ public static final int BATCH_SIZE = 5000; /** 事务模板 */ protected TransactionTemplate transactionTemplate; /** sql执行模板 */ protected SqlMapClientTemplate sqlMapClientTemplate = new SqlMapClientTemplate(); private SqlMapClient sqlMapClient; public SqlMapClientTemplate getSqlMapClientTemplate() { return sqlMapClientTemplate; } public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) { this.sqlMapClientTemplate = sqlMapClientTemplate; } public SqlMapClient getSqlMapClient() { return sqlMapClient; } public void setSqlMapClient(SqlMapClient sqlMapClient) { this.sqlMapClient = sqlMapClient; this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient); } public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } @Override public void getBankHandlingCharge(final List<PostAccountVO> vo) { sqlMapClientTemplate.execute(new SqlMapClientCallback() { public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { executor.startBatch(); int indexInBatch = 0; List<PostAccountInfoDO> infoDOList = new LinkedList<PostAccountInfoDO>(); for (PostAccountVO poa : vo){ PostAccountInfoDO infoDO = new PostAccountInfoDO(); infoDO.setAmount(poa.getAmount()); infoDO.setFundCategory(poa.getFundCategory()); infoDO.setPostStaus(poa.getPostStaus()); infoDO.setFundChannelCode(poa.getFundChannelCode()); infoDO.setHappenDate(poa.getHappenDate()); infoDO.setRemarks(poa.getRemarks()); infoDO.setCreater(poa.getCreater()); infoDO.setCreateTime(poa.getCreateTime()); infoDO.setAuditor(poa.getCreater()); infoDO.setAuditorTime(poa.getCreateTime()); infoDO.setDeleteFlag(poa.getDeleteFlag()); infoDO.setInstOrder(poa.getInstOrder()); infoDOList.add(infoDO); } for (PostAccountInfoDO postAccountInfoDO:infoDOList) { if (indexInBatch > BATCH_SIZE) {//5000条作为一批处理。超过5000,则作为下一批。 executor.executeBatch(); executor.startBatch(); indexInBatch = 0; } executor.insert("MS-POST-ACCOUNT-INFO-INSERT", postAccountInfoDO); indexInBatch++; } return executor.executeBatch(); } }); }
insert 方法不是dao层的实现方法,是executor里边的insert方法,也就是说这里直接访问了mapping.xml文件里边 id="MS-POST-ACCOUNT-INFO-INSERT" 的方法;
mapping.xml层:
<insert id="MS-POST-ACCOUNT-INFO-INSERT"> <selectKey resultClass="java.lang.String" keyProperty="accountSeqNo"> <![CDATA[ select seq_post_account_info.nextval from dual ]]> </selectKey> <![CDATA[ insert into TB_POST_TABLE(ACCOUNT_SEQ_NO,AMOUNT,FUND_CATEGORY,POST_STAUS,FUND_CHANNEL_CODE,HAPPEN_DATE,REMARKS,CREATER,CREATE_TIME,AUDITOR,AUDITOR_TIME,DELETE_FLAG,INST_ORDER) values ( #accountSeqNo#, #amount#, #fundCategory#, #postStaus#, #fundChannelCode#, #happenDate#, #remarks#, #creater#, #createTime#, #auditor#, #auditorTime#, #deleteFlag#, #instOrder#) ]]> </insert>
事务提交失败回滚:
我在事物提交前抛出异常(如下图),数据并没有添加到数据库,应该是有回滚机制在里边吧
相关推荐
### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...
本文将深入探讨“ibatis批量存储”这一主题,基于给定的文件名,我们将依次解析Ibatis中的iterate标签、批处理、foreach标签以及如何在Ibatis中使用HashMap。 1. Iterate标签详解及应用: Ibatis的iterate标签主要...
在Ibatis中,可以通过设置SqlSession的flushCache和useCache属性,以及使用批处理执行器ExecutorType.BATCH,来实现批量插入、更新或删除。例如,在插入1万条数据时,将这些操作放在同一个SqlSession中,而不是逐一...
在IT行业中,数据库...总结来说,Ibatis批量插入的DAO实例主要依赖于动态SQL的`<foreach>`标签,以及对JDBC批处理的正确配置。理解并熟练运用这些技巧,能够帮助我们在处理大量数据时,有效地提升应用的性能和效率。
SqlSession支持事务管理,包括开启、提交和回滚。 3. Mapper:Ibatis中的Mapper接口是与数据库交互的桥梁。开发者可以定义自己的Mapper接口,并在XML映射文件中配置SQL语句,这样就可以在代码中直接调用Mapper接口...
- 事务管理:讲解如何在iBATIS中进行事务控制,包括自动和手动提交、回滚等操作。 - 映射器接口:如何创建和使用Mapper接口,以及接口方法与XML映射文件的关联。 2. **iBATIS SQL Maps入门教程**: 入门教程通常...
8. **事务管理**:讨论iBatis如何进行事务控制,包括手动和自动提交,以及事务隔离级别。 9. **插件机制**:介绍iBatis的插件功能,如何自定义插件拦截SQL执行过程,实现如日志记录、性能分析等功能。 10. **缓存...
6. **Transaction Management**: iBATIS 提供事务管理功能,允许在应用级别控制事务的开始、提交和回滚。开发者可以配置事务隔离级别和超时设置。 7. **Caching**: 为了提高性能,iBATIS 提供缓存机制,可以缓存...
尽管Spring已经配置了事务管理,但在实际使用iBATIS批处理时,仍需要在代码中显式地开启和提交事务。这是因为iBATIS的批处理需要在一个事务内执行,才能确保所有操作作为一个整体执行。例如,下面的代码展示了如何在...
5. **事务管理**: iBatis提供了事务控制功能,开发者可以自定义事务的提交和回滚。 **iBatis开发指南** 开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在...
4. **事务管理**:Ibatis.net支持事务控制,可以通过编程方式或配置文件来管理事务的开始、提交和回滚。 5. **动态SQL**:Ibatis.net允许你在SQL映射文件中编写动态SQL,根据条件改变查询的结构,这在处理复杂的...
2. 数据库事务管理:Ibatis提供了对数据库事务的管理,可以在业务逻辑层控制事务的提交和回滚,使得事务处理更加灵活。 3. 参数映射:Ibatis能够自动将Java对象的属性值映射到SQL语句的参数中,同样也能将查询结果...
### iBatis批量操作 #### 一、简介 在企业级应用开发中,数据库操作是不可或缺的一部分。为了提高效率和减少资源消耗,批量处理成为了一种常用的技术手段。本文将介绍如何利用iBatis框架进行批量添加、修改、删除...
SimpleExecutor每次执行一个SQL语句,而BatchExecutor则将多个SQL语句批量提交,提高了效率。 4. **Statement处理**:Ibatis提供了两种Statement处理方式:PreparedStatement(预编译SQL)和Statement(普通SQL)。...
iBatis支持手动和自动事务管理,开发者可以通过TransactionManager来控制事务的提交和回滚。同时,它也支持Spring的声明式事务管理。 7. **插件支持** iBatis提供插件机制,通过拦截器(Interceptor)可以在SQL...
4. **SqlSessionManager**: 提供了更高级别的事务管理,可以控制多个SqlSession的提交和回滚。 5. **Executor**: 执行器,负责执行SQL并处理结果。有简单执行器、复用执行器和批处理执行器三种,分别适用于不同的...
7.4.2 开始、提交以及结束事务 124 7.4.3 我是否需要全局事务 124 7.5 定制事务 125 7.6 事务划界 126 7.6.1 将事务在表现层划界 128 7.6.2 将事务在持久层划界 128 7.6.3 将事务在业务逻辑层划界 128 7.7 小结 129 ...
2. Executor:执行器,Ibatis的核心执行组件,根据不同的执行策略(如简单、缓存、批量)实现SQL的执行。 七、事务管理 Ibatis支持手动和自动两种事务管理方式。手动模式下,开发者需要自行开启和提交事务;自动...
事务管理部分则涵盖了自动提交、手动提交和回滚等操作。映射文件的编写是关键,包括了增删查改的各种SQL语句,以及ResultMap用于将查询结果转换为Java对象。 iBatis的API使用也非常直观。SqlSession是主要的交互...
5. **事务管理**:讲解如何在iBatis中进行事务控制,包括手动和自动提交、回滚以及事务隔离级别等。 6. **与Spring集成**:很多项目中,iBatis常与Spring框架一起使用,这部分会讲述如何配置Spring的DataSource和...