加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于oracle+ibatis批量insert的写法

发布时间:2020-12-12 14:19:51 所属栏目:百科 来源:网络整理
导读:现在编写代码,总时刻要求自己,不只是实现功能,而且要质量更高。 最近使用ibatis框架,其灵活的sql编写,能够颗粒度的优化,蛮不错的。 另外使用批量insert时,找了好久,终于被我找到一种合适的批量添加操作。强调一下,本人使用的是oracle数据库。 传到D

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


最近使用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. });

      (编辑:李大同)

      【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读