<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 李云澤 閱讀(1229) 評論(0)  編輯  收藏 所屬分類: ibatis


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲免费二区三区| 亚洲国产成人久久综合野外| 亚洲AV无码一区二区三区久久精品| 国产精品四虎在线观看免费| 91福利免费网站在线观看| 亚洲精品美女久久久久9999| 四虎永久精品免费观看| 你懂的免费在线观看网站| 亚洲国产精品成人综合色在线| 亚洲精品无码专区在线在线播放 | 狠狠色伊人亚洲综合成人| 免费下载成人电影| 一个人免费观看视频在线中文 | 亚洲色成人网站WWW永久| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 黄人成a动漫片免费网站| 老司机亚洲精品影院无码| 免费一级做a爰片性色毛片| 在线日本高清免费不卡| 黄页视频在线观看免费| 亚洲午夜精品国产电影在线观看| 亚洲成av人片一区二区三区| 久久午夜免费视频| 精品国产免费一区二区三区香蕉| 亚洲精品国产suv一区88| 亚洲大片在线观看| 亚洲成av人片一区二区三区 | 毛茸茸bbw亚洲人| 天天摸天天操免费播放小视频| 久久永久免费人妻精品| 一级毛片一级毛片免费毛片 | 又硬又粗又长又爽免费看 | 丁香花在线视频观看免费| 校园亚洲春色另类小说合集 | 国产无遮挡裸体免费视频在线观看| 亚洲熟妇AV乱码在线观看| 亚洲第一网站免费视频| 国产成A人亚洲精V品无码| 亚洲午夜日韩高清一区| 免费日韩在线视频| 日韩成人免费在线|