iBATIS學習總結

來源:互聯網
上載者:User

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 
 
 
       
       
       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.