<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    176142998

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks
    從4個(gè)層面分析這部分實(shí)現(xiàn): 
    1. iBatis的基本實(shí)現(xiàn)
    2. 基于事務(wù)的iBatis的基本實(shí)現(xiàn)
    3. 基于事務(wù)的Spring+iBatis實(shí)現(xiàn)
    4. 基于回調(diào)方式的Spring+iBatis實(shí)現(xiàn)

    1.iBatis的基本實(shí)現(xiàn)

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

    代碼如下:
    Java代碼 復(fù)制代碼 收藏代碼
    1. public void create(List<Reply> replyList) {   
    2.   
    3.     try {   
    4.         // 開始批處理   
    5.         sqlMapClient.startBatch();   
    6.   
    7.         for (Reply reply: replyList) {   
    8.             // 插入操作   
    9.             sqlMapClient.insert("Reply.create", reply);   
    10.         }   
    11.         // 執(zhí)行批處理   
    12.         sqlMapClient.executeBatch();   
    13.   
    14.     } catch (Exception e) {   
    15.         e.printStackTrace();   
    16.     }   
    17. }  

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

    2.基于事務(wù)的iBatis的基本實(shí)現(xiàn)
    事務(wù)處理:
    1. startTransaction() 開始事務(wù)
    2. commitTransaction() 提交事務(wù)
    3. endTransaction() 結(jié)束事務(wù)


    我們以insert操作為例,把它們結(jié)合到一起:
    Java代碼 復(fù)制代碼 收藏代碼
    1. public void create(List<Reply> replyList) {   
    2.   
    3.     try {   
    4.         // 開始事務(wù)   
    5.         sqlMapClient.startTransaction();   
    6.         // 開始批處理   
    7.         sqlMapClient.startBatch();   
    8.   
    9.         for (Reply reply: replyList) {   
    10.             // 插入操作   
    11.             sqlMapClient.insert("Reply.create", reply);   
    12.         }   
    13.         // 執(zhí)行批處理   
    14.         sqlMapClient.executeBatch();   
    15.   
    16.         // 提交事務(wù)   
    17.         sqlMapClient.commitTransaction();   
    18.   
    19.     } catch (Exception e) {   
    20.         e.printStackTrace();   
    21.     } finally {     
    22.              try {   
    23.             // 結(jié)束事務(wù)   
    24.             sqlMapClient.endTransaction();   
    25.                 } catch (SQLException e) {   
    26.                          e.printStackTrace();   
    27.                      }   
    28.     }     
    29. }  

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

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

    3.基于事務(wù)的Spring+iBatis實(shí)現(xiàn)
    Java代碼 復(fù)制代碼 收藏代碼
    1. public void create(List<Reply> replyList) {   
    2.     if (!CollectionUtils.isEmpty(replyList)) {   
    3.         // 注意使用同一個(gè)SqlMapClient會(huì)話   
    4.         SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();   
    5.   
    6.         try {   
    7.             // 開始事務(wù)   
    8.             sqlMapClient.startTransaction();   
    9.             // 開始批處理   
    10.             sqlMapClient.startBatch();   
    11.             for (Reply reply : replyList) {   
    12.                 // 插入操作   
    13.                 sqlMapClient.insert("Reply.create", reply);   
    14.             }   
    15.   
    16.             // 執(zhí)行批處理   
    17.             sqlMapClient.executeBatch();   
    18.             // 提交事務(wù) 交給Spring統(tǒng)一控制   
    19.             // sqlMapClient.commitTransaction();   
    20.   
    21.         } catch (Exception e) {   
    22.             e.printStackTrace();   
    23.         } finally {     
    24.                  try {   
    25.                 // 結(jié)束事務(wù)   
    26.                 sqlMapClient.endTransaction();   
    27.                     } catch (SQLException e) {   
    28.                              e.printStackTrace();   
    29.                          }   
    30.         }     
    31.     }   
    32. }  

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

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


    4.基于回調(diào)方式的Spring+iBatis實(shí)現(xiàn)
    如果觀察過Spring的源代碼,你一定知道,Spring為了保持事務(wù)統(tǒng)一控制,在實(shí)現(xiàn)ORM框架時(shí)通常都采用了回調(diào)模式,從而避免了事務(wù)代碼入侵的可能!
    修改后的代碼如下:
    Java代碼 復(fù)制代碼 收藏代碼
    1. @SuppressWarnings("unchecked")   
    2. public void create(final List<Reply> replyList) {   
    3.     // 執(zhí)行回調(diào)   
    4.     sqlMapClientTemplate.execute(new SqlMapClientCallback() {   
    5.         // 實(shí)現(xiàn)回調(diào)接口   
    6.         public Object doInSqlMapClient(SqlMapExecutor executor)   
    7.                 throws SQLException {   
    8.             // 開始批處理   
    9.             executor.startBatch();   
    10.             for (Reply reply : replyList) {   
    11.                 // 插入操作   
    12.                 executor.insert("Reply.create", reply);   
    13.   
    14.             }   
    15.             // 執(zhí)行批處理   
    16.             executor.executeBatch();   
    17.   
    18.             return null;   
    19.   
    20.         }   
    21.     });   
    22.   
    23. }  

    注意,待遍歷的參數(shù)replyList需要加入final標(biāo)識(shí)!即,待遍歷對(duì)象不能修改!
    引用
    public void create(final List<Reply> replyList)

    這樣做,就將事務(wù)處理的控制權(quán)完全交給了Spring!
    簡(jiǎn)述:
    1. SqlMapClientCallback 回調(diào)接口
    2. doInSqlMapClient(SqlMapExecutor executor) 回調(diào)實(shí)現(xiàn)方法
    3. DataAccessException 最終可能拋出的異常
    posted on 2011-04-21 10:15 飛飛 閱讀(961) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日韩免费高清视频| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 国产精彩免费视频| 久久亚洲精品无码aⅴ大香| 亚洲午夜日韩高清一区| 老司机午夜性生免费福利| 国产一精品一aⅴ一免费| 国产成人亚洲综合a∨| 又爽又黄无遮挡高清免费视频| 91在线亚洲综合在线| 国产成人无码精品久久久久免费| 吃奶摸下高潮60分钟免费视频| 污污视频网站免费观看| 久久乐国产精品亚洲综合| 亚洲中文字幕无码亚洲成A人片| 国产91免费在线观看| 亚洲私人无码综合久久网| 全部免费国产潢色一级| 国产精品福利在线观看免费不卡| 亚洲午夜福利717| 国产成人亚洲精品无码AV大片| 亚洲AⅤ优女AV综合久久久| 久久久久亚洲AV无码专区首JN| 免费人成视频在线观看网站| 亚洲免费闲人蜜桃| 在线日本高清免费不卡| 亚洲伊人久久精品| 国产福利免费在线观看| 狠狠躁狠狠爱免费视频无码| 亚洲国产精品不卡在线电影| 久久99久久成人免费播放| 亚洲AV无码久久精品狠狠爱浪潮| 男女啪啪免费体验区| 久久精品国产亚洲| 女人18毛片a级毛片免费视频| 成年免费a级毛片| 免费乱码中文字幕网站| 久久久久久免费一区二区三区| 国产精品久久亚洲不卡动漫| 国产免费的野战视频| 国产亚洲高清在线精品不卡|