1. 程式人生 > >第十一篇:一點一滴學ibatis(一)

第十一篇:一點一滴學ibatis(一)

一、常見ORM框架
1、原生的JDBC。自己寫的JDBC,基本上就只夠程式跑起來,缺陷和漏洞一堆堆。回顧下jdbc的幾個操作,載入驅動,建立連線,預處理語句,執行,結果集遍歷。這個過程中,因為連線Connection要不斷關閉和開啟,頻繁操作,於是有了連線池ConnectionPool。預處理語句的sql要重複編寫和設定引數,於是有了xml一站式配置檔案,結果集要不斷遍歷於是也有了xml去自動對映。
2、JPA。全稱是java Persistence API。這是一個標準的ORM規範。因為orm框架很多,大家就遵守一個統一的規範吧。注意這只是一個規範,不是實現。具體實現的產品,常見的Hibernate,MyBatis(前身IBatis) 等等。其他的沒接觸暫時不考慮
3、Hibernate。以下摘抄他和MyBatis的區別,詳細的以後總結。
(1)mybatis手寫SQL,而hibernate提供對映機制,開發人員無需關心 
(2)mybatis控制更細粒度,但可移植性差,hibernate開發DAO很簡單,可移植性好 
(3)mybatis容易上手學習,hibernate難度稍大 
(4)hibernate提供了面向物件的SQL語句HQL,也能使用普通的SQL,但mybatis只能使用普通的SQL。 

二、 它屬於web開發的哪一層?
很明顯,持久層,也即是DAL:資料訪問層

三、與MyBatis的區別
iBatis的優點:
(1)封裝了很多JDBC的模板,開發時只需要關注sql語句。不需要關注驅動載入,Connection建立和關閉
(2)上手容易,會jdbc的話學的會很快
(3)進化了一下,就成了MyBatis,現在iBatis使用已經很少了。但是最近的專案正在用,還是學一學吧
(4)支援儲存過程,對於沒法接觸儲存過程的童鞋這是個機會入手

四、配置哪些檔案
1、全域性的配置檔案
用於指定資料來源,事物屬性和其他引數配置資訊 ,通常叫sqlMapConfig.xml
2、對映檔案
就是一般的資料庫物理表和java實體類對映的xml檔案 
注意:iBatis的一些元素如根元素<sqlMapConfig> ,指定對映檔案的元素<sqlMap>,以及<SqlMapClient >等,在MyBatis中已經用
Mapper、Session、Configuration這些名字代替,這些名字也是orm框架中常用的名字 

五、配置檔案詳解
1、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>(根元素)

     < settings    

     cacheModelsEnabled ="true"     <!--是否啟用SqlMapClient上的快取機制,建議true-- >  

     lazyLoadingEnabled="true"        <!-- 是否啟用延遲載入機制,建議true -->  

     enhancementEnabled="true"     <!-- 是否針對POJO啟用位元組碼增強機制,getter,setter呼叫功能,建議true -->  

     errorTracingEnabled="true"       <!-- 是否啟用錯誤日誌,開發期間建議true -->  
     maxRequests="32"                    <!-- 最大併發請求數,Statement併發數 -->  
     maxSessions="10"                     <!-- 最大Session數 -->  

     maxTransactions="5"                 <!-- 最大併發事務數 ,即當前最大允許的SqlMapClient數-->  

     useStatementNamespaces="true"<!-- 是否啟用名稱空間 -->
     />  
    < transactionManager type ="JDBC" >     <!-- 定義了ibatis的事務管理器有3種(JDBC,JTA,EXTERNAL) -->
         < dataSource type ="DBCP" >             <!-- type屬性指定了資料來源的連線型別,也有3種類型(SIMPLE,DBCP,JNDI) -->
              < property name ="JDBC.Driver" value ="com.mysql.jdbc.Driver" /> 
              < property name ="JDBC.ConnectionURL" value ="jdbc:mysql://localhost/test" /> 
              < 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 ="TimeToWait" value ="500" />                                       <!-- 執行緒允許等待的最大時間 -->
         </ dataSource >
   </ transactionManager >
   < sqlMap resource ="com/yb/ibatis/userMap.xml" /> 

</sqlMapConfig> 

三個節點解析:
 transactionManager節點 :指定事務管理器
JDBC:傳統的JDBC Connection的commit,rollback實現事物支援
JTA:使用容器提供的JTA服務實現全域性事物管理(沒用到,不懂)
EXTERNAL:外部事物管理。比如spring來託管事物的管理很不錯

dataSource節點:type屬性指定dataSource的實現方式
SIMPLE:SIMPLE 是 ibatis 內建的 dataSource 實現,其中實現了一個簡單的資料庫連線池機制,對應 ibatis 實現類為
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory.
DBCP:基於Apache DBCP連線池元件實現的DataSource封裝,當沒有容器提供DataSource服務時,建議使用該選項,對應ibatis實現類為
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory.  

JNDI: 使用J2EE容器提供的DataSource實現, DataSource將通過指定的JNDI Name從容器中獲取.對應ibatis實現類為

com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory.

sqlMap節點:指定對映檔案的位置,可以有多個,來指定專案中所有的對映檔案
SqlMapClient例項建立的過程:

String resource    = " com/ibatis/sample/SqlMapConfig.xml " ;  
Reader reader; 

reader    =    Resources.getResourceAsReader(resource); 

XmlSqlMapClientBuilder  xmlBuilder = new  XmlSqlMapClientBuilder(); 

SqlMapClient   sqlMap = xmlBuilder.buildSqlMap(reader); //獲取到SqlMapClient例項

常見操作:
insert,delete,update
queryForObject
queryForMap
queryForList

以上配置基本上在專案確定後,改動很少,需要開發者手寫的對映檔案,單獨總結一篇日誌。