本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0

          < person > ?
          ???
          < id > 1 </ id >
          ???
          < firstName > Clinton </ firstName >
          ???
          < lastName > Begin </ lastName >
          ???
          < birthDate > 1900-01-01 </ birthDate >
          ???
          < weightInKilograms > 89 </ weightInKilograms >
          ???
          < heightInMeters > 1.77 </ heightInMeters > ?
          </ person >

          一、SQL MAP Statement?
          ????????一個(gè)簡(jiǎn)單的sql map statement。它通過(guò)最簡(jiǎn)單的方式實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的添加、刪除、修改。

          <? xml?version="1.0"?encoding="UTF-8" ?>
          <! DOCTYPE?sqlMap?PUBLIC?"-//iBATIS.com//DTD?SQL?Map?2.0//EN"?"http://www.ibatis.com/dtd/sql-map-2.dtd" >
          < sqlMap? namespace ="Tuser" >
          ????
          < typeAlias? alias ="tuser" ?type ="com.ibatis.pojo.TuserPO" />
          ?????
          < select? id ="getTuser" ?resultClass ="tuser" > ?
          ???????????
          <![CDATA[
          ?????????????select?id,vname?from?tuser?where?id=#value#
          ????????????
          ]]>
          ?????
          </ select > ?

          ?????
          < insert? id ="insrtTuser" ?parameterClass ="tuser" >
          ?????????
          <![CDATA[
          ?????????????insert?into?tuser?values(#id#,#vname#)
          ?????????
          ]]>
          ?????
          </ insert >
          ?????
          < update? id ="updateTuser" ?parameterClass ="tuser" >
          ?????????
          <![CDATA[
          ?????????????update?tuser?set?id=#id#?,vname=#vname#?where?id=#id#
          ?????????
          ]]> ?
          ?????
          </ update >
          ?????
          < delete? id ="deleteTuser" ? >
          ?????????
          <![CDATA[
          ?????????????delete??from?tuser?where?id=#id#
          ?????????
          ]]>
          ?????
          </ delete >
          ?????
          </ sqlMap >

          再看下面這個(gè)較復(fù)雜點(diǎn)的SQL Map Statement

          < sqlMap? id =”Product”>?
          ??<cacheModel?id =”productCache”? type =”LRU”>?
          ??????????? <flushInterval?hours =”24”/>?
          ?????????? <property?name =”size”? value =”1000”? /> ?
          </ cacheModel > ?
          < typeAlias? alias =”product”? type =”com.ibatis.example.Product”? /> ?
          < parameterMap? id =”productParam”? class =”product”>?
          ????????? <parameter?property =”id”/>?
          ???????? </parameterMap > ?
          < resultMap? id =”productResult”? class =”product”>?
          ???????????<result?property =”id”? column =”PRD_ID”/>?
          ?????????? <result?property
          =”description”? column =”PRD_DESCRIPTION”/>?
          </resultMap > ?
          < select? id =”getProduct”? parameterMap =”productParam”? resultMap =”productResu????? t”? cacheModel =”product-cache”>?
          ????????? select?*?from?PRODUCT?where?PRD_ID? =???
          </select > ?
          </ sqlMap >

          對(duì)比兩個(gè)不同的定義文件,第二個(gè)的定義比較麻煩,但運(yùn)行效率卻比第一個(gè)要高。因?yàn)榈谝粋€(gè)定義文件使用了Ibatis框架的自動(dòng)映射特性。

          在一個(gè)Sql map XML映射擊文件可以包含多個(gè)Mapped Statement ,Parameter Map和ResultMap,但它們的名稱在該SQL Map XML文件中必須是唯一的

          Mapped Statements

          SQL Map的核心概念是Mapped Statement。Mapped Statement可以使用任意的SQL語(yǔ)句,并擁有parameter map(輸入)和result map(輸出)。如果是簡(jiǎn)單情況,Mapped Statement可以使用Java類來(lái)作為parameter和result。Mapped Statement也可以使用緩存模型,在內(nèi)存中緩存常用的數(shù)據(jù)。Mapped Statement的結(jié)構(gòu)如下所示:
          <statement id=”statementName”
          ???????[parameterClass=”some.class.Name”]?
          ?????? [resultClass=”some.class.Name”]
          ????? ?[parameterMap=”nameOfParameterMap”]?
          ?????? [resultMap=”nameOfResultMap”]
          ?????? [cacheModel=”nameOfCache”] >
          ?????? select * from PRODUCT where PRD_ID = [?|#propertyName#] order by????
          ???????????? [$simpleDynamic$]
          </statement>
          在上面的表達(dá)式中,括號(hào)[]里的部分時(shí)可選的屬性,并且在某些情況下只有特定的組合才是合法的。因此下面這個(gè)簡(jiǎn)單的例子也是正確的:
          ??? <statement id=”insertTestProduct” >
          ??????? insert into PRODUCT (PRD_ID,??? PRD_DESCRIPTION) values (1, “Shih Tzu”)
          </statement>
          上面的例子不太可能出現(xiàn),但如果只是簡(jiǎn)單地想用SQL Map架構(gòu)來(lái)執(zhí)行任意地的SQL語(yǔ)句,這種寫法就派上用場(chǎng)了。但常見的用法還是通過(guò)Parameter Map和Result Map,來(lái)實(shí)現(xiàn)Java Bean映射的特性,這是SQL Map真正有價(jià)值的地方。
          Statements類型
          <statement>元素是個(gè)通用聲明,可以用于任何類型的SQL語(yǔ)句。通常,使用具體的statement類型是個(gè)好主意。具體statement類型提供了更直觀的XML DTD,并擁有某些

          Statement 類型

          屬性

          子元素

          方法

          <statement>

          ?

          id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName

          ?

          所有的動(dòng)態(tài)元素

          ?

          insert update delete 所有的查詢方法

          ?

          <insert>

          ?

          id parameterClass parameterMap

          ?

          所有的動(dòng)態(tài)元素 <selectKey>

          ?

          insert

          update

          ?delete

          ?

          <update>

          ?

          id

          parameterClass parameterMap

          ?

          所有的動(dòng)態(tài)元素

          ?

          Insert

          Update

          delete

          ?

          <delete>

          ?

          id parameterClass resultClass parameterMap resultMap cacheModel

          ?

          所有的動(dòng)態(tài)元素

          ?

          所有的查詢方法

          ?

          <select>

          ?

          id parameterClass resultClass parameterMap resultMap cacheModel

          ?

          所有的動(dòng)態(tài)元素

          ?

          所有的查詢方法

          ?

          <procedure>

          ?

          id parameterClass resultClass parameterMap resultMap xmlResultName

          ?

          所有的動(dòng)態(tài)元素

          ?

          insert update delete 所有的查詢方法

          ?



          二、SQL語(yǔ)句 ?
          ?????????SQL語(yǔ)句在mapped statement 中最重要的部份,可以使用符合數(shù)據(jù)庫(kù)或JDBC的任意SQL語(yǔ)句,對(duì)于語(yǔ)句有特殊途同歸符號(hào)的,可以把SQL語(yǔ)句寫在<![ ]]>里面。如

          < statement? id ="getPersonsByAge" ?parameterClass =”int”? resultClass ="examples.domain.Person" >
          ?
          <![CDATA[
          ???SELECT?*?FROM?PERSON?WHERE?AGE?>?#value#?
          ?
          ]]>
          </ statement >

          自動(dòng)生成的主鍵
          很多數(shù)據(jù)庫(kù)支持自動(dòng)生成主鍵的數(shù)據(jù)類型。不過(guò)這通常(并不總是)是個(gè)私有的特性。SQL Map通過(guò)<insert>的子元素<selectKey>來(lái)支持自動(dòng)生成的鍵值。它同時(shí)支持預(yù)生成(如Oracle)和后生成兩種類型(如MS-SQL Server)。下面是兩個(gè)例子:

          < insert? id ="insertProduct-ORACLE" ?parameterClass ="com.domain.Product" > ?
          < selectKey? resultClass ="int" ?keyProperty ="id" ? > ?
          SELECT?STOCKIDSEQUENCE.NEXTVAL?AS?ID?FROM?DUAL?
          </ selectKey >
          ?????insert?into?PRODUCT?(PRD_ID,PRD_DESCRIPTION)?values?(#id#,#description#)?
          </ insert > ?
          <! —?Microsoft?SQL?Server?IDENTITY?Column?Example?-- >
          < insert? id ="insertProduct-MS-SQL" ?parameterClass ="com.domain.Product" > ?
          ????insert?into?PRODUCT?(PRD_DESCRIPTION)?values?(#description#)?
          ??? < selectKey? resultClass ="int" ?keyProperty ="id" ? > ?
          ????? ?SELECT?@@IDENTITY?AS?ID?
          ? ?</ selectKey >
          ? </ insert >

          存儲(chǔ)過(guò)程
          SQL Map通過(guò)<procedure>元素支持存儲(chǔ)過(guò)程。下面的例子說(shuō)明如何使用具有輸出參數(shù)的存儲(chǔ)過(guò)程。

          < parameterMap? id ="swapParameters" ?class ="map" ? > ?
          ???
          < parameter?
          property ="email1" ???jdbcType ="VARCHAR" ?javaType ="java.lang.String" ?mode ="INOUT" />
          ?
          < parameter?
          property ="email2" ???jdbcType ="VARCHAR" ??javaType ="java.lang.String" ??mode ="INOUT" /> ?
          </ parameterMap > ?
          < procedure? id ="swapEmailAddresses" ?parameterMap ="swapParameters" ? >
          ???{call?swap_email_address?(?,??)}?
          </ procedure >

          支持標(biāo)準(zhǔn)的JDBC格式調(diào)用存儲(chǔ)過(guò)程方法。如果存儲(chǔ)過(guò)程回的是游標(biāo)那又怎么定義的。
          parameterClass

          parameterClass屬性的值是Java類的全限定名(即包括類的包名)。parameterClass屬性是可選的,但強(qiáng)烈建議使用。它的目的是限制輸入?yún)?shù)的類型為指定的Java類,并優(yōu)化框架的性能。如果您使用parameterMap,則沒有必要使用parameterClass屬性。例如,如果要只允許Java類“examples.domain.Product”作為輸入?yún)?shù),可以這樣作:

          < statement? id =”statementName”? parameterClass =”? examples.domain.Product” > ?insert?into?PRODUCT?values?(#id#,?#description#,?#price#)
          ?
          </ statement >

          parameterMap

          屬性parameterMap的值等于一個(gè)預(yù)先定義的<parameterMap>元素的名稱。parameterMap屬性很少使用,更多的是使用上面的parameterClass和inline parameter(接下來(lái)會(huì)討論)。 注意!動(dòng)態(tài)mapped statement只支持inline parameter,不支持parameter map。 parameterMap的基本思想是定義一系列有次序的參數(shù)系列,用于匹配JDBC PreparedStatement的值符號(hào)。例如:

          < parameterMap? id =”insert-product-param”? class =”com.domain.Product”>
          ??
          <parameter?property =”id”/>?
          ??
          <parameter?property =”description”/>?
          </parameterMap > ?
          < statement? id =”insertProduct”? parameterMap =”insert-product-param”>? insert?into?PRODUCT?(PRD_ID,?PRD_DESCRIPTION)?values?(?,?);?
          </statement
          >

          如上所述,parameterMap負(fù)責(zé)將Java Bean的屬性映射成statement的參數(shù)。
          雖然parameterMap的外部形式很少使用,理解它如何工作對(duì)于理解inline parameter還是很有幫助。本節(jié)以下部分將詳細(xì)討論inline parameter。 <parameterMap id=”parameterMapName” [class=”com.domain.Product”]> <parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”] [nullValue=”NUMERIC”] [null=”-9999999”]/> <parameter …… />
          <parameter …… />
          </parameterMap>
          括號(hào)[]是可選的屬性。parameterMap元素只要求屬性id作為唯一標(biāo)識(shí)。屬性class是可選的但強(qiáng)烈推薦使用。和parameterClass類似,class屬性可以框架檢查輸入?yún)?shù)的類型并優(yōu)化性能。
          一個(gè)<parameterMap>的例子

          < parameterMap? id =”insert-product-param”? class =”com.domain.Product”>
          ?
          <parameter?property =”id”? jdbcType =”NUMERIC”? javaType =”int”? nullValue =”-9999999”/>?
          <parameter?property =”description”? jdbcType =”VARCHAR”? nullValue =”NO_ENTRY”/>?
          </parameterMap > ?
          < statement? id =”insertProduct”? parameterMap =”insert-product-param”>?
          insert?into?PRODUCT?(PRD_ID,?PRD_DESCRIPTION)?values?(?,?);?
          </statement
          >

          注意!
          parameterMap并不自動(dòng)地綁定到特定的Java類。因此在上面的例子中,任何擁有“id”和“description”屬性的Java Bean對(duì)象,都可以作為parameterMap的輸入。如果需要將輸入綁定到特定的Java類,可以使用mapped-statement的resultClass屬性。
          ?注意!
          Parameter Map的名稱(name)局部的,只在定義它的SQL Map XML文件中有效。不過(guò),加上SQL Map的名稱(即在<sqlMap>根元素中的名稱)作為前綴,您可以在另一個(gè)SQL Map XML文件中引用它。例如,要在另一個(gè)文件中引用以上的parameterMap,可以使用名稱“Product.insert-product-param”。

          Inline Parameter簡(jiǎn)介

          parameterMap的語(yǔ)法雖然簡(jiǎn)單,但很繁瑣。還有一種更受歡迎更靈活的方法,可以大大簡(jiǎn)化定義和減少代碼量。這種方法把Java Bean的屬性名稱嵌在Mapped Statement的定義中(即直接寫在SQL語(yǔ)句中)。缺省情況下,任何沒有指定parameterMap的Mapped Statement都會(huì)被解析成inline parameter(內(nèi)嵌參數(shù))。用上面的例子(即Product)來(lái)說(shuō),就是:

          < statement? id =”insertProduct”? parameterClass =”com.domain.Product”>
          ?
          insert?into?PRODUCT?(PRD_ID,?PRD_DESCRIPTION)?values?(#id#,?#description#);
          ?</statement
          >

          在內(nèi)嵌參數(shù)中指定數(shù)據(jù)類型可以用下面的語(yǔ)法:

          < statement? id =”insertProduct”? parameterClass =”com.domain.Product”>?
          insert?into?PRODUCT?(PRD_ID,?PRD_DESCRIPTION)?values?(#id:NUMERIC#,?#description:VARCHAR#);?
          </statement
          >

          在內(nèi)嵌參數(shù)中指定數(shù)據(jù)類型和NULL的替代值可以用這樣的語(yǔ)法:

          <statement id=”insertProduct” parameterClass=”com.domain.Product”>
          insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
          </statement>

          注意!在內(nèi)嵌參數(shù)中,要指定NULL的替代值,必須要先指定數(shù)據(jù)類型。 注意!如需要在查詢時(shí)也使用NULL替代值,必須同時(shí)在resultMap中定義(如下說(shuō)明)。
          ?注意!如果您需要指定很多的數(shù)據(jù)類型和NULL替代值,可以使用外部的parameterMap


          resultClass

          resultClass屬性的值是Java類的全限定名(即包括類的包名)。resultClass屬性可以讓您指定一個(gè)Java類,根據(jù)ResultSetMetaData將其自動(dòng)映射到JDBC的ResultSet。只要是Java Bean的屬性名稱和ResultSet的列名匹配,屬性自動(dòng)賦值給列值。這使得查詢mapped statement變得很短。例如:

          < statement? id ="getPerson" ?parameterClass =”int”? resultClass ="examples.domain.Person" > ?SELECT?PER_ID?as?id,
          PER_FIRST_NAME?as?firstName,
          PER_LAST_NAME?as?lastName,
          PER_BIRTH_DATE?as?birthDate,
          PER_WEIGHT_KG?as?weightInKilograms,?PER_HEIGHT_M?as?heightInMeters?FROM?PERSON?WHERE?PER_ID?=?#value#?
          </ statement >

          resultMap
          ? resultMap是最常用和最重要的屬性。ResultMap屬性的值等于預(yù)先定義的resultMap元素的name屬性值(參照下面的例子)。使用resultMap可以控制數(shù)據(jù)如何從結(jié)果集中取出,以及哪一個(gè)屬性匹配哪一個(gè)字段。不象使用resultClass的自動(dòng)映射方法,resultMap屬性可以允許指定字段的數(shù)據(jù)類型,NULL的替代值復(fù)雜類型映射(包括其他Java Bean,集合類型和基本類型包裝類)。
          ??

          < resultMap? id =”get-product-result”? class =”com.ibatis.example.Product”>
          ?
          <result?property =”id”? column =”PRD_ID”/>???
          <result?property =”description”? column =”PRD_DESCRIPTION”/>
          ?
          </resultMap >
          ?
          < statement? id =”getProduct”? resultMap =”get-product-result”>?
          ?????? select?*?from?PRODUCT?
          </statement
          >

          xmlResultName

          當(dāng)直接把查詢結(jié)果映射成XML document時(shí),屬性xmlResultName的值等于XML document根元素的名稱。例如:

          < select? id ="getPerson" ?parameterClass =”int”? resultClass ="xml" ?xmlResultName =”person”>?
          SELECT?PER_ID?as?id,?
          PER_FIRST_NAME?as?firstName,?
          PER_LAST_NAME?as?lastName,
          ?PER_BIRTH_DATE?as?birthDate,
          ?PER_WEIGHT_KG?as?weightInKilograms,???PER_HEIGHT_M?as?heightInMeters
          ?FROM?PERSON?WHERE?PER_ID?
          =?#value#?
          </select >

          上面的查詢結(jié)果將產(chǎn)生一個(gè)XML document,結(jié)構(gòu)如下:

          < person >
          ????
          < id > 1 </ id >
          ????
          < firstName > Clinton </ firstName >
          ????
          < lastName > Begin </ lastName >
          ????
          < birthDate > 1900-01-01 </ birthDate >
          ????
          < weightInKilograms > 89 </ weightInKilograms >
          ????
          < heightInMeters > 1.77 </ heightInMeters >
          </ person >

          基本類型輸入?yún)?shù)
          很簡(jiǎn)單就是使用JAVA基礎(chǔ)類型來(lái)做為參數(shù)了。

          < statement? id =”insertProduct”? parameter =”java.lang.Integer”>?
          select?*?from?PRODUCT?where?PRD_ID? =?#value#? </statement >

          Map類型輸入?yún)?shù)

          < statement? id =”insertProduct”? parameterClass =”java.util.Map”>
          ?
          select?*?from?PRODUCT?where?PRD_CAT_ID? =?#catId#? and?PRD_CODE? =?#code#?
          </statement >

          可以注意到mapped statement的形式完全沒有區(qū)別!上面的例子中,如果把Map對(duì)象作為輸入?yún)?shù)去調(diào)用mapped statement,Map對(duì)象必須包含鍵值“catId”和“code”。鍵值引用的對(duì)象必須是合適的類型,以上面的例子來(lái)說(shuō),必須是Integer和String。Result Map(參見以下章節(jié))也支持使用Map類型作為結(jié)果參數(shù)。要獲得更多信息,請(qǐng)參見“Result Map”和“使用SQL Map API編程”部分。 Map類型也可以使用別名。例如,可以用“map”來(lái)代替“java.util.Map”。這些別名參見下面的“支持Parameter Map和Result Map的數(shù)據(jù)類型”表格。


          三、動(dòng)態(tài) MAP Statement
          ?????????
          作用是動(dòng)態(tài)構(gòu)建SQL語(yǔ)句,根據(jù)不同的一元或二元運(yùn)算條件構(gòu)建復(fù)雜的SQL語(yǔ)句,這功能非常好,這樣就可以把寫的BO層的SQL語(yǔ)句構(gòu)造移值到SQL MAP 文件里。這里例舉一些例子:

          < 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 >
          上面語(yǔ)句中可以根據(jù)參數(shù)id的不同值能構(gòu)造出兩條SQL查詢語(yǔ)句,下面是一個(gè)比較復(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>

          上面的例子中,<dynamic>元素劃分出SQL語(yǔ)句的動(dòng)態(tài)部分。動(dòng)態(tài)部分可以包含任意多的條件標(biāo)簽元素,條件標(biāo)簽決定是否在語(yǔ)句中包含其中的SQL代碼。所有的條件標(biāo)簽元素將根據(jù)傳給動(dòng)態(tài)查詢Statement的參數(shù)對(duì)象的情況來(lái)工作。<dynamic>元素和條件元素都有“prepend”屬性,它是動(dòng)態(tài)SQL代碼的一部分,在必要情況下,可以被父元素的“prepend”屬性覆蓋。上面的例子中,prepend屬性“where”將覆蓋第一個(gè)為“真”的條件元素。這對(duì)于確保生成正確的SQL語(yǔ)句是有必要的。例如,在第一個(gè)為“真”的條件元素中,“AND”是不需要的,事實(shí)上,加上它肯定會(huì)出錯(cuò)。以下小節(jié)討論不同的條件元素,包括二元條件元素,一元條件元素和其他動(dòng)態(tài)元素。
          二元條件元素
          ? ?????二元條件元素將一個(gè)屬性值和一個(gè)靜態(tài)值或另一個(gè)屬性值比較,如果條件為“真”,元素體的內(nèi)容將被包括在查詢SQL語(yǔ)句中。 ??
          ?二元條件元素的屬性:?
          prepend - 可被覆蓋的SQL語(yǔ)句組成部分,添加在語(yǔ)句的前面(可選)property - 被比較的屬性(必選)
          compareProperty - 另一個(gè)用于和前者比較的屬性(必選或選擇compareValue)
          ?compareValue - 用于比較的值(必選或選擇compareProperty)

          二元條件元系的屬性

          <isEqual>

          比較屬性值和靜態(tài)值或另一個(gè)屬性值是否相等。

          <isNotEqual>

          比較屬性值和靜態(tài)值或另一個(gè)屬性值是否不相等。

          <isGreaterThan>

          比較屬性值是否大于靜態(tài)值或另一個(gè)屬性值。

          <isGreaterEqual>

          比較屬性值是否大于等于靜態(tài)值或另一個(gè)屬性值。

          <isLessThan>

          比較屬性值是否小于靜態(tài)值或另一個(gè)屬性值。

          <isLessEqual>

          比較屬性值是否小于等于靜態(tài)值或另一個(gè)屬性值。 例子: <isLessEqual prepend=”AND” property=”age” compareValue=”18”> ADOLESCENT = ‘TRUE’ </isLessEqual>

          ?


          一元條件元素
          一元條件元素檢查屬性的狀態(tài)是否符合特定的條件。
          一元條件元素的屬性:
          prepend - 可被覆蓋的SQL語(yǔ)句組成部分,添加在語(yǔ)句的前面(可選)
          property - 被比較的屬性(必選)

          <isPropertyAvailable>

          檢查是否存在該屬性(存在parameter bean的屬性)。

          <isNotPropertyAvailable>

          檢查是否不存在該屬性(不存在parameter bean的屬性)。

          <isNull>

          檢查屬性是否為null

          <isNotNull>

          檢查屬性是否不為null

          <isEmpty>

          ?

          檢查Collection.size()的值,屬性的StringString.valueOf(),是否為null或空(“”或size() < 1)。

          ?

          <isNotEmpty>

          ?

          檢查Collection.size()的值,屬性的StringString.valueOf(),是否不為null或不為空(“”或size() > 0)。 例子:

          ?<isNotEmpty prepend=”AND” property=”firstName” > FIRST_NAME=#firstName# </isNotEmpty>

          ?

          還有兩個(gè)其它的條件元素,<isParameterPresent>,<iterate>就不說(shuō)了,用到的時(shí)候可以再查。

          簡(jiǎn)單的動(dòng)態(tài)SQL元素

          雖然動(dòng)態(tài)Mapped Statement API功能強(qiáng)大,但有時(shí)僅需要一小部分的動(dòng)態(tài)SQL即可。為此,SQL statement和statement都可以包含簡(jiǎn)單的動(dòng)態(tài)SQL元素,以幫助實(shí)現(xiàn)動(dòng)態(tài)的order by子句,動(dòng)態(tài)的查詢字段或SQL語(yǔ)句的其他動(dòng)態(tài)部分。簡(jiǎn)單動(dòng)態(tài)SQL元素的概念有點(diǎn)象inline parameter的映射,但使用了稍微不同的語(yǔ)法。考慮下面的例子:
          ?<statement id=”getProduct” resultMap=”get-product-result”>
          ???????select * from PRODUCT order by $preferredOrder$
          </statement>
          簡(jiǎn)單動(dòng)態(tài)元素可以包含在<dynamic-mapped-statement>中,當(dāng)要修改SQL語(yǔ)句本身時(shí)它能派上用場(chǎng)。例如:

          <statement?id=”getProduct”?resultMap=”get-product-result”>?
          SELECT?*?FROM?PRODUCT?
          <dynamic?prepend
          =”WHERE”>
          ?
          <isNotEmpty?property=”description”>???
          ????? ?
          PRD_DESCRIPTION?$operator$?#description#?</isNotEmpty>?
          </dynamic>?
          </statement>

          三、使用SQL Map API編程

          ???那那10來(lái)個(gè)方法吧,有空看看



          posted on 2007-01-04 21:31 有貓相伴的日子 閱讀(11880) 評(píng)論(5)  編輯  收藏 所屬分類: ibatis/hibernate/持久層技術(shù)

          評(píng)論:
          # re: Ibatis學(xué)習(xí)隨筆 2008-03-11 15:42 | wangpan
          請(qǐng)教:
          如何調(diào)用一個(gè)帶多個(gè)條件的查詢語(yǔ)句?  回復(fù)  更多評(píng)論
            
          # re: Ibatis學(xué)習(xí)隨筆 2008-03-11 15:43 | wangpan
          請(qǐng)教:
          如何調(diào)用一個(gè)帶多個(gè)條件的查詢語(yǔ)句?

          如這個(gè)
          <select id="selectVenues" parameterClass ="int" resutlMap="account-result">
          select
          id,
          serviceitem,
          trade,
          pro,
          city,
          vcname,
          vename,
          caddress,
          eaddress,
          gamecname,
          gameename,
          collecter,
          batch
          from o_venues

          <dynamic prepend="where">
          <isNotEmpty prepend="and" property="city">
          (city = #city#)
          </isNotEmpty>
          <isNotEmpty prepend="and" property="vcname">
          (vcname = #vcname#)
          </isNotEmpty>
          </dynamic>
          </select>  回復(fù)  更多評(píng)論
            
          # re: Ibatis學(xué)習(xí)隨筆 2008-05-06 11:44 | 請(qǐng)教問(wèn)題
          我用ibatis讀tomcat下的數(shù)據(jù)庫(kù)連接池,報(bào)這個(gè)錯(cuò)是什么原因Cause: com.ibatis.sqlmap.engine.transaction.TransactionException: JdbcTransaction initialization failed. DataSource was null.
          有人能幫解決下嗎?我的qq327362894
            回復(fù)  更多評(píng)論
            
          # re: Ibatis學(xué)習(xí)隨筆 2009-04-30 16:15 | 56
          # re: Ibatis學(xué)習(xí)隨筆 2009-12-17 21:39 | 團(tuán)派家園
          ibaits會(huì)如何呢?  回復(fù)  更多評(píng)論
            
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(32)

          隨筆分類(222)

          隨筆檔案(224)

          文章分類(4)

          文章檔案(7)

          相冊(cè)

          收藏夾(4)

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 苗栗市| 蒲城县| 兴仁县| 垦利县| 肥乡县| 柳江县| 乌拉特后旗| 江川县| 连江县| 嘉峪关市| 北川| 图木舒克市| 肇庆市| 和田县| 留坝县| 姚安县| 凤山县| 新建县| 广汉市| 嘉祥县| 三亚市| 汪清县| 印江| 织金县| 荣成市| 乌鲁木齐县| 和田市| 滨州市| 华坪县| 通化市| 江永县| 宁海县| 通渭县| 安吉县| 许昌县| 九龙坡区| 图木舒克市| 图们市| 西乌珠穆沁旗| 揭阳市| 沙洋县|