关于oracle+ibatis批量insert的写法

现在编写代码,总时刻要求自己,不只是实现功能,而且要质量更高。


最近使用ibatis框架,其灵活的sql编写,能够颗粒度的优化,蛮不错的。

另外使用批量insert时,找了好久,终于被我找到一种合适的批量添加操作。强调一下,本人使用的是oracle数据库

传到DAO层的是一个List集合类

[html] view plain copy
  1. <insertid="addCkbRedilutedInfo"parameterClass="java.util.List">
  2. insertall
  3. iterateconjunction="" intockb_dna_volume_info
  4. (dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user)
  5. values
  6. <![CDATA[
  7. (#list[].gCryovialId:VARCHAR#,#list[].gBoxId:VARCHAR#,#list[].fCryovialId:VARCHAR#,#list[].operatdate:VARCHAR#,#list[].additionalBufferVolume:VARCHAR#,#list[].bufferReagent:VARCHAR#,#list[].operator:VARCHAR#)
  8. ]]>
  9. </iterate>
  10. select*fromdual
  11. insert>


另外,在网上有另外的两种批量insert的写法,我这边使用oracle+ibatis测试了,行不通,方法如下(提示错误信息:ORA-00936: missing expression):

copy

    insertintockb_dna_volume_info
  1. selectdna_num,create_userfrom
  2. (
  3. iterateconjunction="unionall" select
  4. #list[].gCryovialId#asdna_num,#list[].gBoxId#asd_board_name,#list[].fCryovialId#assource_cryovial_id,
  5. #list[].operatdate#asdate_processed,#list[].additionalBufferVolume#asbuffer_volume,#list[].bufferReagent#asbuffer_reagent,
  6. #list[].operator#ascreate_user
  7. fromdual
  8. )
  9. 另外一种也不能够正常使用如下(提示错误信息:ORA-00933: sql command not properly ended):

    copy

    iterateconjunction=","<![CDATA[
  1. (#list[].gCryovialId#,#list[].gBoxId#,#list[].fCryovialId#,#list[].operatdate#,#list[].additionalBufferVolume#,#list[].bufferReagent#,#list[].operator#)
  2. ]]>
  3. 上述只是在sql里写批量,其实ibatis还可以在DAO层用java代码实现,写法还可以如下:

    [java] copy
    try{
  1. this.getsqlMapClient().startTransaction();
  2. this.getsqlMapClient().startBatch();
  3. for(CkbInfoinfo:infos){
  4. this.getsqlMapClientTemplate().insert("CKBDNAInfo.addCkbRedilutedInfo",info);</span>
  5. }
  6. this.getsqlMapClient().executeBatch();
  7. this.getsqlMapClient().commitTransaction();
  8. }catch(sqlExceptione){
  9. //TODOAuto-generatedcatchblock
  10. e.printStackTrace();
  11. }finally{
  12. this.getsqlMapClient().endTransaction();
  13. }
  14. }

但是上述方法新开启了事务却导致了事务问题,所以还是用另外一种方式来处理,即基于回调方式的实现(当然,要注意你的数据库游标设置的最大值是多少,尽可能大些,不然会超出游标的最大设置值):

copy

    //执行回调
  1. sqlMapClientTemplate.execute(newsqlMapClientCallback(){
  2. //实现回调接口
  3. publicObjectdoInsqlMapClient(sqlMapExecutorexecutor)
  4. throwssqlException{
  5. //开始批处理
  6. executor.startBatch();
  7. for(CkbInfoinfo:infos){
  8. //插入操作
  9. executor.insert("CKBDNAInfo.addCkbRedilutedInfo",info);
  10. //执行批处理
  11. executor.executeBatch();
  12. returnnull;
  13. });

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...