mybatis、ibatis、spring各類整合方式

mybatis是ibatis的升級版,spring也有自帶mybatis的orm。因此,搭建ibatis的框架也會有多種方式(我這裏mybatis是3.0的,ibatis是2.3的,spring是3.0的,數據庫是mysql)。下面介紹3中方式html

1,只是用mybatis3。java

2,使用mybatis3+spring3(使用mybatis的SqlSessionFactory )。mysql

3,使用ibatis2.3+spring(使用spring自帶的ibatis)web

spring的orm包中只有ibatis,沒有mybatis。而mybatis和ibatis仍是有些區別的,好比配置文件屬性不一樣。spring

 

 

第一種方式(只使用mybatis):sql

1)jar包:數據庫

cglib-2.2.jar
asm-3.1.jar
mysql-connector-java-3.1.13.jar
mybatis-3.0.5.jarexpress

junit.jarapache

2)mybatis配置文件:編程

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  

  2. <configuration>  

  3.     <!-- 參數設置 -->  

  4.     <settings>  

  5.         <!-- 這個配置使全局的映射器啓用或禁用緩存 -->  

  6.         <setting name="cacheEnabled" value="true"/>  

  7.         <!-- 全局啓用或禁用延遲加載。當禁用時,全部關聯對象都會即時加載 -->  

  8.         <setting name="lazyLoadingEnabled" value="true"/>  

  9.         <!-- 當啓用時,有延遲加載屬性的對象在被調用時將會徹底加載任意屬性。不然,每種屬性將會按須要加載 -->  

  10.         <setting name="aggressiveLazyLoading" value="true"/>  

  11.         <!-- 容許或不容許多種結果集從一個單獨的語句中返回(須要適合的驅動) -->  

  12.         <setting name="multipleResultSetsEnabled" value="true"/>  

  13.         <!-- 使用列標籤代替列名。不一樣的驅動在這方便表現不一樣。參考驅動文檔或充分測試兩種方法來決定所使用的驅動 -->  

  14.         <setting name="useColumnLabel" value="true"/>  

  15.         <!-- 容許JDBC支持生成的鍵。須要適合的驅動。若是設置爲true則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(好比Derby) -->  

  16.         <setting name="useGeneratedKeys" value="true"/>  

  17.         <!-- 指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意複雜的結果(嵌套的或其餘狀況) -->  

  18.         <setting name="autoMappingBehavior" value="PARTIAL"/>  

  19.         <!-- 配置默認的執行器。SIMPLE執行器沒有什麼特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->  

  20.         <setting name="defaultExecutorType" value="SIMPLE"/>  

  21.         <!-- 設置超時時間,它決定驅動等待一個數據庫響應的時間 -->  

  22.         <setting name="defaultStatementTimeout" value="25000"/>  

  23.     </settings>  

  24.       

  25.     <!-- 別名定義 -->  

  26.     <typeAliases>  

  27.         <typeAlias alias="pageAccessURL"  type="com.lgm.mybatis.model.PageAccessURL" />  

  28.     </typeAliases>  

  29.       

  30.     <environments default="development">  

  31.         <!-- 環境配置1,每一個SqlSessionFactory對應一個環境 -->  

  32.         <environment id="development1">  

  33.             <!--    

  34.                 事務配置 typeJDBC、MANAGED  

  35.                 1.JDBC:這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴於從數據源獲得的鏈接來管理事務範圍。  

  36.                 2.MANAGED:這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接。而它會讓容器來管理事務的整個生命週期(好比Spring或JEE應用服務器的上下文)。  

  37.                 默認狀況下它會關閉鏈接。然而一些容器並不但願這樣,所以若是你須要從鏈接中中止它,將closeConnection屬性設置爲false  

  38.               

  39.             -->  

  40.             <transactionManager type="JDBC"/>  

  41.             <!--   

  42.             <transactionManager type="MANAGED">  

  43.                 <property name="closeConnection" value="false"/>  

  44.             </transactionManager>  

  45.              -->  

  46.              <!--    

  47.                 數據源類型:type = UNPOOLED、POOLED、JNDI  

  48.                 1.UNPOOLED:這個數據源的實現是每次被請求時簡單打開和關閉鏈接。它有一點慢,這是對簡單應用程序的一個很好的選擇,由於它不須要及時的可用鏈接。  

  49.                 不一樣的數據庫對這個的表現也是不同的,因此對某些數據庫來講配置數據源並不重要,這個配置也是閒置的  

  50.                 2.POOLED:這是JDBC鏈接對象的數據源鏈接池的實現,用來避免建立新的鏈接實例時必要的初始鏈接和認證時間。  

  51.                 這是一種當前Web應用程序用來快速響應請求很流行的方法。  

  52.                 3.JNDI:這個數據源的實現是爲了使用如Spring或應用服務器這類的容器,容器能夠集中或在外部配置數據源,而後放置一個JNDI上下文的引用  

  53.              -->  

  54.             <dataSource type="UNPOOLED">  

  55.                 <property name="driver" value="com.mysql.jdbc.Driver"/>  

  56.                 <property name="url" value="jdbc:mysql://localhost:3306/appdb"/>  

  57.                 <property name="username" value="root"/>  

  58.                 <property name="password" value="123456"/>  

  59.                 <!--    

  60.                 默認鏈接事務隔離級別  

  61.                 <property name="defaultTransactionIsolationLevel" value="" />  

  62.                 -->  

  63.             </dataSource>  

  64.               

  65.         </environment>  

  66.           

  67.         <!-- 環境配置2 -->  

  68.         <environment id="development2">  

  69.             <transactionManager type="JDBC"/>  

  70.             <dataSource type="POOLED">  

  71.                 <property name="driver" value="com.mysql.jdbc.Driver"/>  

  72.                 <property name="url" value="jdbc:mysql://localhost:3306/appdb"/>  

  73.                 <property name="username" value="root"/>  

  74.                 <property name="password" value="123456"/>  

  75.                 <!-- 在任意時間存在的活動(也就是正在使用)鏈接的數量 -->  

  76.                 <property name="poolMaximumActiveConnections" value="10"/>  

  77.                 <!-- 任意時間存在的空閒鏈接數 -->  

  78.                 <property name="poolMaximumIdleConnections" value="5"/>  

  79.                 <!-- 在被強制返回以前,池中鏈接被檢查的時間 -->  

  80.                 <property name="poolMaximumCheckoutTime" value="20000"/>  

  81.                 <!-- 這是給鏈接池一個打印日誌狀態機會的低層次設置,還有從新嘗試得到鏈接,這些狀況下每每須要很長時間(爲了不鏈接池沒有配置時靜默失敗) -->  

  82.                 <property name="poolTimeToWait" value="20000"/>  

  83.                 <!-- 發送到數據的偵測查詢,用來驗證鏈接是否正常工做,而且準備接受請求。 -->  

  84.                 <property name="poolPingQuery" value="NO PING QUERY SET"/>  

  85.                 <!-- 這是開啓或禁用偵測查詢。若是開啓,你必須用一個合法的SQL語句(最好是很快速的)設置poolPingQuery屬性 -->  

  86.                 <property name="poolPingEnabled" value="false"/>  

  87.                 <!-- 這是用來配置poolPingQuery屢次時間被用一次。這能夠被設置匹配標準的數據庫鏈接超時時間,來避免沒必要要的偵測 -->  

  88.                 <property name="poolPingConnectionsNotUsedFor" value="0"/>  

  89.             </dataSource>  

  90.         </environment>  

  91.           

  92.         <!-- 環境配置3 -->  

  93.         <environment id="development3">  

  94.             <transactionManager type="JDBC"/>  

  95.             <dataSource type="JNDI">  

  96.                 <property name="data_source" value="java:comp/env/jndi/mybatis"/>  

  97.                 <property name="env.encoding" value="UTF8"/>  

  98.                 <!--   

  99.                 <property name="initial_context" value=""/>  

  100.                 <property name="env.encoding" value="UTF8"/>  

  101.                  -->  

  102.             </dataSource>  

  103.         </environment>  

  104.                   

  105.     </environments>  

  106.   

  107.     <!-- 映射文件,存放sql語句的配置文件 -->  

  108.     <mappers>  

  109.         <mapper resource="com/lgm/mybatis/config/pageAccessURL.xml"/>  

  110.     </mappers>  

  111.   

  112. </configuration>  


 

其中<environments>屬性是數據源環境配置,能夠配置多個數據源配置。每一個<environment>屬性表明一種配置方式。

加載事務配置<transactionManager > 和數據源配置<dataSource >。

<transactionManager >  有兩種配置方式,分別是JDBC和MANAGED,詳細說明見配置註釋。

<dataSource > 有三種配置方式,分別是UNPOOLED、POOLED、JNDI,詳細說明見配置註釋。

<typeAliases>定義別名,使用指定的別名來定義。

注:關於JNDI的配置,見tomcat的幾種JNDI配置方法

3)mybatis的sql映射配置文件:

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  

  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

  4.   

  5. <mapper namespace="pageAccessURL" >  

  6.   

  7.     <!--   

  8.          cache - 配置給定命名空間的緩存。  

  9.          cache-ref – 從其餘命名空間引用緩存配置。  

  10.          resultMap – 最複雜,也是最有力量的元素,用來描述如何從數據庫結果集中來加載你的對象。  

  11.          parameterMap – 已經被廢棄了!老式風格的參數映射。內聯參數是首選,這個元素可能在未來被移除。這裏不會記錄。  

  12.          sql – 能夠重用的SQL塊,也能夠被其餘語句引用。  

  13.          insert – 映射插入語句  

  14.          update – 映射更新語句  

  15.          delete – 映射刪除語句  

  16.          select – 映射查詢語句  

  17.     -->  

  18.       

  19.     <!-- 默認不開啓二級緩存,開啓緩存<cache  eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>  

  20.         eviction:緩存策略 eviction = LRU、FIFO、SOFT、WEAK(默認LRU)  

  21.             1)LRU:最近最少使用的:移除最長時間不被使用的對象  

  22.             2)FIFO:先進先出:按對象進入緩存的順序來移除它們。  

  23.             3)SOFT:軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。  

  24.             4)WEAK:弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。  

  25.         flushInterval:刷新間隔 )能夠被設置爲任意的正整數,並且它們表明一個合理的毫秒形式的時間段。  

  26.          默認狀況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。  

  27.         size:引用數目 能夠被設置爲任意正整數,要記住你緩存的對象數目和你運行環境的可用內存資源數目。默認值是1024。  

  28.         readOnly:屬性能夠被設置爲true或false。只讀的緩存會給全部調用者返回緩存對象的相同實例。所以這些對象不能被修改。  

  29.         這提供了很重要的性能優點。可讀寫的緩存會返回緩存對象的拷貝(經過序列化)。這會慢一些,可是安全,所以默認是false。  

  30.         ----------------------------------------------------------------------------------------------  

  31.         使用自定義緩存  

  32.         <cache type=」com.domain.something.MyCustomCache」>  

  33.             <property name=」cacheFile」 value=」/tmp/my-custom-cache.tmp」/>  

  34.         </cache>  

  35.         type屬性指定的類必須實現org.mybatis.cache.Cache接口  

  36.         ----------------------------------------------------------------------------------  

  37.         引用另外的緩存<cache-ref namespace=」com.someone.application.data.SomeMapper」/>  

  38.     -->  

  39.       

  40.       

  41.     <!--    

  42.         select元素:  

  43.         1)parameterType:參數類型  

  44.         2)resultType:從這條語句中返回的指望類型的類的徹底限定名或別名。  

  45.         注意集合情形,那應該是集合能夠包含的類型,而不能是集合自己。使用resultType或resultMap,但不能同時使用。  

  46.         3)resultMap:命名引用外部的resultMap。返回map是MyBatis最具力量的特性,對其有一個很好的理解的話,許多複雜映射的情形就能被解決了。  

  47.         使用resultMap或resultType,但不能同時使用。  

  48.         4)flushCache:是否清空緩存,默認false,不清空,若是爲true每次查詢都會清空緩存。  

  49.         5)useCache:將其設置爲true,將會致使本條語句的結果被緩存。默認值:true。  

  50.         6)fetchSize:這是暗示驅動程序每次批量返回的結果行數。默認不設置(驅動自行處理)。  

  51.         7)statementType:STATEMENT,PREPARED或CALLABLE的一種。這會讓MyBatis使用選擇使用  

  52.         Statement,PreparedStatement或CallableStatement。默認值:PREPARED。  

  53.         8)resultSetType:FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一種。默認是不設置(驅動自行處理)。  

  54.     -->  

  55.     <!-- 這裏的pageAccessURL是由typeAliases定義的 -->  

  56.       

  57.     <select id="selectPageAccessURL" parameterType="int" resultType="pageAccessURL" >  

  58.         select * from tables where URL_ID = #{id}  

  59.     </select>  

  60.       

  61.     <select id="selectPageAccessURLByClass" parameterType="pageAccessURL" resultType="pageAccessURL">  

  62.         select * from tables where URL_ID = #{urlId} and URL = #{url}  

  63.     </select>  

  64.   

  65.     <!--   

  66.         sql:這個元素能夠被用來定義可重用的SQL代碼段,能夠包含在其餘語句中。 

  67.     -->  

  68.     <sql id="usercolumns">URL_ID as urlId,url,moduleId,state,mark</sql>  

  69.     <select id="selectPageAccessURL2" parameterType="int" resultType="pageAccessURL">  

  70.         select <include refid="usercolumns" />    

  71.         from tables where URL_ID = #{id}  

  72.     </select>  

  73.           

  74.     <!-- 動態sql語句 使用OGNL表達式-->  

  75.       

  76.     <!--    

  77.         resultMap 元素:  

  78.             1)constructor:類在實例化時,用來注入結果到構造方法中  

  79.                 a)idArg:ID參數;標記結果做爲ID能夠幫助提升總體效能  

  80.                 b)arg:注入到構造方法的一個普通結果  

  81.             2)id:一個ID結果;標記結果做爲ID能夠幫助提升總體效能  

  82.             3)result:注入到字段或JavaBean屬性的普通結果  

  83.             4)association:一個複雜的類型關聯;許多結果將包成這種類型  

  84.             5)collection:複雜類型的集  

  85.             6)discriminator:使用結果值來決定使用哪一個結果映射  

  86.                 a)case:基於某些值的結果映射  

  87.             ---------------------------------------------------   

  88.         resultMap下 id、result 元素:  

  89.             1)property:映射到列結果的字段或屬性  

  90.             2)column:從數據庫中獲得的列名,或者是列名的重命名標籤。這也是一般和會傳遞給resultSet.getString(columnName)方法參數中相同的字符串。  

  91.             3)javaType:一個Java類的徹底限定名,或一個類型別名(參加上面內建類型別名的列表)。若是你映射到一個JavaBean,MyBatis一般能夠判定類型。  

  92.             然而,若是你映射到的是HashMap,那麼你應該明確地指定javaType來保證所需的行爲。  

  93.             4)jdbcType:在這個表格以後的所支持的JDBC類型列表中的類型。JDBC類型是僅僅須要對插入,更新和刪除操做可能爲空的列進行處理。  

  94.             這是JDBC的須要,而不是MyBatis的。若是你直接使用JDBC編程,你須要指定這個類型-但僅僅對可能爲空的值。  

  95.             5)typeHandler:。使用這個屬性,你能夠覆蓋默認的類型處理器。這個屬性值是類的徹底限定名或者是一個類型處理器的實現,或者是類型別名。  

  96.         resultMap下 constructor 元素:將查詢到的對象映射到javabean時,若是javabean的構造函數有參數,則可使用該元素來指定  

  97.         resultMap下 association 元素:關聯,好比查詢博客和該博客的用戶,經過博客關聯用戶,association裏面就是用戶屬性。  

  98.         resultMap下 collection 元素:集合,一個博客下有不少文章,collection就是存放文章的集合屬性。  

  99.         resultMap下 discriminator 元素:鑑別器,有時一個單獨的數據庫查詢也許返回不少不一樣(可是但願有些關聯)數據類型的結果集。  

  100.         鑑別器元素就是被設計來處理這個狀況的,還有包括類的繼承層次結構。鑑別器很是容易理解,由於它的表現很像Java語言中的switch語句。  

  101.         <resultMap id="detailedBlogResultMap" type="Blog">  

  102.             <constructor>  

  103.                 <idArg column="blog_id" javaType="int"/>  

  104.             </constructor>  

  105.             <result property="title" column="blog_title"/>  

  106.             <association property="author" column="blog_author_id" javaType=" Author">  

  107.                 <id property="id" column="author_id"/>  

  108.                 <result property="username" column="author_username"/>  

  109.                 <result property="password" column="author_password"/>  

  110.                 <result property="email" column="author_email"/>  

  111.                 <result property="bio" column="author_bio"/>  

  112.                 <result property="favouriteSection" column="author_favourite_section"/>  

  113.             </association>  

  114.             <collection property="posts" ofType="Post">  

  115.                 <id property="id" column="post_id"/>  

  116.                 <result property="subject" column="post_subject"/>  

  117.                 <association property="author" column="post_author_id" javaType="Author"/>  

  118.                 <collection property="comments" column="post_id" ofType=" Comment">  

  119.                     <id property="id" column="comment_id"/>  

  120.                 </collection>  

  121.                 <collection property="tags" column="post_id" ofType=" Tag" >  

  122.                     <id property="id" column="tag_id"/>  

  123.                 </collection>  

  124.                 <discriminator javaType="int" column="draft">  

  125.                     <case value="1" resultType="DraftPost">  

  126.                         <result property=」doorCount」 column="door_count" />  

  127.                     </case>  

  128.                 </discriminator>  

  129.             </collection>  

  130.         </resultMap>            

  131.     -->  

  132.           

  133.     <!-- insert 元素:  

  134.         1)useGeneratedKeys:這會告訴MyBatis使用JDBC的getGeneratedKeys方法來取出由數據  

  135.         (好比:像MySQL和SQL Server這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值:false。  

  136.         2)keyProperty:標記一個屬性(自動生成的那個屬性,好比主鍵id),MyBatis會經過getGeneratedKeys或者經過insert語句的selectKey子元素設置它的值。默認:不設置。  

  137.       

  138.     -->  

  139.     <insert id="insertTest" >  

  140.         <!--    

  141.         selectKey :在插入數據前先執行selectKey語句,將返回的值做爲keyProperty屬性值插入  

  142.             1)order:這能夠被設置爲BEFORE或AFTER。若是設置爲BEFORE,那麼它會首先選擇主鍵,設置keyProperty而後執行插入語句。  

  143.             若是設置爲AFTER,那麼先執行插入語句,而後是selectKey元素-這和如Oracle數據庫類似,能夠在插入語句中嵌入序列調用。     

  144.             2)statementType:和前面的相同,MyBatis支持STATEMENT,PREPARED和CALLABLE語句的映射類型,分別表明PreparedStatement和CallableStatement類型。   

  145.         -->  

  146.         <selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">  

  147.             SELECT FLOOR(1 + (RAND() * 1000000));   

  148.         </selectKey>  

  149.         insert into table values(xx,xx);  

  150.     </insert>  

  151.   

  152.       

  153. </mapper>  

  154.   

  155.    


4)測試方法:

[html] view plain copy print?

  1.     public void testSelect(){  

  2.           

  3.         try {  

  4.             Reader reader = Resources.getResourceAsReader("mybatis-config-mappings.xml");  

  5.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,"development1");  

  6.             SqlSession session = sqlSessionFactory.openSession();  

  7.             PageAccessURL pageAccessURL =(PageAccessURL)session.selectOne("selectPageAccessURL2", 70001);  

  8. //            

  9. //          PageAccessURL page = new PageAccessURL();  

  10. //          page.setUrlId("70001");  

  11. //          page.setUrl("warrantAndCbbcInfo.jsp");  

  12. //          PageAccessURL pageAccessURL =(PageAccessURL)session.selectOne("selectPageAccessURLByClass",page);  

  13.               

  14.             session.close();  

  15.             reader.close();  

  16.             System.out.println(pageAccessURL.getUrl());  

  17.         } catch (IOException e) {  

  18.             System.out.println(e);  

  19.         }  

  20.     }  


SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,"development1"); 後面的development1是前面講的數據源配置方式之一。若是要測試jndi的,則要經過容器加載後進行。

 

 

 第二種方式(mybatis3.0+spring3.0,spring自帶的orm中,只有ibatis的,沒有mybatis,因此使用mybatis3和spring整合的話只能用SqlSessionFactory 了)

 

1)jar包:

mybatis-3.0.5.jar
mysql-connector-java-3.1.13.jar
cglib-2.2.jar
asm-3.1.jar
aopalliance-1.0.jar
commons-logging-1.1.1.jar
hsqldb-1.8.0.10.jar
jstl-1.2.jar
log4j-1.2.16.jar
mybatis-spring-1.0.1.jar
spring-aop-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-core-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-jdbc-3.0.5.RELEASE.jar
spring-tx-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
stripes-1.5.6.jar
commons-dbcp-1.2.2.jar
commons-pool-1.3.jar

junit.jar

2)spring配置文件:

applicationContext.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

  3.   

  4. <beans>  

  5.     <import resource="applicationContext-dao.xml" />  

  6. </beans>  


applicationContext.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

  3.   

  4. <beans>  

  5.   

  6.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

  7.         <property name="dataSource" ref="dataSource" />  

  8.     </bean>  

  9.       

  10.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  

  11.         <property name="configLocation" value="classpath:mybatis-config-mappings.xml" />  

  12.         <property name="dataSource" ref="dataSource" />  

  13.     </bean>  

  14.       

  15.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  

  16.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  

  17.         <property name="url" value="jdbc:mysql://localhost.hk:3306/appdb" />  

  18.         <property name="username" value="root" />  

  19.         <property name="password" value="123456" />  

  20.         <property name="maxActive" value="100" />  

  21.         <property name="maxIdle" value="5" />  

  22.         <property name="minEvictableIdleTimeMillis" value="300000" />  

  23.         <property name="timeBetweenEvictionRunsMillis" value="120000" />  

  24.         <property name="validationQuery" value="SELECT 1" />  

  25.         <property name="testWhileIdle" value="true" />  

  26.         <property name="testOnReturn" value="true" />  

  27.         <property name="testOnBorrow" value="true" />  

  28.     </bean>  

  29.   

  30.     <bean id="pageAccessURLManager" class="com.lgm.mybatis.manager.PageAccessURLManager">  

  31.         <property name="sqlSessionFactory" ref="sqlSessionFactory" />  

  32.     </bean>  

  33.   

  34. </beans>  


關於spring的其餘數據源配置,這裏就不寫了。

4)mybatis的配置文件:

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  

  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">  

  4.   

  5. <configuration>  

  6.     <settings>  

  7.         <!-- 這個配置使全局的映射器啓用或禁用緩存 -->  

  8.         <setting name="cacheEnabled" value="true"/>  

  9.         <!-- 全局啓用或禁用延遲加載。當禁用時,全部關聯對象都會即時加載 -->  

  10.         <setting name="lazyLoadingEnabled" value="true"/>  

  11.         <!-- 當啓用時,有延遲加載屬性的對象在被調用時將會徹底加載任意屬性。不然,每種屬性將會按須要加載 -->  

  12.         <setting name="aggressiveLazyLoading" value="true"/>  

  13.         <!-- 容許或不容許多種結果集從一個單獨的語句中返回(須要適合的驅動) -->  

  14.         <setting name="multipleResultSetsEnabled" value="true"/>  

  15.         <!-- 使用列標籤代替列名。不一樣的驅動在這方便表現不一樣。參考驅動文檔或充分測試兩種方法來決定所使用的驅動 -->  

  16.         <setting name="useColumnLabel" value="true"/>  

  17.         <!-- 容許JDBC支持生成的鍵。須要適合的驅動。若是設置爲true則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(好比Derby) -->  

  18.         <setting name="useGeneratedKeys" value="true"/>  

  19.         <!-- 指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意複雜的結果(嵌套的或其餘狀況) -->  

  20.         <setting name="autoMappingBehavior" value="PARTIAL"/>  

  21.         <!-- 配置默認的執行器。SIMPLE執行器沒有什麼特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->  

  22.         <setting name="defaultExecutorType" value="SIMPLE"/>  

  23.         <!-- 設置超時時間,它決定驅動等待一個數據庫響應的時間 -->  

  24.         <setting name="defaultStatementTimeout" value="25000"/>  

  25.     </settings>  

  26.       

  27.     <!-- 別名定義 -->  

  28.     <typeAliases>  

  29.         <typeAlias alias="pageAccessURL"  type="com.lgm.mybatis.model.PageAccessURL" />  

  30.     </typeAliases>  

  31.       

  32.   

  33.     <!-- 映射文件,存放sql語句的配置文件 -->  

  34.     <mappers>  

  35.         <mapper resource="com/lgm/mybatis/config/pageAccessURL.xml"/>  

  36.     </mappers>  

  37.   

  38. </configuration>  


使用了spring管理的話,這裏就不用設置數據源等其餘配置了

5)mybatis的sql映射文件配置:

同方式一配置的sql映射文件配置

6)配置DAO層:

[html] view plain copy print?

  1. public class PageAccessURLManager {  

  2.   

  3.   

  4.     private SqlSessionFactory sqlSessionFactory ;  

  5.   

  6.     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {  

  7.         this.sqlSessionFactory = sqlSessionFactory;  

  8.     }  

  9.       

  10.     public PageAccessURL getPageAccessURL(int url_id){  

  11.         PageAccessURL page = (PageAccessURL)sqlSessionFactory.openSession().selectOne("selectPageAccessURL",url_id);  

  12.         System.out.println(page.getUrl());  

  13.         return page;  

  14.     }  

  15. }  


7)測試:

[html] view plain copy print?

  1. public void testSelect() {  

  2.     ApplicationContext tx = new ClassPathXmlApplicationContext("applicationContext.xml");  

  3.     PageAccessURLManager page = (PageAccessURLManager)tx.getBean("pageAccessURLManager");  

  4.     page.getPageAccessURL(123456);  

  5. }  


 

 

 

第三種方式(ibatis2.3+spring3):

1)jar包:

mysql-connector-java-3.1.13.jar
log4j-1.2.16.jar
org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.orm-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.context.support-3.0.5.RELEASE.jar
commons-logging-1.1.1.jar
spring-asm-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-jdbc-3.0.5.RELEASE.jar
spring-tx-3.0.5.RELEASE.jar
commons-dbcp-1.2.2.jar
commons-pool-1.3.jar
ibatis-2.3.0.677.jar

junit.jar

2)spring配置文件:

applicationContext.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

  3.   

  4. <beans>  

  5.     <import resource="applicationContext-dao.xml" />  

  6. </beans>  


applicationContext-dao.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

  3.   

  4. <beans>  

  5.   

  6.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  

  7.         <property name="dataSource" ref="dataSource" />  

  8.     </bean>  

  9.       

  10.     <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  

  11.         <property name="configLocation" value="classpath:mybatis-config-mappings.xml" />  

  12.         <property name="dataSource" ref="dataSource" />  

  13.     </bean>  

  14.   

  15.       

  16.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  

  17.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  

  18.         <property name="url" value="jdbc:mysql://localhost:3306/appdb" />  

  19.         <property name="username" value="root" />  

  20.         <property name="password" value="123456" />  

  21.         <property name="maxActive" value="100" />  

  22.         <property name="maxIdle" value="5" />  

  23.         <property name="minEvictableIdleTimeMillis" value="300000" />  

  24.         <property name="timeBetweenEvictionRunsMillis" value="120000" />  

  25.         <property name="validationQuery" value="SELECT 1" />  

  26.         <property name="testWhileIdle" value="true" />  

  27.         <property name="testOnReturn" value="true" />  

  28.         <property name="testOnBorrow" value="true" />  

  29.     </bean>  

  30.   

  31.     <bean id="pageAccessURLManager" class="com.lgm.mybatis.manager.PageAccessURLManager">  

  32.         <property name="sqlMapClient" ref="sqlMapClient" />  

  33.     </bean>  

  34.   

  35. </beans>  


3)ibatis配置文件:

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">  

  3.   

  4. <sqlMapConfig>  

  5.     <settings cacheModelsEnabled="true" enhancementEnabled="true"  

  6.         lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"  

  7.         maxTransactions="5" useStatementNamespaces="false" />  

  8.       

  9.     <!-- 別名定義 -->  

  10.     <typeAlias alias="pageAccessURL"  type="com.lgm.mybatis.model.PageAccessURL" />  

  11.     <!-- 映射文件,存放sql語句的配置文件 -->  

  12.     <sqlMap resource="com/lgm/mybatis/config/pageAccessURL.xml"/>  

  13.       

  14. </sqlMapConfig>  


4)ibatis的sql映射配置文件:

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE sqlMap  PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">  

  3. <sqlMap namespace="pageAccessURL">  

  4.       

  5.     <cacheModel id="productCache" type="LRU">  

  6.         <flushInterval hours="24"/>  

  7.         <property name="size" value="1000" />  

  8.     </cacheModel>  

  9.   

  10.     <select id="selectPageAccessURL" parameterClass="int" resultClass="pageAccessURL" cacheModel="productCache">  

  11.         select * from PAGE_ACCESS_URL where URL_ID = #id#  

  12.     </select>  

  13.       

  14.     <select id="selectPageAccessURLByClass" parameterClass="pageAccessURL" resultClass="pageAccessURL">  

  15.         select * from PAGE_ACCESS_URL where URL_ID = #urlId# and URL = #url#  

  16.     </select>  

  17.   

  18.     <sql id="usercolumns">URL_ID as urlId,url,moduleId,state,mark</sql>  

  19.     <select id="selectPageAccessURL2" parameterClass="int" resultClass="pageAccessURL">  

  20.         select <include refid="usercolumns" />    

  21.         from PAGE_ACCESS_URL where URL_ID = #id#  

  22.     </select>  

  23.       

  24.     <insert id="insertTest" >  

  25.         <selectKey keyProperty="id" resultClass="int" >  

  26.             SELECT FLOOR(1 + (RAND() * 1000000));   

  27.         </selectKey>  

  28.         insert into table values(xx,xx);  

  29.     </insert>  

  30.   

  31. </sqlMap>  


5)配置DAO層:

[html] view plain copy print?

  1. public class PageAccessURLManager {  

  2.   

  3.     private SqlMapClient sqlMapClient ;  

  4.     public void setSqlMapClient(SqlMapClient sqlMapClient) {  

  5.         this.sqlMapClient = sqlMapClient;  

  6.     }  

  7.       

  8.     public void getPageAccessURL(int urlId) throws SQLException{  

  9.         PageAccessURL page = (PageAccessURL)this.sqlMapClient.queryForObject("selectPageAccessURL", urlId);  

  10.         System.out.println(page.getUrl());  

  11.     }  

  12.           

  13. }  


注意:請仔細對比mybatis和ibatis的配置區別。

6)測試:

同方式二的測試;

關於註解方式的我不是很喜歡,因此...

over....

相關文章
相關標籤/搜索