ibatis配置詳解二

ibatis與hibernate都是持久層的額技術框架,這裏看看ibatis的配置:作爲自己以後的參考:
  ibstis的配置主要由兩種文件,
  (一)有關項目的總體配置,如連接的數據源,連接池,緩存等的配置,也即sqlmapconfig.xml文件的配置。
  (二)sqlmap.xml文件的配置,也即對象與表的操作映射的配置。
下面分兩個部分進行記錄 

第一部分    sqlmapconfig.xml

在這個文件中總共的結構如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig> 
 
  <!-- 這裏進行文件的註釋說明 --> 
 
  <properties resource="">       ------->在這裏將項目(工程)的所有資源文件包含進來,將相對與src路徑的資源文件的路徑以及文件名包含進來 

 
  <settings  cacheModelsEnabled="true"  --->全局控制sqlMapClient的緩存
              enhancementEnabled="true" --->全局控制運行時字節碼增強,優化javabean的屬性性能
              lazyLoadingEnabled="true"  --->延遲加載
              errorTracingEnabled="true"
              maxRequests="32"   ---->同時執行sql語句的最大線程數,通常大小是maxTransactions的10倍,並且總是大於maxTransactions和maxSessions的總和。減小這個值能夠提高性能。
              maxSessions="10"
              maxTransactions="5"
              useStatementNamespaces="false"  --->是否啓動全局的sqlmap名字空間。如果啓動則應用時,必須加上名字空間:queryForObject(sqlMap的名字空間.statementName)

  />  --------->這個節點是設置工程的總體性能,根據名稱來設置 

   
  <typeAlias alias="person" type="com.Jdnis.ibatis.model.Person" />
  ----->這個節點是將長的路徑名等用短的進行替代,也就是用上面的person來代表右邊的person類 

    
    <transactionManager type="JDBC">  -->type指定事務管理器:JDBC,JTA,EXTERNAL,三者的區別後面再講到
        <dataSource type="SIMPLE">  -->type值由:SIMPLE,DBCP,JNDI三者的使用後面再講
            <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
            <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/person" />
            <property name="JDBC.Username" value="root" />
            <property name="JDBC.Password" value="root" />
            <property name="Pool.MaximumActiveConnections" value="10" />
            <property name="Pool.MaximumIdleConnections" value="5" />
            <property name="Pool.MaximumCheckoutTime" value="120000" />
            <property name="Pool.TimeToWait" value="500" />
            <property name="Pool.PingQuery" value="select 1 from sample" />
            <property name="Pool.PingEnabled" value="false" />
            <property name="Pool.PingConnectionsOlderThan" value="1" />
            <property name="Pool.PingConnectionsNotUsedFor" value="1" />
        </dataSource>
    </transactionManager>  

    ------->這個節點是來配置數據源,數據庫連接等等信息的。 
 

   <sqlMap resource="com/neusoft/ibatis/map/person.xml" />
       -->將系統中的對象與數據庫表的映射文件都包含進來上面採用的時相對路徑,當然也可以用絕對路徑:<sqlmap url="file:///C:/config/person.xml"
   
</sqlMapConfig> 
  

第二部分:sqlmap.xml映射文件

<?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="Person">
   <!-- 註釋說明 -->
  
   <cacheModel id="personCache" type="LRU">
     <flushInterval hours="24"/>
     <property name="size" value="1000"/>
   </cacheModel>
 
   <typeAlias alias="person" type="com.Jdnis.ibatis.model.Person" />
  
   <parameterMap id="personParam" class="person">
      <parameter property="id"/>
       ......
   </parameterMap>

   <resultMap id="personResult" class="person">
      <result property="id" column="PER_ID"/>
         ......
   </resultMap>

   <statement id="insertPerson" parameterClass="person">
     INSERT INTO persons VALUES(#id#,#firstName#,#lastName#,#birthDate#,#weight#,#height#)
   </statement>
   其他<statement>,<insert>,<update>,<select>,<delete>,<procedure>
</sqlMap>

註解:
  <1>statement
     屬性:id(名稱),parameterClass(輸入參數的類型),resultClass(輸出參數的類型),parameterMap(name of parameterMap),resultMap(name of reaultMap),cacheModel(name of cacheModel),其中只有一個必選屬性:id
statement 的體時sql語句,當sql有特殊字符時,將它放進CDATA塊中如:<![CDATA[select * from person where PER_D>#id#]]>

  <2>自動生成主鍵
      通過<insert>子元素<selectKey>來支持自動生成的鍵值,例如:
     ----對於oracle
    <insert id="insertPerson-Oracl" parameterClass="person">
       <selectKey resultClass="int" keyProperty="id">
          SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
       </selectKey>
       insert into
       PERSON(PER_ID,PER_FIRST.....)
       values(#id#,#firstName#....);
    </insert>
    --->對於sqlServer
    <insert id="insertPerson-sqlServer" parameterClass="person">
       insert into
       PERSON(PER_FIRST.....)
       values(#firstName#....);
       <selectKey resultClass="int" keyProperty="id">
          SELECT @@IDENTITY AS ID
       </selectKey>
    </insert>

  <3>存儲過程
<parameterMap id="swapParameters" class="map">
   <parameter property="email1" jdbcType="varchar" javaType="java.lang.String" model="INOUT"/>
<parameter property="email12" jdbcType="varchar" javaType="java.lang.String" model="INOUT"/>
  </parameterMap>
  <procedure id="swapEmailAddresses" parameterMap="swapParameters">
    {call swap_email_addres(?,?)}
  </procedure>

  <4>parameterClass 輸入參數的類類型
  <5>resultClass 輸出參數的類類型
  <6>parameterMap
     用到預處理的PreparedStatement,將要進行預處理的數據,先放到parameterMap元素中,接着引用parameterMap元素:例如:
<parameterMap id="insert-person-param" class="person">
  <parameter property="id"/>
  <parameter property="firstName"/>
  <parameter property="lastName"/>
  <parameter property="birthDate"/>
  <parameter property="weight">
  <parameter property="height"/>
</parameterMap>
<statement id="insertPerson" parameterMap="insert-person-param">
  insert into person values(?,?,?,?,?,?);
</statement>

<7>resultMap結果映射到預先定義的resultMap中
<resultMap id="get-person" resultClass="person">
  <result property="id" column="PER_ID"/>
  <result property="firstName" column="PER_FIRST_NAME"/>
  ......
</resultMap>
<statement id="getPerson" resuleMap="get-person">
  select * from person
<statement>

  <8>cacheModel定義查詢緩存
<cacheModel id="person-cache" implementation="LRU">
  <flushInterval hours="24">
  <flushOnExecute statement="insertPerson"/>
  <flushOnExecute statement="updatePerson"/>
  <flushOnExecute statement="deletePerson"/>
   ...... 
  <property name="size" value="1000"/>
</cacheModel>
<statement id="getPerson" parameterClass="int" cacheModel="person-cache">
  <![CDATA[select * from person where PER_ID=#id#]]>
</statement>
  註解:每隔24小時,就會清除緩衝區,除非執行了insertPerson,updatePerson,deletePerson操作(立即清除緩衝區)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章