Ibatis學習總結6--使用 SQL Map API 編程

来源:http://www.cnblogs.com/lcngu/archive/2016/01/11/5111743.html
-Advertisement-
Play Games

SQLMapAPI力求簡潔。它為程式員提供4種功能:配置一個SQLMap,執行SQLupdate操作,執行查詢語句以取得一個對象,以及執行查詢語句以取得一個對象的List。配置SQLMap一旦您創建了SQLMapXML定義文件和SQLMap配置文件,配置SQLMap就是一件極其簡單的事情。SQLMa...


SQL Map API 力求簡潔。它為程式員提供 4 種功能:配置一個 SQL Map,執行 SQL update操作,執行查詢語句以取得一個對象,以及執行查詢語句以取得一個對象的 List。

  • 配置 SQL Map

一旦您創建了 SQL Map XML 定義文件和 SQL Map 配置文件,配置 SQL Map 就是一件 極其簡單的事情。SQL Map 使用 XmlSqlMapClientBuilder 來創建。這個類有一個靜態方法 叫 buildSqlMap。方法 buildSqlMap 簡單地用一個 Reader 對象為參數,讀入 sqlMap-config.xml 文件(不必是這個文件名)的內容。

1 String resource = “com/ibatis/example/sqlMap-config.xml”; 
2 Reader reader = Resources.getResourceAsReader (resource); 
3 SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);
  • 事務處理

    預設情況下 ,調用 SqlMapClient  對象的任 意 executeXxxx() 方法將 預設地自 動 COMMIT/ROLLBACK。這意味著每次調用 executeXxxx()方法都是一個獨立的事務。這確實 很簡單,但對於需要在同一個事務中執行多個語句的情況(即只能同時成功或失敗),並不 適用。這正是事務處理要關心的事情。

    如果您在使用 Global Transaction(在 SQL Map 配置文件中設置),您可以使用自動提交 並且可以得到在同一事務中執行的效果。但為了提高性能,最好是明確地劃分事務的範圍, 因為這樣做可以減少連接池的通訊流量和資料庫連接的初始化。

    SqlMapClient 對象擁有讓您定義事務範圍的方法。使用下麵 SqlMapClient 類的方法,可 以開始、提交和/或回退事務:

    1 public void startTransaction () throws SQLException 
     public void commitTransaction () throws SQLException
    public void endTransaction () throws SQLException

    開始一個事務,意味著您從連接池中得到一個連接,打開它並執行查詢和更新 SQL 操 作。使用事務處理的例子如下:

     1 private Reader reader = new Resources.getResourceAsReader( "com/ibatis/example/sqlMapconfig.xml");
     2 private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
     3 public updateItemDescription (String itemId, String newDescription) throws SQLException {
     4 try {
     5 sqlMap.startTransaction ();
     6 Item item = (Item) sqlMap.queryForObject ("getItem", itemId);
     7 item.setDescription (newDescription); sqlMap.update ("updateItem", item); sqlMap.commitTransaction ();
     8 } finally {
     9 
    10 sqlMap.endTransaction ();
    11 
    12 }
    13 
    14 }

    註意!事務不能嵌套。在調用 commit()或 rollback()之前,從同     一線程多次調用.startTransaction,將引起拋出例外。換句話說,對於每個 SqlMap 實例,每個線程最多只能打開一個事務。

    註意!SqlMapClient 事務處理使用 Java 的 ThreadLocal 保存事務對象。這意味著在處理 事務時,每個調用 startTransaction()的線程,將得到一個唯一的 Connection 對象。將一個 Connection  對象返回數據源(或關閉連接)唯一的方法是調用 commitTransaction()或 rollbackTransaction()方法。否則,會用光連接池中的連接並導致死鎖。

  • 自動的事務處理

    雖然極力推薦使用明確劃分的事務範圍,在簡單需求(通常使只讀)的情況下,可以使 用簡化的語法。如果您沒有使用 startTransaction(),commitTransation()和 rollbackTransaction()方法來明確地劃分事務範圍,事務將會自動執行。例如:

     1 private Reader reader = new Resources.getResourceAsReader
     2 
     3 ("com/ibatis/example/sqlMapconfig.xml");
     4 
     5 private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
     6 
     7 public updateItemDescription (String itemId, String newDescription) throws SQLException {
     8 
     9 try {
    10 
    11 Item item = (Item) sqlMap.queryForObject ("getItem", itemId);
    12 
    13 item.setDescription (“TX1”);
    14 
    15 //No transaction demarcated, so transaction will be automatic (implied)
    16 
    17 sqlMap.update ("updateItem", item); item.setDescription (newDescription); item.setDescription (“TX2”);
    18 //No transaction demarcated, so transaction will be automatic (implied)
    19 
    20 sqlMap.update("updateItem", item);
    21 
    22 
    23 
    24 } catch (SQLException e) {
    25 
    26 throw (SQLException) e.fillInStackTrace();
    27 
    28 }
    29 
    30 }

    註意!使用自動事務處理要非常小心。雖然看起來很有吸引力,但如果有多個數據更新操作要在同一事務中處理時,您會遇到麻煩。在上面的例子中,如果第二個“updateItem”操作失敗,第一個“updateItem”操作仍然會執行,description 會更新成“TX1”。

  • 全局(分散式)事務

    SQL Map 框架支持全局事務。全局事務也叫分散式事務,它可以允許您在同一事務中 更新多個資料庫(或其他符合 JTA 規範的資源),即同時成功或失敗。

    * External/Programmatic Global  事務

    您可以選擇外部管理或手工編程管理全局事務,或實現一個象 EJB 一樣的架構。使用 EJB,您可以通過使用 EJB 的描述文件定義事務範圍。要支 持外部管理或手工編程管理全局事務,必須在 SQL Map 配置文件中(參見前面章節的內容) 設定<transactionManager>的 type 屬性為 EXTERNAL。使用外部管理的全局事務,SQL Map 事務控制方法變得有的多餘,因為事務的開始、提交和回退都由外部的事務管理器來控制。 但是,使用 SqlMapClient 的 startTransaction(),commitTransaction()或 rollbackTransaction()來劃分事務範圍(相對於自動的事務處理),還是對提高性能有幫助。繼續使用這些方 法,可以保持編程規範的一致性。另一個好處是,在某些情況下,您可能需要改變關閉資源 的順序(不幸的是,不同的應用伺服器和事務管理器具有不同的規則)。除了這些考慮,要 使用全局事務,不需要改變您的 SQL Map 代碼。

    * 受管理的(Managed)全局事務

    SQL Map 框架也可以為您管理全局事務。要支持受管理的全局事務,必須在 SQL Map 配置文件中設定<transactionManager>的 type 屬性為 JTA,並設定“UserTransaction”屬性為 JNDI 的全名,以使 SqlMapClient 實例能找到 UserTransaction 對象。

    使用全局事務編程,代碼沒有多大的不同,但有幾個小小的地方要註意。例如:

     1 try {
     2 
     3 orderSqlMap.startTransaction(); storeSqlMap.startTransaction(); orderSqlMap.insertOrder(…); orderSqlMap.updateQuantity(…);
     4 
     5 storeSqlMap.commitTransaction();
     6 
     7 orderSqlMap.commitTransaction();
     8 
     9 } finally {
    10 
    11 try {
    12 
    13 storeSqlMap.endTransaction()
    14 
    15 } finally {
    16 
    17 orderSqlMap.endTransaction()
    18 
    19 }
    20 
    21 }

    上面的例子中,假設我們通過兩個 SqlMapClient 來使用兩個不同的資料庫。第一個開始事務的 SqlMapClient(orderSqlMap)同時也開始了一個全局事務。在這之後,所有其他的操作將被看作是這個全局事務的一部分,直到同一個 SqlMapClient(orderSqlMap)調用 commitTransaction()或 rollbackTransaction(),屆時全局事務被提交並完成其他所有的操 作。

    警告!雖然這些看起來很簡單,但記住不要濫用全局(分散式)事務,這點很重要。這 樣做既有性能方面的考慮,同時也是因為全局事務會讓應用伺服器和資料庫驅動程式的設置 變得更複雜。雖然看起來簡單,您可能還是會遇到一些困難。

  • 批處理

    如果要執行很多非查詢(insert/update/delete)的語句,您可能喜歡將它們作為一個批處 理來執行,以減少網路通訊流量,並讓 JDBC Driver 進行優化(例如壓縮)。SQL Map API 使用批處理很簡單,可以使用兩個簡單的方法劃分批處理的邊界:

    1 sqlMap.startBatch();
    2 //…execute statements in between 
    3 sqlMap.executeBatch();

    當調用 endBatch()方法時,所有的批處理語句將通過 JDBC Driver 來執行。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • div垂直水平居中代碼實例:本章節分享一段代碼實例,它演示瞭如何讓div實現全屏垂直水平居中和指定元素的內容垂直水平居中。代碼實例如下:螞蟻部落 以上代碼實現了我們的要求,能夠實現居中效果,代碼比較簡單,就是基本的邏輯問題。原文地址是:http://www.softwhy.com/forum.ph....
  • jquery如何阻止子元素相應mouseout事件:mouseout有一個特點,當滑鼠移入子元素的時候,也會觸發此事件,但是在實際應用中這個特點往往不是我們想要的,下麵就通過代碼實例介紹一下如何實現此效果,代碼實例如下:螞蟻部落 以上代碼實現了我們的要求,當滑鼠指針移入子div的時候,不會觸發事件....
  • javascript中字元串和數組的相互轉換:字元串和數組的相互轉換操作是非常的重要的,因為在實際編碼過程中會經常用到,所以這是必須要掌握的知識點,當然這個知識點並不難,知道了就永遠知道了,並不是那種需要充分實踐才能夠掌握的東西,下麵就做一下簡單的介紹。一.字元串轉換為數組:此操作會用到split(...
  • 如何實現文本框和驗證碼圖片對齊:在預設情況下,如果文本框和圖片在同一個元素中的話,不能夠實現垂直對齊,比如驗證碼功能,左邊是文本框,右邊是驗證碼圖片,如果不加控制它們是不能夠對齊的,下麵就通過代碼實例介紹一下如何實現文本框和圖片的對齊效果。代碼如下:螞蟻部落以上代碼實現了我們的要求,不過IE6和IE...
  • = 2038) { $year = date ( 'Y' ); } } else { if ($year 12) { $month = date ( 'm' ); } //上一年 ...
  • // ReadSqlConsole.cpp: 主項目文件。#include "stdafx.h"#include #include#include//for setw()#include"windows.h"#import "C:\Program Files\Common Files\System\...
  • 出處:http://www.cnblogs.com/tangyanbo/1. 編碼基礎知識1.1 編碼ISO-8859-1編碼是單位元組編碼,向下相容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字元,0xA0-0xFF之間是文字元...
  • #include #include #include#define MAXNUM 200int Isood(int n);using namespace std;int main(void){ int n; cout>n; int *p; p=(int *)mallo...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...