ibatis動態mapped Statement 配置詳解

來源:互聯網
上載者:User

 動態 Mapped Statement
直接使用 JDBC 一個非常普遍的問題是動態 SQL。使用參數值、參數本身和資料列都
是動態 SQL,通常非常困難。典型的解決方案是,使用一系列 if-else 條件陳述式和一連串
討厭的字串串連。對於這個問題,SQL Map API使用和 mapped statement非常相似的結構,
提供了較為優雅的方法。這裡是一個簡單的例子:
<select id="dynamicGetAccountList"
cacheModel="account-cache"
resultMap="account-result" >
select * from ACCOUNT
<isGreaterThan prepend="and" property="id" compareValue="0">
where ACC_ID = #id#
</isGreaterThan>
order by ACC_LAST_NAME
</select>
 
上面的例子中,根據參數 bean“id”屬性的不同情況,可建立兩個可能的語句。如果參
數“id”大於 0,將建立下面的語句:
select * from ACCOUNT where ACC_ID = ?
或者,如果“id”參數小於等於 0,將建立下面的語句:
select * from ACCOUNT
在更複雜的例子中,動態 Mapped Statement 的用處更明顯。如下面比較複雜的例子:
<statement id="dynamicGetAccountList" resultMap="account-result" >

select * from ACCOUNT
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="firstName">
(ACC_FIRST_NAME = #firstName#
<isNotNull prepend="OR" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
)
</isNotNull>
<isNotNull prepend="AND" property="emailAddress">
ACC_EMAIL like #emailAddress#
</isNotNull>
<isGreaterThan prepend="AND" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
</dynamic>
order by ACC_LAST_NAME

</statement>
根據不同的條件,上面動態語句可以產生 16 條不同的查詢語句。使用 if-else 結構和
字串,會產生上百行很亂的代碼。
而使用動態 Statement,和在 SQL 的動態部位周圍插入條件標籤一樣容易。例如:
<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</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  - 被比較的屬性(必選)

檢查是否存在該屬性(存在 parameter bean 的屬性)。
<isPropertyAvailable>
檢查是否不存在該屬性(不存在 parameter bean 的屬性)。
<isNotPropertyAvailable>
檢查屬性是否為 null。
<isNull>
檢查屬性是否不為 null。
<isNotNull>
檢查 Collection.size()的值,屬性的 String 或 String.valueOf()值,
<isEmpty>
是否為 null或空(“”或size() < 1)。
檢查 Collection.size()的值,屬性的 String 或 String.valueOf()值,
<isNotEmpty>
是否不為 null 或不為空白(“”或 size() > 0)。
例子:
<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>
 
 
其他元素  Parameter Present:這些元素檢查參數對象是否存在。
Parameter Present的屬性:
prepend  - 可被覆蓋的 SQL 陳述式組成部分,添加在語句的前面(可選)
檢查是否存在參數對象(不為 null)。
<isParameterPresent>
檢查是否不存在參數對象(參數對象為 null)。
<isNotParameterPresent>
例子:
<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>
  Iterate:這屬性遍曆整個集合,並為 List 集合中的元素重複元素體的內容。
Iterate 的屬性:
prepend  - 可被覆蓋的 SQL 陳述式組成部分,添加在語句的前面(可選)
property  - 類型為 java.util.List 的用於遍曆的元素(必選)
open  -  整個遍曆內容體開始的字串,用於定義括弧(可選)
close  -整個遍曆內容體結束的字串,用於定義括弧(可選)
conjunction -  每次遍曆內容之間的字串,用於定義 AND 或 OR(可選)
遍曆類型為 java.util.List的元素。
<iterate>
例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]#
</iterate>
 
 
注意:使用<iterate>時,在List元素名後麵包括方括弧[]非常重要,方括弧[]將
對象標記為List,以防解析器簡單地將List輸出成String。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.