<
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。它通過最簡(jiǎn)單的方式實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫的添加、刪除、修改。
<?
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語句,并擁有parameter map(輸入)和result map(輸出)。如果是簡(jiǎn)單情況,Mapped Statement可以使用Java類來作為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)來執(zhí)行任意地的SQL語句,這種寫法就派上用場(chǎng)了。但常見的用法還是通過Parameter Map和Result Map,來實(shí)現(xiàn)Java Bean映射的特性,這是SQL Map真正有價(jià)值的地方。
Statements類型
<statement>元素是個(gè)通用聲明,可以用于任何類型的SQL語句。通常,使用具體的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語句
?
?????????SQL語句在mapped statement 中最重要的部份,可以使用符合數(shù)據(jù)庫或JDBC的任意SQL語句,對(duì)于語句有特殊途同歸符號(hào)的,可以把SQL語句寫在<![ ]]>里面。如
<
statement?
id
="getPersonsByAge"
?parameterClass
=”int”?
resultClass
="examples.domain.Person"
>
?
<![CDATA[
???SELECT?*?FROM?PERSON?WHERE?AGE?>?#value#?
?
]]>
</
statement
>
自動(dòng)生成的主鍵
很多數(shù)據(jù)庫支持自動(dòng)生成主鍵的數(shù)據(jù)類型。不過這通常(并不總是)是個(gè)私有的特性。SQL Map通過<insert>的子元素<selectKey>來支持自動(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ǔ)過程
SQL Map通過<procedure>元素支持存儲(chǔ)過程。下面的例子說明如何使用具有輸出參數(shù)的存儲(chǔ)過程。
<
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ǔ)過程方法。如果存儲(chǔ)過程回的是游標(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(接下來會(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文件中有效。不過,加上SQL Map的名稱(即在<sqlMap>根元素中的名稱)作為前綴,您可以在另一個(gè)SQL Map XML文件中引用它。例如,要在另一個(gè)文件中引用以上的parameterMap,可以使用名稱“Product.insert-product-param”。
Inline Parameter簡(jiǎn)介
parameterMap的語法雖然簡(jiǎn)單,但很繁瑣。還有一種更受歡迎更靈活的方法,可以大大簡(jiǎn)化定義和減少代碼量。這種方法把Java Bean的屬性名稱嵌在Mapped Statement的定義中(即直接寫在SQL語句中)。缺省情況下,任何沒有指定parameterMap的Mapped Statement都會(huì)被解析成inline parameter(內(nèi)嵌參數(shù))。用上面的例子(即Product)來說,就是:
<
statement?
id
=”insertProduct”?
parameterClass
=”com.domain.Product”>
?
insert?into?PRODUCT?(PRD_ID,?PRD_DESCRIPTION)?values?(#id#,?#description#);
?</statement
>
在內(nèi)嵌參數(shù)中指定數(shù)據(jù)類型可以用下面的語法:
<
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的替代值可以用這樣的語法:
<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中定義(如下說明)。
?注意!如果您需要指定很多的數(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ǔ)類型來做為參數(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ì)象必須是合適的類型,以上面的例子來說,必須是Integer和String。Result Map(參見以下章節(jié))也支持使用Map類型作為結(jié)果參數(shù)。要獲得更多信息,請(qǐng)參見“Result Map”和“使用SQL Map API編程”部分。 Map類型也可以使用別名。例如,可以用“map”來代替“java.util.Map”。這些別名參見下面的“支持Parameter Map和Result Map的數(shù)據(jù)類型”表格。
三、動(dòng)態(tài) MAP Statement
?????????作用是動(dòng)態(tài)構(gòu)建SQL語句,根據(jù)不同的一元或二元運(yùn)算條件構(gòu)建復(fù)雜的SQL語句,這功能非常好,這樣就可以把寫的BO層的SQL語句構(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
>
上面語句中可以根據(jù)參數(shù)id的不同值能構(gòu)造出兩條SQL查詢語句,下面是一個(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語句的動(dòng)態(tài)部分。動(dòng)態(tài)部分可以包含任意多的條件標(biāo)簽元素,條件標(biāo)簽決定是否在語句中包含其中的SQL代碼。所有的條件標(biāo)簽元素將根據(jù)傳給動(dòng)態(tài)查詢Statement的參數(shù)對(duì)象的情況來工作。<dynamic>元素和條件元素都有“prepend”屬性,它是動(dòng)態(tài)SQL代碼的一部分,在必要情況下,可以被父元素的“prepend”屬性覆蓋。上面的例子中,prepend屬性“where”將覆蓋第一個(gè)為“真”的條件元素。這對(duì)于確保生成正確的SQL語句是有必要的。例如,在第一個(gè)為“真”的條件元素中,“AND”是不需要的,事實(shí)上,加上它肯定會(huì)出錯(cuò)。以下小節(jié)討論不同的條件元素,包括二元條件元素,一元條件元素和其他動(dòng)態(tài)元素。
二元條件元素
?
?????二元條件元素將一個(gè)屬性值和一個(gè)靜態(tài)值或另一個(gè)屬性值比較,如果條件為“真”,元素體的內(nèi)容將被包括在查詢SQL語句中。 ??
?二元條件元素的屬性:?
prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)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語句組成部分,添加在語句的前面(可選)
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> ? |
還有兩個(gè)其它的條件元素,<isParameterPresent>,<iterate>就不說了,用到的時(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語句的其他動(dòng)態(tài)部分。簡(jiǎn)單動(dòng)態(tài)SQL元素的概念有點(diǎn)象inline parameter的映射,但使用了稍微不同的語法。考慮下面的例子:
?<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語句本身時(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來個(gè)方法吧,有空看看