关于oracle+ibatis批量insert的写法

1 篇文章 0 订阅
1 篇文章 0 订阅

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


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


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


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

 <insert id="addCkbRedilutedInfo"  parameterClass="java.util.List" >
        insert all
    	<iterate conjunction =" ">
        	into ckb_dna_volume_info
        	(dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user) 
        	values  
    		<![CDATA[   
            (#list[].gCryovialId:VARCHAR#, #list[].gBoxId:VARCHAR#, #list[].fCryovialId:VARCHAR#, #list[].operatdate:VARCHAR#, #list[].additionalBufferVolume:VARCHAR#, #list[].bufferReagent:VARCHAR#, #list[].operator:VARCHAR#)  
    		]]>    
    	</iterate> 
    	select * from dual  
    </insert>



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

<insert id="addCkbRedilutedInfo"  parameterClass="java.util.List" >
        	insert into ckb_dna_volume_info
        	(dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user) 
        	values  
        	select dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user from
        	(
        	<iterate conjunction ="  union all ">
            select 
            #list[].gCryovialId# as dna_num, #list[].gBoxId# as d_board_name, #list[].fCryovialId# as source_cryovial_id, 
            #list[].operatdate# as date_processed, #list[].additionalBufferVolume# as buffer_volume, #list[].bufferReagent# as buffer_reagent, 
            #list[].operator# as create_user
    		from dual
    		</iterate> 
    		)
    </insert>

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

<insert id="addCkbRedilutedInfo"  parameterClass="java.util.List" >
        	insert into ckb_dna_volume_info
        	(dna_num,d_board_name,source_cryovial_id,date_processed,buffer_volume,buffer_reagent,create_user) 
        	values  
        	<iterate conjunction =",">
            <![CDATA[   
            (#list[].gCryovialId#, #list[].gBoxId#, #list[].fCryovialId#, #list[].operatdate#, #list[].additionalBufferVolume#, #list[].bufferReagent#, #list[].operator#)  
    		]]> 
    		</iterate> 
    </insert>



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

try {
			this.getSqlMapClient().startTransaction();
			this.getSqlMapClient().startBatch();
			
			for(CkbInfo info :infos){
				this.getSqlMapClientTemplate().insert("CKBDNAInfo.addCkbRedilutedInfo", info);</span>
			}
			
			this.getSqlMapClient().executeBatch();
			this.getSqlMapClient().commitTransaction();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			try {
				this.getSqlMapClient().endTransaction();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

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

  // 执行回调  
    sqlMapClientTemplate.execute(new SqlMapClientCallback() {  
        // 实现回调接口  
        public Object doInSqlMapClient(SqlMapExecutor executor)  
                throws SQLException {  
            // 开始批处理  
            executor.startBatch();  
            for (CkbInfo info :infos) { 
                // 插入操作  
                executor.insert("CKBDNAInfo.addCkbRedilutedInfo", info);
  
            }  
            // 执行批处理  
            executor.executeBatch();  
  
            return null;  
  
        }  
    });  





  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值