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

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

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

    我思故我強

    ibatis動態mapped Statement 配置詳解

    ?動態 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。

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


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品无码av人在线观看| 人人狠狠综合久久亚洲高清| 亚洲一区二区三区电影| 99re6在线视频精品免费| 亚洲伊人久久成综合人影院| 一级女人18片毛片免费视频| 亚洲人成电影网站国产精品 | 久久久青草青青国产亚洲免观| 老子影院午夜伦不卡亚洲| 国产成人免费全部网站| 美女扒开尿口给男人爽免费视频 | 成人五级毛片免费播放| 一区二区亚洲精品精华液 | 亚洲?V乱码久久精品蜜桃 | 免费在线观影网站| 久久久综合亚洲色一区二区三区| 国产一精品一AV一免费| 亚洲精品自产拍在线观看动漫 | 日韩电影免费在线| 香港一级毛片免费看| 久久激情亚洲精品无码?V| 日韩a级无码免费视频| 亚洲一区二区三区高清| 在线观看AV片永久免费| 韩国亚洲伊人久久综合影院| 国产成人精品亚洲精品| 七色永久性tv网站免费看| 亚洲午夜电影在线观看高清| 青青草国产免费久久久下载 | 在线观看亚洲视频| 国产性爱在线观看亚洲黄色一级片| GOGOGO高清免费看韩国| 亚洲理论片中文字幕电影| 成人免费网站在线观看| yy一级毛片免费视频| 亚洲欧洲久久精品| 午夜国产大片免费观看| 免费A级毛片av无码| 老子影院午夜伦不卡亚洲| 亚洲男人天堂av| 国产大片线上免费看|