Ibatis學習總結5--動態 Mapped Statement

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

直接使用JDBC一個非常普遍的問題是動態SQL。使用參數值、參數本身和數據列都是動態的SQL,通常非常困難。典型的解決方法是,使用一系列if-else條件語句和一連串討厭的字元串連接。對於這個問題,SQLMapAPI使用和mappedstatement非常相似的結構,提供了較為優雅的方法。這裡是一個...


直接使用 JDBC 一個非常普遍的問題是動態 SQL。使用參數值、參數本身和數據列都 是動態的 SQL,通常非常困難。典型的解決方法是,使用一系列 if-else 條件語句和一連串 討厭的字元串連接。對於這個問題,SQL Map API 使用和 mapped statement 非常相似的結構, 提供了較為優雅的方法。這裡是一個簡單的例子:

1 <select id="dynamicGetAccountList" cacheModel="account-cache" resultMap="account-result" >
2 select * from ACCOUNT
3 <isGreaterThan prepend="and" property="id" compareValue="0">
4 where ACC_ID = #id#
5 </isGreaterThan>
6 order by ACC_LAST_NAME
7 </select>

在更複雜的例子中,動態 Mapped Statement 的用處更明顯。如下麵比較複雜的例子:

 1 <statement id="someName" resultMap="account-result" >
 2 select * from ACCOUNT
 3 <dynamic prepend="where">
 4 <isGreaterThan prepend="and" property="id" compareValue="0"> ACC_ID = #id#
 5 </isGreaterThan>
 6 <isNotNull prepend=”and" property="lastName"> ACC_LAST_NAME = #lastName#
 7 </isNotNull>
 8 </dynamic>
 9 order by ACC_LAST_NAME
10 </statement>

上面的例子中,<dynamic>元素劃分出 SQL 語句的動態部分。動態部分可以包含任意多 的條件標簽元素,條件標簽決定是否在語句中包含其中的 SQL 代碼。所有的條件標簽元素 將根據傳給動態查詢 Statement  的參數對象的情況來工作。<dynamic>元素和條件元素都有 “prepend”屬性,它是動態 SQL 代碼的一部分,在必要情況下,可以被父元素的“prepend” 屬性覆蓋。上面的例子中,prepend 屬性“where”將覆蓋第一個為“真”的條件元素。這對 於確保生成正確的 SQL 語句是有必要的。例如,在第一個為“真”的條件元素中,“AND” 是不需要的,事實上,加上它肯定會出錯。以下小節討論不同的條件元素,包括二元條件元 素,一元條件元素和其他動態元素。

二元條件元素

二元條件元素將一個屬性值和一個靜態值或另一個屬性值比較,如果條件為“真”,元 素體的內容將被包括在查詢 SQL 語句中。

二元條件元素的屬性:

prepend  - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)

property - 被比較的屬性(必選)

compareProperty  - 另一個用於和前者比較的屬性(必選或選擇 compareValue)  

compareValue - 用於比較的值(必選或選擇 compareProperty)

<isEqual>

比較屬性值和靜態值或另一個屬性值是否相等。

<isNotEqual>

比較屬性值和靜態值或另一個屬性值是否不相等。

<isGreaterThan>

 比較屬性值是否大於靜態值或另一個屬性值。
 

<isGreaterEqual>

 

比較屬性值是否大於等於靜態值或另一個屬性值。

<isLessThan>

比較屬性值是否小於靜態值或另一個屬性值。

<isLessEqual>

比較屬性值是否小於等於靜態值或另一個屬性值。

例子:

 

<isLessEqual prepend=”AND” property=”age” compareValue=”18”> ADOLESCENT = ‘TRUE’

</isLessEqual>

一元條件元素

一元條件元素檢查屬性的狀態是否符合特定的條件。

* 一元條件元素的屬性:

prepend  - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)

property - 被比較的屬性(必選)

<isPropertyAvailable>

檢查是否存在該屬性(存在 parameter bean 的屬性)。

<isNotPropertyAvailable>

檢查是否不存在該屬性(不存在 parameter bean 的屬性)。

<isNull>

檢查屬性是否為 null。

<isNotNull>

檢查屬性是否不為 null。

<isEmpty>

檢查 Collection.size()的值,屬性的 String 或 String.valueOf()值,

是否為 null 或空(“”或 size() < 1)。

<isNotEmpty>

檢查 Collection.size()的值,屬性的 String 或 String.valueOf()值,

是否不為 null 或不為空(“”或 size() > 0)。 例子:

<isNotEmpty prepend=”AND” property=”firstName” > FIRST_NAME=#firstName#

</isNotEmpty>

其他元素

* Parameter Present:這些元素檢查參數對象是否存在。

Parameter Present 的屬性:

prepend  - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)

<isParameterPresent>

檢查是否存在參數對象(不為 null)。

<isNotParameterPresent>

檢查是否不存在參數對象(參數對象為 null)。

例子:

 

<isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’

</isNotParameterPresent>

* Iterate:這屬性遍歷整個集合,併為 List 集合中的元素重覆元素體的內容。

Iterate 的屬性:

prepend  - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)

property - 類型為 java.util.List 的用於遍歷的元素(必選)

open  - 整個遍歷內容體開始的字元串,用於定義括弧(可選)

close  -整個遍歷內容體結束的字元串,用於定義括弧(可選)

conjunction  - 每次遍歷內容之間的字元串,用於定義 AND 或 OR(可選)

<iterate>

遍歷類型為 java.util.List 的元素。 例子:

<iterate prepend=”AND” property=”userNameList”

open=”(” close=”)” conjunction=”OR”>

username=#userNameList[]#

</iterate>

註意:使用<iterate>時,在List元素名後麵包括方括弧[]非常重要,方括弧[]將 對象標記為List,以防解析器簡單地將List輸出成String。

 

簡單的動態SQL元素

雖然動態 Mapped Statement API 功能強大,但有時僅需要一小部分的動態 SQL 即可。 為此,SQL statement 和 statement 都可以包含簡單的動態 SQL 元素,以幫助實現動態的 order by 子句,動態的查詢欄位或 SQL 語句的其他動態部分。簡單動態 SQL 元素的概念有點象 inline parameter 的映射,但使用了稍微不同的語法。考慮下麵的例子:

1 <statement id=”getProduct” resultMap=”get-product-result”>
2 select * from PRODUCT order by $preferredOrder$
3 </statement>

preferredOrder 動態元素將被參數對象的 preferredOrder 屬性值替換(象 parameter  map 一樣)。不同的是,它從根本上改變了 SQL 語句本身,比僅僅簡單地改變參 數值嚴重得多。在這樣的動態 SQL 語句中,錯誤可能會引起安全,性能和穩定性的風險。 因此,應細心檢查,以確保簡單動態 SQL 元素使用的正確。另外,還要留意您的設計,以 防資料庫細節對業務邏輯對象模型造成不好的影響。

單動態元素可以包含在<dynamic-mapped-statement>中,當要修改 SQL 語句本身時它能派上用場。例如:

1 <statement id=”getProduct” resultMap=”get-product-result”> SELECT * FROM PRODUCT
2 <dynamic prepend=”WHERE”>
3 <isNotEmpty property=”description”> PRD_DESCRIPTION $operator$ #description#
4 </isNotEmpty>
5 </dynamic>
6 </statement>

上面的例子中,參數對象的 operator 屬性將用於替代符號$operator$。因此,假如 operator屬性等於“like”,description 屬性等於“%dog%”,生成的 SQL 語句如下:

SELECT * FROM PRODUCT WHERE PRD_DESCRIPTION LIKE ‘%dog%’;


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

-Advertisement-
Play Games
更多相關文章
  • 根據學習和工作中的理解,採用MVC設計模式,設計了兩種模式。第一種採用了抽象工廠、命令模式、組合模式等,面向介面編程,支持單一和組合操作,具有撤銷(Undo)和重做(Redo)功能。第二種模式對第一種做了簡化,主要針對資料庫操作,支持共用資料庫連接和靈活的搜索條件。
  • OSGI框架為Java定義了一個動態模塊化系統,它使你可以更好地控制代碼結構,動態管理代碼的生命周期,並且提供了代碼寫作的松耦合方式;更值得稱道的是,它的規範文檔描述詳盡。--《OSGI實戰》OSGI分層架構服務層關註於模塊,特別是模塊內的組件間的交互和通信。生命周期層關註於提供執行時模塊管理和對底...
  • 在資料庫中存儲時,使用 Bytes 更精確,可擴展性和靈活性都很高。輸出時,需要做一些適配。1. 註意事項與測試代碼需要考慮sizeInBytes為 None 的場景。除以 1024.0 而非 1024,避免丟失精度。實現的函數為getSizeInMb(sizeInBytes),通用的測試代碼為de...
  • 原文:http://dason.blog.51cto.com/658897/505312Apache虛擬主機配置(多個功能變數名稱訪問多個目錄)為了方便管理虛擬主機,我決定使用一種方法,那就是修改httpd-vhosts.conf文件。第一步首先要使擴展文件httpd-vhosts.conf生效:1. 打開...
  • 原文:http://www.cnblogs.com/weiquxiong/p/3545564.html註:對靜態函數或靜態成員的調用方式不做分析;以下提到的測試環境為vc6.0;調試程式時看到這樣的代碼:1 pObj->ClassName::Function();開始不理解為什麼要在“->”後加上類...
  • 剛剛開始學習Python,第一個編寫的程式。import osuser_file = open('use_file.txt', 'r')user_list = user_file.readlines()user_file.close()while True: lock_file = open(...
  • 本人小白菜逼一枚,,,,剛建立博客,也寫不了太深入的,就寫點上課的筆記什麼的。有錯誤希望廣大博友指出,我一定虛心學習接收改正。我的新浪郵箱:[email protected]我的QQ郵箱:[email protected]電腦網路部分今天主講的tcp和udp協議,這兩協議都是數據鏈路層下...
  • OK!第一篇博文!自賀一下!今日看了此書的前幾頁。嗯,說得挺全,基礎易懂。之前學過c++,但沒用過命令行編譯。本人用的VS里的編譯器,文件名是cl.exe,在VC目錄下。雖然有了編譯器,但並不能直接使用,要配置環境變數。寫個批處理文件,在裡面寫環境變數設置的代碼就行了,如下:@set PATH=D....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...