<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強(qiáng)

    ibatis動態(tài)mapped Statement 配置詳解

    ?動態(tài) Mapped Statement
    直接使用 JDBC 一個非常普遍的問題是動態(tài) SQL。使用參數(shù)值、參數(shù)本身和數(shù)據(jù)列都
    是動態(tài)的 SQL,通常非常困難。典型的解決方法是,使用一系列 if-else 條件語句和一連串
    討厭的字符串連接。對于這個問題,SQL Map API使用和 mapped statement非常相似的結(jié)構(gòu),
    提供了較為優(yōu)雅的方法。這里是一個簡單的例子:
    <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>
    ?
    上面的例子中,根據(jù)參數(shù) bean“id”屬性的不同情況,可創(chuàng)建兩個可能的語句。如果參
    數(shù)“id”大于 0,將創(chuàng)建下面的語句:
    select * from ACCOUNT where ACC_ID = ?
    或者,如果“id”參數(shù)小于等于 0,將創(chuàng)建下面的語句:
    select * from ACCOUNT
    在更復(fù)雜的例子中,動態(tài) Mapped Statement 的用處更明顯。如下面比較復(fù)雜的例子:
    <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>
    根據(jù)不同的條件,上面動態(tài)的語句可以產(chǎn)生 16 條不同的查詢語句。使用 if-else 結(jié)構(gòu)和
    字符串,會產(chǎn)生上百行很亂的代碼。
    而使用動態(tài) Statement,和在 SQL 的動態(tài)部位周圍插入條件標(biāo)簽一樣容易。例如:
    <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 語句的動態(tài)部分。動態(tài)部分可以包含任意多
    的條件標(biāo)簽元素,條件標(biāo)簽決定是否在語句中包含其中的 SQL 代碼。所有的條件標(biāo)簽元素
    將根據(jù)傳給動態(tài)查詢 Statement 的參數(shù)對象的情況來工作。<dynamic>元素和條件元素都有
    “prepend”屬性,它是動態(tài) SQL 代碼的一部分,在必要情況下,可以被父元素的“prepend”
    屬性覆蓋。上面的例子中,prepend屬性“where”將覆蓋第一個為“真”的條件元素。這對

    于確保生成正確的 SQL 語句是有必要的。例如,在第一個為“真”的條件元素中,“AND”
    是不需要的,事實上,加上它肯定會出錯。以下小節(jié)討論不同的條件元素,包括二元條件元
    素,一元條件元素和其他動態(tài)元素。
    二元條件元素
    二元條件元素將一個屬性值和一個靜態(tài)值或另一個屬性值比較,如果條件為“真”,元
    素體的內(nèi)容將被包括在查詢 SQL 語句中。? 二元條件元素的屬性:
    prepend? - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)
    property? - 被比較的屬性(必選)
    compareProperty? -? 另一個用于和前者比較的屬性(必選或選擇 compareValue)
    compareValue? -? 用于比較的值(必選或選擇 compareProperty)
    比較屬性值和靜態(tài)值或另一個屬性值是否相等。
    <isEqual>
    比較屬性值和靜態(tài)值或另一個屬性值是否不相等。
    <isNotEqual>

    比較屬性值是否大于靜態(tài)值或另一個屬性值。
    <isGreaterThan>
    比較屬性值是否大于等于靜態(tài)值或另一個屬性值。
    <isGreaterEqual>
    比較屬性值是否小于靜態(tài)值或另一個屬性值。
    <isLessThan>
    比較屬性值是否小于等于靜態(tài)值或另一個屬性值。
    <isLessEqual>
    例子:
    <isLessEqual prepend=”AND” property=”age” compareValue=”18”>
    ADOLESCENT = ‘TRUE’
    </isLessEqual>
    ?
    一元條件元素
    一元條件元素檢查屬性的狀態(tài)是否符合特定的條件。? 一元條件元素的屬性:
    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:這些元素檢查參數(shù)對象是否存在。
    Parameter Present的屬性:
    prepend? - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)
    檢查是否存在參數(shù)對象(不為 null)。
    <isParameterPresent>
    檢查是否不存在參數(shù)對象(參數(shù)對象為 null)。
    <isNotParameterPresent>
    例子:
    <isNotParameterPresent prepend=”AND”>
    EMPLOYEE_TYPE = ‘DEFAULT’
    </isNotParameterPresent>
    ? Iterate:這屬性遍歷整個集合,并為 List 集合中的元素重復(fù)元素體的內(nèi)容。
    Iterate 的屬性:
    prepend? - 可被覆蓋的 SQL 語句組成部分,添加在語句的前面(可選)
    property? - 類型為 java.util.List 的用于遍歷的元素(必選)
    open? -? 整個遍歷內(nèi)容體開始的字符串,用于定義括號(可選)
    close? -整個遍歷內(nèi)容體結(jié)束的字符串,用于定義括號(可選)
    conjunction -? 每次遍歷內(nèi)容之間的字符串,用于定義 AND 或 OR(可選)
    遍歷類型為 java.util.List的元素。
    <iterate>
    例子:
    <iterate prepend=”AND” property=”userNameList”
    open=”(” close=”)” conjunction=”O(jiān)R”>
    username=#userNameList[]#
    </iterate>
    ?
    ?
    注意:使用<iterate>時,在List元素名后面包括方括號[]非常重要,方括號[]將
    對象標(biāo)記為List,以防解析器簡單地將List輸出成String。

    posted on 2009-03-25 14:41 李云澤 閱讀(1230) 評論(0)  編輯  收藏 所屬分類: ibatis


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品动漫免费二区| 亚洲欧洲自拍拍偷综合| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲免费在线观看| 日韩在线免费视频| 亚洲国产中文在线视频| 国产又大又粗又长免费视频| 亚洲成a人片在线网站| 亚欧色视频在线观看免费| 亚洲成在人线电影天堂色| 一本岛高清v不卡免费一三区| 亚洲精品第一国产综合野| 在线成人a毛片免费播放| 亚洲AV色无码乱码在线观看| 国产午夜无码视频免费网站 | 日韩版码免费福利视频| 激情内射亚洲一区二区三区爱妻| 成人午夜大片免费7777| 全黄A免费一级毛片| 亚洲日韩精品一区二区三区无码 | 国产成人yy免费视频| 亚洲精品无码av片| 亚洲国产一级在线观看| 黄页免费在线观看| 亚洲第一区二区快射影院| 亚洲AV无码一区二三区| 久久精品免费视频观看| 国产午夜亚洲精品| 亚洲中文字幕在线观看| 亚洲免费闲人蜜桃| 一级毛片免费在线观看网站| 亚洲国产一区在线| 国产做床爱无遮挡免费视频| 无码中文字幕av免费放dvd| 亚洲人成色在线观看| 亚洲AV无码成人精品区在线观看| 最新免费jlzzjlzz在线播放| 巨胸喷奶水www永久免费| 亚洲制服丝袜精品久久| 亚洲视频人成在线播放| 性xxxx视频播放免费|