日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转:ibatis动态sql

發布時間:2024/9/27 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:ibatis动态sql 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
 直接使用JDBC一個非常普遍的問題就是動態SQL。使用參數值、參數本身和數據列都是動態SQL,通常是非常困難的。典型的解決辦法就是用上一堆的IF-ELSE條件語句和一連串的字符串連接。對于這個問題,Ibatis提供了一套標準的相對比較清晰的方法來解決一個問題,這里有個簡單的例子:

???? <select id="getUserList" resultMap="user">

???????? select * from user

??????????? <isGreaterThan prepend="and" property="id" compareValue="0">

?????????????????? where user_id = #userId#

??????????? </isGreaterThan>

?????????????order by createTime desc

??? </select>

???? 上面的例子中,根據參數bean“id”屬性的不同情況,可創建兩個可能的語句。如果參數“id”大于0,將創建下面的語句:

????? select * from user where user_id = ???order by createTime desc

???? 或者,如果“id”參數小于等于0,將創建下面的語句:
????? select * from user??order by createTime desc

?以上的這個例子是否可以看出Ibatis里提供的簡單的寫法來實現了復雜拖沓的動態SQL呢?我們在做查詢的時候,對于同一個表,甚至可以用來定義一個動態SQL,做到重用的地步,還是上面那個例子:

<sql id="queryCondition">

???? <dynamic prepend="WHERE">

??????????? <isGreaterThan prepend="and" property="id" compareValue="0">

?????????????????? where user_id = #userId#

??????????? </isGreaterThan>

?? </dynamic>

</sql>

<select id="getUserList" resultMap="user">

???????? select * from user

??????? <!--?引入動態的查詢條件 -->

???????? <include refid="queryCondition"/>

??????????order by createTime desc

??? </select>

????? 這個使用的話是否更加的具有公用性能,這就是Ibatis帶來的便利。

????? 在Ibatis中,動態的條件元素包含一下幾種:二元條件元素、一元條件元素和其他條件元素:

??????(1)、二元條件元素:將一個屬性值和靜態值或另一個屬性值比較,如果條件為真,元素將被包容在查詢SQL語句中。

??????????? 二元條件元素的屬性:

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

???????????? property——是比較的屬性(必選)

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

???????????? compareValue——用于比較的值(必選或選擇compareProperty)

?<isEqual>?比較屬性值和靜態值或另一個屬性值是否相等。
?<isNotEqual>?比較屬性值和靜態值或另一個屬性值是否不相等。
?<isGreaterThan>?比較屬性值是否大于靜態值或另一個屬性值。
?<isGreaterEqual>?比較屬性值是否大于等于靜態值或另一個屬性值。
?<isLessThan>?比較屬性值是否小于靜態值或另一個屬性值。
?<isLessEqual>

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

舉個小例子:

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

??? 如果大于等18歲時,則為成年人

?? (2)、一元條件元素:一元條件元素檢查屬性的狀態是否符合特定的條件。

???? 一元條件元素的屬性:

????? 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>

?? (3)、其他元素條件

???????? (a).Parameter Present:這些元素檢查參數對象是否存在

???????? Parameter Present條件的屬性

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

?<isParameterPresent>?檢查是否存在參數對象(不為null)
?<isNotParameterPresent>?例子:
<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>

??? (b)、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。?

???? 以上講述了關于Ibatis的動態SQL的功能,是否覺得非常強大,并且優雅呢?那還猶豫什么呢?行動起來。

總結

以上是生活随笔為你收集整理的转:ibatis动态sql的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。