IBatis學習總結之動態拼sql


     在編寫SqlMaps的時候,經常需要把一個sql拆分成多個片段。IBatis提供了一個簡單有很實用的分割節點來進行SQL的分割。舉個簡單的例子,假設需要查詢一些學生的信息。

    原來的寫法是:

<!--查詢所有信息-->
<select id="SelectAllCraft" resultMap="StudentMap">
      SELECT
      Id,
      Name,
      Age,
      Address,
      ClassID from Student
 </select>

<!--根據學生編號查詢信息-->
<select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int">>
      SELECT
      Id,
      Name,
      Age,
      Address,
      ClassID from Student
      Where Id=#Value#
 </select>

現在用sql標簽可以這樣寫:

<sql id ="selectAll">
     select Id,
      Name,
      Age,
      Address,
      ClassID,ClassName
      from Student
    </sql>
<!--查詢所有信息-->
<select id="SelectAllCraft" resultMap="StudentMap">
    <include refid ="SelectALL"/>
</select>
<!--根據編號查詢信息-->
<select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int">
    <include refid ="SelectALL"/>
    where id=#Value#
</select>

<include refid ="SelectALL"/> refid:就是指要調用sql標簽的id。

sql標簽就相當於C#里的定義一個字符串,里面存着一些值,可以被其他標簽調用。這樣一來就可以減少重復代碼的書寫。

IBatis動態拼接sql

實例:

<!--動態加載sql語句-->
    <select id ="SelectByWhere" resultMap="StudentMap" resultClass="Hashtable">
      <include refid ="SelectALL"/>
      <include refid="s"></include>
      <dynamic prepend="where">
        <isParameterPresent>
          <isNotEmpty prepend="and" property="Name">
            Name like '%$Name$%'
          </isNotEmpty>
          <isNotEmpty prepend="and" property="Address">
            Address like '%$Address$%'
          </isNotEmpty>
          <isGreaterThan prepend="and" property="ClassID" compareValue="0">
            <!--大於-->
            ClassID=#ClassID#
          </isGreaterThan>
          <isNotEqual prepend="and" property="Age" compareValue="0">
            <!--不等於-->
            Age=#Age#
          </isNotEqual>
        </isParameterPresent>
      </dynamic>
      order by Id $Orderby$ 
    </select>
View Code

動態標簽分類:1<dynamic>,2 二元標簽,3 一元標簽,4 <iterate> 
這四種標簽以及他們的子標簽具有共同的屬性prepend,open,close。

<dynamic>可以去除第一個prepend="and"中的字符(這里為and)從而方便一些操作

一元條件元素的屬性: 
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>   

二元條件元素的屬性: 二元是兩個對象進行比較 
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選) 
property - 被比較的屬性(必選) 
compareProperty - 另一個用於和前者比較的屬性(必選或選擇compareValue) 
    compareValue - 用於比較的值(必選或選擇compareProperty) 

<isEqual>  比較屬性值和靜態值或另一個屬性值是否相等。    
<isNotEqual>  比較屬性值和靜態值或另一個屬性值是否不相等。     
<isGreaterThan>  比較屬性值是否大於靜態值或另一個屬性值。    
<isGreaterEqual>  比較屬性值是否大於等於靜態值或另一個屬性值。    
<isLessThan>  比較屬性值是否小於靜態值或另一個屬性值。     
<isLessEqual>  比較屬性值是否小於等於靜態值或另一個屬性值。 
例子: 
<isLessEqual prepend=”AND” property=”age” compareValue=”18”> 
ADOLESCENT = ‘TRUE’ 
</isLessEqual>

isPropertyAvailableisNotEmpty 的區別
這個兩個屬性非常有用 
isPropertyAvailable:入參有這個屬性 
isNotEmpty:入參的這個屬性不為空 
入參一般是一個封裝了數據的DTO 
如果希望一個屬性無論為何值都符合條件則使用isPropertyAvailable 
如果希望一個屬性只是不為空的時候才符合條件就用isNotEmpty 

<iterate>:這屬性遍歷整個集合,並為List集合中的元素重復元素體的內容。 
Iterate的屬性: 
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選) 
property - 類型為java.util.List的用於遍歷的元素(必選) 
open - 整個遍歷內容體開始的字符串,用於定義括號(可選) 
close -整個遍歷內容體結束的字符串,用於定義括號(可選) 
    conjunction - 每次遍歷內容之間的字符串,用於定義AND或OR(可選) 
例子:
<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”> username=#userNameList[]# </iterate> = and(username=name1 or username=name2...) 

注意:使用<iterate>時,在List元素名后面包括方括號[]非常重要,方括號[]將對象標記為List,以防解析器簡單地將List輸出成String。 
[color=darkred][/color] 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM