日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

iBatis整理——iBatis批处理实现(Spring环境)

發(fā)布時間:2025/7/14 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iBatis整理——iBatis批处理实现(Spring环境) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近做一個小項目,用到Spring+iBatis。突然遇到一個很久遠,卻很實在的問題:在Spring下怎么使用iBatis的批處理實現(xiàn)??

大概是太久沒有寫Dao了,這部分真的忘得太干凈了。?

從4個層面分析這部分實現(xiàn):?
  • iBatis的基本實現(xiàn)
  • 基于事務的iBatis的基本實現(xiàn)
  • 基于事務的Spring+iBatis實現(xiàn)
  • 基于回調方式的Spring+iBatis實現(xiàn)


  • 1.iBatis的基本實現(xiàn)?
    iBatis通過SqlMapClient提供了一組方法用于批處理實現(xiàn):?
  • startBatch() 開始批處理
  • executeBatch() 執(zhí)行批處理

  • 代碼如下:?
    Java代碼?
  • public?void?create(List<Reply>?replyList)?{??
  • ??
  • ????try?{??
  • ????????//?開始批處理??
  • ????????sqlMapClient.startBatch();??
  • ??
  • ????????for?(Reply?reply:?replyList)?{??
  • ????????????//?插入操作??
  • ????????????sqlMapClient.insert("Reply.create",?reply);??
  • ????????}??
  • ????????//?執(zhí)行批處理??
  • ????????sqlMapClient.executeBatch();??
  • ??
  • ????}?catch?(Exception?e)?{??
  • ????????e.printStackTrace();??
  • ????}??
  • }??

  • 這是基于iBatis的最基本實現(xiàn),如果你一步一步debug,你會發(fā)現(xiàn):其實,數(shù)據(jù)庫已經(jīng)執(zhí)行了插入操作!?
    因此,除了這兩個核心方法外,你還需要開啟事務支持。否則,上述代碼只不過是個空架子!?

    2.基于事務的iBatis的基本實現(xiàn)?
    事務處理:?
  • startTransaction() 開始事務
  • commitTransaction() 提交事務
  • endTransaction() 結束事務


  • 我們以insert操作為例,把它們結合到一起:?
    Java代碼?
  • public?void?create(List<Reply>?replyList)?{??
  • ??
  • ????try?{??
  • ????????//?開始事務??
  • ????????sqlMapClient.startTransaction();??
  • ????????//?開始批處理??
  • ????????sqlMapClient.startBatch();??
  • ??
  • ????????for?(Reply?reply:?replyList)?{??
  • ????????????//?插入操作??
  • ????????????sqlMapClient.insert("Reply.create",?reply);??
  • ????????}??
  • ????????//?執(zhí)行批處理??
  • ????????sqlMapClient.executeBatch();??
  • ??
  • ????????//?提交事務??
  • ????????sqlMapClient.commitTransaction();??
  • ??
  • ????}?catch?(Exception?e)?{??
  • ????????e.printStackTrace();??
  • ????}?finally?{????
  • ?????????????try?{??
  • ????????????//?結束事務??
  • ????????????sqlMapClient.endTransaction();??
  • ????????????????}?catch?(SQLException?e)?{??
  • ?????????????????????????e.printStackTrace();??
  • ?????????????????????}??
  • ????}????
  • }??

  • replyList是一個List,要把這個List插入到數(shù)據(jù)庫,就需要經(jīng)過這三個步驟:?
  • 開始批處理 startBatch()
  • 插入????? insert()
  • 執(zhí)行批處理 executeBatch()

  • 如果要在Spring+iBatis中進行批處理實現(xiàn),需要注意使用同一個sqlMapClient!同時,將提交事務的工作交給Spring統(tǒng)一處理!?

    3.基于事務的Spring+iBatis實現(xiàn)?
    Java代碼?
  • public?void?create(List<Reply>?replyList)?{??
  • ????if?(!CollectionUtils.isEmpty(replyList))?{??
  • ????????//?注意使用同一個SqlMapClient會話??
  • ????????SqlMapClient?sqlMapClient?=?sqlMapClientTemplate.getSqlMapClient();??
  • ??
  • ????????try?{??
  • ????????????//?開始事務??
  • ????????????sqlMapClient.startTransaction();??
  • ????????????//?開始批處理??
  • ????????????sqlMapClient.startBatch();??
  • ????????????for?(Reply?reply?:?replyList)?{??
  • ????????????????//?插入操作??
  • ????????????????sqlMapClient.insert("Reply.create",?reply);??
  • ????????????}??
  • ??
  • ????????????//?執(zhí)行批處理??
  • ????????????sqlMapClient.executeBatch();??
  • ????????????//?提交事務?交給Spring統(tǒng)一控制??
  • ????????????//?sqlMapClient.commitTransaction();??
  • ??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?finally?{????
  • ?????????????????try?{??
  • ????????????????//?結束事務??
  • ????????????????sqlMapClient.endTransaction();??
  • ????????????????????}?catch?(SQLException?e)?{??
  • ?????????????????????????????e.printStackTrace();??
  • ?????????????????????????}??
  • ????????}????
  • ????}??
  • }??

  • 注意使用同一個sqlMapClient:?
    SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();?
    如果直接sqlMapClientTemplate執(zhí)行insert()方法,將會造成異常!?

    想想,還有什么問題?其實問題很明顯,雖然解決了批處理實現(xiàn)的問題,卻造成了事務代碼入侵的新問題。?這么做,有點惡心!?
    除此之外,異常的處理也很惡心,不能夠簡單的包裝為 DataAccessException 就無法被Spring當作統(tǒng)一的數(shù)據(jù)庫操作異常做處理。?


    4.基于回調方式的Spring+iBatis實現(xiàn)?
    如果觀察過Spring的源代碼,你一定知道,Spring為了保持事務統(tǒng)一控制,在實現(xiàn)ORM框架時通常都采用了回調模式,從而避免了事務代碼入侵的可能!?
    修改后的代碼如下:?
    Java代碼?
  • @SuppressWarnings("unchecked")??
  • public?void?create(final?List<Reply>?replyList)?{??
  • ????//?執(zhí)行回調??
  • ????sqlMapClientTemplate.execute(new?SqlMapClientCallback()?{??
  • ????????//?實現(xiàn)回調接口??
  • ????????public?Object?doInSqlMapClient(SqlMapExecutor?executor)??
  • ????????????????throws?SQLException?{??
  • ????????????//?開始批處理??
  • ????????????executor.startBatch();??
  • ????????????for?(Reply?reply?:?replyList)?{??
  • ????????????????//?插入操作??
  • ????????????????executor.insert("Reply.create",?reply);??
  • ??
  • ????????????}??
  • ????????????//?執(zhí)行批處理??
  • ????????????executor.executeBatch();??
  • ??
  • ????????????return?null;??
  • ??
  • ????????}??
  • ????});??
  • ??
  • }??

  • 注意,待遍歷的參數(shù)replyList需要加入final標識!即,待遍歷對象不能修改!?
    引用public void create(final List<Reply> replyList)
    這樣做,就將事務處理的控制權完全交給了Spring!?
    簡述:?
  • SqlMapClientCallback 回調接口
  • doInSqlMapClient(SqlMapExecutor executor) 回調實現(xiàn)方法
  • DataAccessException 最終可能拋出的異常

  • 通過上述修改,最終能夠解決第三種實現(xiàn)方式中的種種不足!?

    Spring對iBatis提供的支持還是不夠完善,即便是現(xiàn)在最新的Spring3.0.4。最開始,本打算用Spring3.0+iBatis3.0,結果Spring報錯,說找不到“com.ibatis.xxxxx”完全是iBatis2.x的包路徑!汗顏~?還是Hibernate比較得寵!?

    轉載于:https://www.cnblogs.com/sunwei2012/archive/2010/11/26/1888497.html

    總結

    以上是生活随笔為你收集整理的iBatis整理——iBatis批处理实现(Spring环境)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。