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

來源:互聯網
上載者:User

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

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

1 <select id="dynamicGetAccountList" cacheModel="account-cache" resultMap="account-result" >2 select * from ACCOUNT3 <isGreaterThan prepend="and" property="id" compareValue="0">4 where ACC_ID = #id#5 </isGreaterThan>6 order by ACC_LAST_NAME7 </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_NAME10 </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 PRODUCT2 <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%’;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.