1. 程式人生 > >IBATIS標籤詳解

IBATIS標籤詳解

一級標籤(根標籤):
1.<sqlMap></sqlMap>

屬性:
namespace:用於指定名稱空間,在java程式段可以使用名稱空間.標籤id的形式來呼叫相應的sql語句。

二級標籤:
2.cacheModel

cachemodel是ibatis裡面自帶的快取機制,正確的應用能很好提升我們系統的效能。

使用方法:在sqlmap的配置檔案中加入

<cacheModel type="LRU" id="article_cache" readOnly="true" serialize="false">
        <flushInterval hours="24"/>
        <flushOnExecute statement="articleLists.insertArticle"/>
        <property name="cache_size" value="50"/>        
</cacheModel>

在查詢語句中使用快取
<select id="getArticles" resultClass="articleList" parameterClass="articleList" cacheModel="article_cache">
</pre>先對cachemodel中一些用法進行解釋一下:<strong><span style="color:#ff0000">type</span></strong>:是快取的型別,ibatis中有4種方式,分別為MEMORY、LRU、FIFO、OSCACHE          MEMORY是記憶體快取,和Java記憶體管理機制類似分為[SOFT、WEAK、STRONG]          LRU是使用最近最少使用策略          FIFO是使用先進先出策略          OSCACHE是通過第三方的快取外掛實現<strong><span style="color:#ff0000">id</span></strong>:是cachemodel的一個標識<strong><span style="color:#ff0000">readOnly</span></strong>:指快取的資料物件是隻讀還是可讀寫,預設只讀,這裡的只讀並不是意味著資料物件一旦放入快取中就無法再對資料進行修改。而是當資料物件發生變化的時候,如資料物件的某個屬性發生了變化,則此資料物件就將被從快取中廢除,下次需要重新從資料庫讀取資料,構造新的資料物件。而readOnly="false"則意味著快取中的資料物件可更新.<strong><span style="color:#ff0000">serialize</span></strong>:只有在readOnly為false的情況下才生效,因為在readOnly為true時,所有資料物件相同,只有可讀寫時,才會出現不同的session擁有不同的資料物件副本。<strong><span style="color:#ff0000">flushInterval</span></strong>:指定快取自動重新整理的時間,可以為hours,minutes,seconds,milliseconds.<strong><span style="color:#ff0000">flushOnExecute</span></strong>:指定在發生哪些操作時,更新快取。<strong><span style="color:#ff0000">property</span></strong>:不同type的cachemodel有不同的屬性。總結:對更新比較頻繁的資料,使不使用感覺效率差不多,對更新不是很頻繁的資料,使用快取效率還是能提升的!<strong>3.<delete> DELETE SQL</delete>    <insert> INSERT SQL </insert>    <update> UPDATE SQL </update></strong>屬性:<strong><span style="color:#ff0000">id</span></strong>:唯一標識<strong><span style="color:#ff0000">parameterMap</span></strong>:引數列表<strong><span style="color:#ff0000">parameterClass</span></strong>:引數類。<strong><span style="color:#ff0000">timeout</span></strong>:設定資料庫超時時間.通常使用parameterClass,傳入一個HashMap,在java程式端使用HashMap來儲存引數。<strong>4.<select> SELECT SQL </select></strong>屬性:<strong><span style="color:#ff0000">id</span></strong>:名稱空間中的唯一標識<strong><span style="color:#ff0000">parameterClass</span></strong>:引數型別<strong><span style="color:#ff0000">parameterMap</span></strong>:引數列表<strong><span style="color:#ff0000">resultClass</span></strong>:結果型別<strong><span style="color:#ff0000">resultMap</span></strong>:結果列表<strong><span style="color:#ff0000">cacheModel</span></strong>:快取模式<strong><span style="color:#ff0000">timeout</span></strong>:資料庫超時時間<strong><span style="color:#ff0000">fetchSize</span></strong>:一次抓去的資料量<strong><span style="color:#ff0000">remapResults</span></strong>:有true和false兩個值。如果每次查詢的列或者表發生變化時,就需要設定為true。使用的話會造成一定的效能損失。<strong><span style="color:#ff0000">xmlResultName</span></strong>:將結果集轉換為xml形式。<strong><span style="color:#ff0000">resultSetType</span></strong>:結果集型別。引數傳入類似於刪除,插入,更新的操作。結果輸出有兩種,如果明確返回的資料的型別,那麼可以使用resultClass。如果返回的資料中有很多型別,那麼使用resultMap。<strong>5.<resultMap></resultMap></strong>屬性:<strong><span style="color:#ff0000">id</span></strong>:唯一標識<strong><span style="color:#ff0000">class</span></strong>:要存入的資料的型別。通常可以使用HashMap。<strong><span style="color:#ff0000">extends</span></strong>:可以繼承其他的resultMap<strong><span style="color:#ff0000">groupBy</span></strong>:可以進行分組<strong>6.<paramaterMap></parameterMap></strong>屬性:<strong><span style="color:#ff0000">id</span></strong>:唯一標識<strong><span style="color:#ff0000">class</span></strong>:引數型別通常使用parameterClass,然後傳入一個HashMap。<strong>7.<sql> SOME SQL</sql></strong>屬性:<strong><span style="color:#ff0000">id</span></strong>:唯一標識。<strong><span style="color:#ff0000">8.<statement> 動態SQL </statement></span></strong>屬性和select一樣。<strong>9.<typeAlias /></strong>可以給一個型別指定別名屬性:<strong><span style="color:#ff0000">alias</span></strong>:別名<strong><span style="color:#ff0000">type</span></strong>:要指定別名的類的型別<strong>10.<procedure> call 儲存過程名(引數1,引數2...)</procedure></strong>屬性和select一樣。可以呼叫儲存過程。<span style="color:#3366ff"><strong>以下為二級標籤下的三級標籤</strong>:</span><strong>11.<dynamic></dynamic></strong>屬性:<strong><span style="color:#ff0000">prepend</span></strong>:用於拼接一個字首。它會覆蓋掉第一個為true的元素的prepend。<strong><span style="color:#ff0000">close</span></strong>和<strong><span style="color:#ff0000">open</span></strong>屬性用於包括一個拼接的sql。例如:<p></p><pre code_snippet_id="546471" snippet_file_name="blog_20141209_3_9526983" name="code" class="html">select * from table
<dynamic prepend="where" open="(" close=")">
    id=#id#
</dynamic>
這就拼接了sql為  select * from table where (id=?)  (id值由傳入所得)

再例如:
select * from ACCOUNT  
<dynamic prepend="where">  
    <isGreaterThan property="id" compareValue="0">  
        ACC_ID = #id#  
    </isGreaterThan>  
    <isNotNull prepend="and" property="lastName">  
        ACC_LAST_NAME = #lastName#  
    </isNotNull>  
</dynamic> 
如果這樣寫,那麼會拼出sql為select * from ACCOUNT where ACC_ID=#id# ACC_LAST_NAME=#lastName#,
因為它將第一個為true的prepend覆蓋掉了。應該在<isGreaterThan>中新增屬性prepend。推薦為所有的prepend都賦值,以免拼接時出現錯誤。

12.<include />
用於引用包含一段已經定義好的sql
屬性:
refid:被引用的sql的id

13.<isEmpty></isEmpty>
判斷所傳入引數是否為null或者為空。如果是empty,那麼就將傳入引數拼入sql語句。
屬性:
prepend:拼接sql的字首。
property:對應於java的屬性
closeopen:包括拼接的sql。

例如:
insert into table(
<dynamic prepend=" ">
    <isEmpty prepend="," preperty="name">name</isEmpty>
    <isEmpty prepend="," preperty="age">age</isEmpty>
</dynamic>
) values(
<dynamic prepend=" ">
    <isEmpty prepend="," preperty="name">#name#</isEmpty>
    <isEmpty prepend="," preperty="age">1</isEmpty>
</dynamic>
)
如果傳入age為空,傳入name為張三,那麼拼接的sql為

insert into table(age) values(1)

14.<isNotEmpty></isNotEmpty>
與<isEmpty>相反,判斷傳入引數是否不為空也不為null。如果不為null和空,那麼就將引數拼接到sql中。
屬性:
prepend:拼接sql的字首。
property:對應於java的屬性
closeopen:包括拼接的sql。

例如:

insert into table(
<dynamic prepend=" ">
    <isNotEmpty prepend="," preperty="name">name</isNotEmpty>
    <isNotEmpty prepend="," preperty="age">age</isNotEmpty>
</dynamic>
) values(
<dynamic prepend=" ">
    <isNotEmpty prepend="," preperty="name">#name#</isNotEmpty>
    <isNotEmpty prepend="," preperty="age">#age#</isNotEmpty>
</dynamic>
)
如果傳入name為張三,傳入age為null,那麼拼接的sql為

insert into table(name) values('張三')

15.<isNull></isNull>
判斷傳入引數是否為null。如果為null,那麼就執行相應的拼接。
屬性:
prepend:拼接sql的字首。
property:對應於java的屬性
closeopen:包括拼接的sql。

例如:

insert into table(
<dynamic prepend=" ">
    <isNull prepend="," preperty="name">name</isNull>
    <isNull prepend="," preperty="age">age</isNull>
</dynamic>
) values(
<dynamic prepend=" ">
    <isNull prepend="," preperty="name">'張三'</isNull>
    <isNull prepend="," preperty="age">#age#</isNull>
</dynamic>
)
如果傳入name為null,傳入age為22,那麼拼接的sql為
insert into table(name) values('張三')

16.<isNotNull></isNotNull>
判斷傳入引數是否不為null。如果不為null,那麼就執行相應的拼接。
屬性:
prepend:拼接sql的字首。
property:對應於java的屬性
closeopen:包括拼接的sql。

例如:
insert into table(
<dynamic prepend=" ">
    <isNotNull prepend="," preperty="name">name</isNotNull>
    <isNotNull prepend="," preperty="age">age</isNotNull>
</dynamic>
) values(
<dynamic prepend=" ">
    <isNotNull prepend="," preperty="name">#name#</isNotNull>
    <isNotNull prepend="," preperty="age">#age#</isNotNull>
</dynamic>
)
如果傳入name為張三,傳入age為null,那麼拼接的sql為
insert into table(name) values('張三')

17.<isEqual></isEqual>
判斷傳入引數與指定值是否相等。
屬性:
prepend:拼接sql的字首。
property:對應於java的屬性
closeopen:包括拼接的sql。
compareValue:用於指定與引數比較的值。
compareProperty:用於指定與引數比較的屬性。

例如:
select * from table 
<dynamic prepend="where">
  <isEqual prepend=" " property="id" compareValue="001">id=#id#</isEqual>
</dynamic>
如果id傳入為001,那麼就拼接sql為 
select * from table where id='001'
如果傳入不為001,那麼拼接sql為 select * from table

18.<isGreaterEqual>,<isGreaterThan>,<isLessEqual>,<isLessThan>
分別對應與大於等於,大於,小於等於,小於。

19.<isParameterPresent>
如果引數不為null,則執行sql
屬性:
prepend:拼接sql的字首。
closeopen:包括拼接的sql。

20.<isNotParameterPresent>
如果引數為null,則執行sql
屬性:
prepend:拼接sql的字首。
close和open:包括拼接的sql。

21.<isPropertyAvalible>
如果引數有使用則查詢條件有效。

22.<isNotPropertyAvalible>
如果引數沒有使用則查詢條件有效。

23.<result>
配置在resultMap下,用於指定結果集中的每一項。
屬性:
property:對應於要輸出的欄位名,在java程式段可以通過這個屬性值獲得相應的值
colunm:對應於資料表的欄位
columIndex:對應於資料表字段的索引
jdbcType:僅當增刪改是可能出現null值的欄位,可以設定jdbcType。當該result為DATE型別時,指定jdbcType可以更加明確sql。因為DATE在java裡是一種型別,但是在不同的資料庫有不同的DATE型別。
javaType:對應於java的型別。如果在sql中使用了聚合函式,需要在對應的result中配置該屬性,否則取出的是聚合函式的物件,顯示出的就是java物件的雜湊值。
nullValue:空值。

24.<iterator></iterator>
用於迴圈輸出,以便迴圈的生成sql。
屬性:
property:對於要輸出的集合
open和close:用於開始和結束,包括一段拼接的sql。
prepend:拼接sql的字首
conjunction:迴圈輸出拼接時需要的連線字串,用於定義AND或OR

例如:
<select id="selectUseIterator" parameterClass="java.util.List" resultMap="student">
SELECT * FROM STUDENT
<dynamic prepend="WHERE ID IN">
    <iterate open="(" close=")" conjunction="," >#[]#</iterate>
</dynamic>
</select>
引數List傳入了3個id,分別為1,3,4。必須寫[],以防解析器簡單地將List輸出成String。拼接的sql為
SELECT * FROM STUDENT WHERE ID IN (1,3,4)

25.<selectKey></selectKey>
用於獲取自增長的序列。
屬性:
resultClass:返回結果的型別。
keyProperty:對應鍵的屬性。
多用於插入操作,例如:
<insert id="addStudent" parameterClass="earl.vo.Student">
    INSERT INTO STUDENT(NAME,AGE,SEX,MAJOR) VALUES(#name#,#age#,#sex#,#major#)
    <selectKey resultClass="int" keyProperty="id">
        SELECT LAST_INSERT_ID() AS ID
    </selectKey>
</insert>
id是STUDENT表的主鍵,通過這條語句可以自動生成id並插入到STUDENT表中。

以下是一些標籤的用法區別及技巧:

<isNotEmpty>和<isNotNull>的區別:
如果不傳入引數,<isNotEmpty>不會將其中的字串拼入sql。而<isNotNull>會將其中的字串拼入sql,但是不賦值。
例如:
<insert id="insertFeeItem" parameterClass="java.util.HashMap" >
INSERT INTO PAYMENTRECORDS (
<dynamic prepend=" ">
    <isNotEmpty prepend="," property="payfee_record_id">payfee_record_id</isNotEmpty>
    <isNotNull prepend="," property="order_no">order_no</isNotNull>
</dynamic>
)VALUES(
<dynamic prepend=" ">
    <isNotEmpty prepend="," property="payfee_record_id">#payfee_record_id#</isNotEmpty>
    <isNotNull prepend="," property="order_no">#order_no#</isNotNull>
</dynamic>
)
</insert>
如果兩個引數都傳入為null,那麼拼接出的sql為
INSERT INTO PAYMENTRECORDS(order_no) VALUES("")
這裡沒有拼接payfee_record_id,而order_no只是字串的形式。

在動態拼接sql時,常常會遇到#和$,他們的區別是:
1.#是將引數按照字串傳入,$是將引數直接傳入
2.#相當於是引數變數替換,$相當於是字串的拼接
3.#可以防止sql注入,$不可以
所以能使用#的地方一定不使用$

如果不指定parameterClass,那麼任何帶有get/set方法的屬性的javabean都可以作為輸入引數。

在配置sql時,可以直接寫select * from table,但是一定要配置一個包含資料表全部列的resultMap