关于oracle+ibatis批量insert的写法

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


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


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


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

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



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

[html]  view plain  copy
  1. <insert id="addCkbRedilutedInfo"  parameterClass="java.util.List" >  
  2.             insert into ckb_dna_volume_info  
  3.             (dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user)   
  4.             values    
  5.             select dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user from  
  6.             (  
  7.             <iterate conjunction ="  union all ">  
  8.             select   
  9.             #list[].gCryovialId# as dna_num, #list[].gBoxId# as d_board_name, #list[].fCryovialId# as source_cryovial_id,   
  10.             #list[].operatdate# as date_processed, #list[].additionalBufferVolume# as buffer_volume, #list[].bufferReagent# as buffer_reagent,   
  11.             #list[].operator# as create_user  
  12.             from dual  
  13.             </iterate>   
  14.             )  
  15.     </insert>  

另外一种也不能够正常使用如下(提示错误信息:ORA-00933: SQL command not properly ended):

[html]  view plain  copy
  1. <insert id="addCkbRedilutedInfo"  parameterClass="java.util.List" >  
  2.             insert into ckb_dna_volume_info  
  3.             (dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user)   
  4.             values    
  5.             <iterate conjunction =",">  
  6.             <![CDATA[    
  7.             (#list[].gCryovialId#, #list[].gBoxId#, #list[].fCryovialId#, #list[].operatdate#, #list[].additionalBufferVolume#, #list[].bufferReagent#, #list[].operator#)   
  8.             ]]>   
  9.             </iterate>   
  10.     </insert>  



上述只是在sql里写批量,其实ibatis还可以在DAO层用java代码实现,写法还可以如下:

[java]  view plain  copy
  1. try {  
  2.             this.getSqlMapClient().startTransaction();  
  3.             this.getSqlMapClient().startBatch();  
  4.               
  5.             for(CkbInfo info :infos){  
  6.                 this.getSqlMapClientTemplate().insert("CKBDNAInfo.addCkbRedilutedInfo", info);</span>  
  7.             }  
  8.               
  9.             this.getSqlMapClient().executeBatch();  
  10.             this.getSqlMapClient().commitTransaction();  
  11.         } catch (SQLException e) {  
  12.             // TODO Auto-generated catch block  
  13.             e.printStackTrace();  
  14.         } finally{  
  15.             try {  
  16.                 this.getSqlMapClient().endTransaction();  
  17.             } catch (SQLException e) {  
  18.                 // TODO Auto-generated catch block  
  19.                 e.printStackTrace();  
  20.             }  
  21.         }  

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

[java]  view plain  copy
  1. // 执行回调    
  2.   sqlMapClientTemplate.execute(new SqlMapClientCallback() {    
  3.       // 实现回调接口    
  4.       public Object doInSqlMapClient(SqlMapExecutor executor)    
  5.               throws SQLException {    
  6.           // 开始批处理    
  7.           executor.startBatch();    
  8.           for (CkbInfo info :infos) {   
  9.               // 插入操作    
  10.               executor.insert("CKBDNAInfo.addCkbRedilutedInfo", info);  
  11.   
  12.           }    
  13.           // 执行批处理    
  14.           executor.executeBatch();    
  15.   
  16.           return null;    
  17.   
  18.       }    
  19.   });    

猜你喜欢

转载自blog.csdn.net/wang1988081309/article/details/78354594
今日推荐