轉載iBATIS學習總結

摘自:http://blog.csdn.net/guo_rui22/archive/2009/02/14/3890005.aspx

iBATIS學習總結

=========================== SqlMapConfig ===========================

1、classpath依賴項目

下載最新 ibatis-x.x.x.xxx.zip 文件,獲取最新的 ibatis-2.3.4.726.jar,
並根據其中 jar-dependencies 文件的描述下載 iBATIS 依賴的 jar 包,把以上
jar 包添加到項目 classpath 中。

2、SQL Map 配置文件

2.1、SQL Map 配置文件擁有唯一的<properties>元素

<properties resource="com/newbee/SqlMapConfig.properties" />

2.2、/sqlMapConfig/settings 全局參數

cacheModelsEnabled="true" # 全局性地啓用或禁用SqlMapClient的所有緩存model
enhancementEnabled="true" # 全局性地啓用或禁用運行時字節碼增強,以優化訪問Java Bean屬性的性能
lazyLoadingEnabled="true" # 全局性地啓用或禁用SqlMapClient的所有延遲加載
maxRequests="32" # 同時執行SQL語句的最大線程數
maxSessions="10" # 同一時間內活動的最大session數
maxTransactions="5" # 同時進入SqlMapClient.startTransaction()的最大線程數
useStatementNamespaces="false" # 使用全限定名來引用mapped statement

2.3、dataSource 類型

2.3.1、SIMPLE 類型

<transactionManager type="JDBC" commitRequired="false"> # commitRequired 查詢語句select是否需要提交
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>

2.3.2、DBCP 類型(CS應用推薦)

<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<!-- Use of the validation query can be problematic.
If you have difficulty, try without it. -->
<property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>

2.3.3、JNDI 類型(服務器推薦)

<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/newbee"/>
</dataSource>
</transactionManager>

3、/sqlMapConfig/sqlMap Map文件引用參數

<sqlMap resource="com/newbee/domain/Account.xml" />

=========================== SqlMap ===========================

1、namespace 命名空間,避免屬性名稱衝突

<sqlMap namespace="Account">

2、<typeAlias>元素讓您爲一個通常較長的、全限定類名指定一個較短的別名

<typeAlias alias="Account" type="com.newbee.domain.Account"/> # 這裏定義

<resultMap id="AccountResult" class="Account"> # 這裏使用
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
<result property="lastName" column="ACC_LAST_NAME"/>
<result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>

3、<statement>元素是個通用聲明,可以用於任何類型的SQL語句,甚至包含多個語句(用;分隔)。通常,使用下面具體的statement類型是個好主意。

<insert>
<update>
<delete>
<select>
<procedure>

4、特殊SQL字符:因爲SQL語句是嵌在XML文檔中的,因此有些特殊的字符不能直接使用,例如大於號和小於號(<>)。
只需將包含特殊字符的SQL語句放在XML的CDATA區裏面就可以了

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

3、自動生成主鍵:很多數據庫支持自動生成主鍵的數據類型。不過這通常(並不總是)是個私有的特性。
SQL Map通過<insert>的子元素<selectKey>來支持自動生成的鍵值。它同時支持預生成(如Oracle)
和後生成兩種類型(如MS-SQL Server)。這個值就是SQL Map執行 insert() 方法的返回值。

<!—Oracle SEQUENCE Example -->
<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>

4、SQL Map通過<procedure>元素支持存儲過程。如果參數的mode屬性設爲INOUT或OUT,則參數對象的值被修改,IN參數對象
的值不會被修改。

<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>

5、SQL 輸入參數(是對單一參數的描述)

5.1、定義Java Bean作爲輸入參數(parameterClass、parameterMap 和 Inline Parameter 混合使用)

簡化版:

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

精確版:(date類型對應的字段要指定字段類型,可以爲空字段要指定字段類型和空值判斷,不支持Blob字段類型)

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

5.2、基本類型輸入參數

假如沒必要寫一個Java Bean作爲參數,可以直接使用基本類型的包裝類(即String,Integer,Date等)作爲參數。

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

5.3、Map類型輸入參數

假如沒必要寫一個Java Bean作爲參數,而要傳入的參數又不只一個時,可以使用Map類(如HashMap,TreeMap等)作爲參數對象。

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

6、SQL 返回值 (是對單一返回值的描述)

6.1、定義Java Bean作爲返回值

簡化版:

<statement id="getProduct" resultClass="com.ibatis.example.Product">
select
PRD_ID as id, # id 字段屬性
PRD_DESCRIPTION as description # description 字段屬性
from PRODUCT
where PRD_ID = #value#
</statement>

精確版:(date類型對應的字段要指定字段類型,可以爲空字段要指定字段類型和空值判斷,已經支持Blob字段類型)

<resultMap id="get-product-result" class="com.ibatis.example.Product">
<result property="id" column="PRD_ID"/>
<result property="description" column="PRD_DESCRIPTION" jdbcType="VARCHAR" nullValue="NO_ENTRY"/>
</resultMap>

<statement id="getProduct" resultMap="get-product-result">
select
PRD_ID as id, # id 字段屬性
PRD_DESCRIPTION as description # description 字段屬性
from PRODUCT
where PRD_ID = #value#
</statement>

6.2、基本類型返回值

<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(*) as value
from PRODUCT
</statement>

6.3、Map類型返回值

<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>

7、緩存Mapped Statement結果集(只在select中使用)

7.1、定義緩存模式

<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/> # 24小時自動刷新一次,也有其他單位
<flushOnExecute statement="insertProduct"/> # 指定在執行了哪個statement後要刷新一次
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” /> # 緩存的大小
</cacheModel>

7.2、使用緩存模式

<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

8、動態Mapped Statement

8.1、二元動態條件

<isEqual> 比較屬性值和靜態值或另一個屬性值是否相等。
<isNotEqual> 比較屬性值和靜態值或另一個屬性值是否不相等。
<isGreaterThan> 比較屬性值是否大於靜態值或另一個屬性值。
<isGreaterEqual> 比較屬性值是否大於等於靜態值或另一個屬性值。
<isLessThan> 比較屬性值是否小於靜態值或另一個屬性值。
<isLessEqual> 比較屬性值是否小於等於靜態值或另一個屬性值。

可用屬性:

prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 被比較的屬性(必選)
compareProperty - 另一個用於和前者比較的屬性(必選或選擇compareValue)
compareValue - 用於比較的值(必選或選擇compareProperty)

例子:

<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0"> # 二元條件,and 會被 where 覆蓋
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>

8.2、一元動態條件

<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)。

可用屬性:

prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 被比較的屬性(必選)

8.3、其他動態條件

8.3.1、Parameter Present:這些元素檢查參數對象是否存在

<isParameterPresent>
檢查是否存在參數對象(不爲null)。
<isNotParameterPresent>
檢查是否不存在參數對象(參數對象爲null)。

可用屬性:

prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)

例子:

<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>

8.3.2、Iterate:這屬性遍歷整個List集合,併爲集合中的每個元素重複內容。

<iterate> 遍歷類型爲java.util.List的元素。

可用屬性:

prepend - 可被覆蓋的SQL語句組成部分,添加在語句的前面(可選)
property - 類型爲java.util.List的用於遍歷的元素(必選)
open - 整個遍歷內容體開始的字符串,用於定義括號(可選)
close -整個遍歷內容體結束的字符串,用於定義括號(可選)
conjunction - 每次遍歷內容之間的字符串,用於定義AND或OR(可選)

例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]# -- []不要丟掉了
</iterate>

8.3.3、動態SQL元素

幫助實現動態的order by子句,動態的查詢字段或SQL語句的其他動態部分。
它從根本上改變了SQL語句本身,比僅僅簡單地改變參數值嚴重得多。
它使用$而不是#包括動態變量。

<statement id=”getProduct” resultMap=”get-product-result”>
select * from PRODUCT order by $preferredOrder$
</statement>

9、批處理SQL

sqlMap.startBatch();
// execute statements in between
sqlMap.executeBatch();

10、事務相關

10.1、默認每執行一個SQL就會自動提交併管理事務

10.2、如果使用了以下的代碼,就要自己管理事務了

try {
sqlMap.startTransaction ();
// insert,update,delete statements
sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}

11、配置log4j顯示執行的SQL

11.1、拷貝 log4j.jar 到項目類路徑中
11.2、配置 log4j.properties 文件全部內容如下(放在源代碼文件夾根目錄下)

#--------------------------------
# LEVEL = FATAL ERROR WARN INFO DEBUG

log4j.rootLogger=DEBUG, stdout, fileout # BEBUG 改爲其他級別則不再顯示SQL

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=/home/guo/ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/guo_rui22/archive/2009/02/14/3890005.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章