咱們都知道MyBatis的持久化操做離不開SqlSessionFactory對象,這個對象是整個數據庫映射關係通過編譯後的內存鏡像,該對象的openSession()方法能夠打開SqlSession對象.該對象由由SqlSessionFactoryBuilder加載MyBatis的配置文件產生.
先貼一張MyBatis初始化的基本過程,以下圖:sql
上圖所示,MyBatis初始化要通過如下幾步:數據庫
SqlSessionFactoryBuilder
對象的build(inputStream)方法;SqlSessionFactoryBuilder
會根據輸入流inputStream等信息建立XMLConfigBuilder
對象;SqlSessionFactoryBuilder
調用XMLConfigBuilder
對象的parse()方法;XMLConfiguBuilde
r對象解析XML配置文件返回Configuration
對象;SqlSessionFactoryBuilder
根據Configuration
對象建立一個DefaultSessionFactory
對象;SqlSessionFactoryBuilder
返回DefaultSessionFactory
對象給客戶端,供客戶端調用;因而可知,SqlSessionFactory是根據MyBatis的配置文件mybatis-config.xml
建立的,接下來咱們就來重點研究下MyBatis配置文件中經常使用屬性的意義.服務器
MyBatis的配置文件包含了影響MyBatis行爲的信息,文檔的結構以下:
頂層configuration配置mybatis
environments 環境併發
environment 環境變量oracle
這些屬性都是可外部配置且可動態替換的,既能夠在典型的Java屬性文件中配置,亦可經過properties元素的子元素來傳遞.
能夠再CLASSPATH中增長一個db.properties的Java屬性文件.app
driver=oracle.jdbc.driver.OracleDriver ur=jdbc:oracle:thin:@127.0.0.1:1526:mybatis username=root password=root
在配置文件中配置<properties.../>屬性:
<properties resource="db.properties"/>
其中的屬性就能夠在整個配置文件中使用來替換須要動態配置的屬性值.dom
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
一個配置完成的settings元素示例以下,具體含義這裏再也不列舉,能夠自行google.ide
類型別名是爲Java類型設置的一個短的名字.它只和XML配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘.性能
<typeAliases> <typeAlias alias="user" type="org.ccgogoing.domian.User"/> </typeAliases>
當這樣配置時,user能夠用在任何使用org.ccgogoing.domain.User的地方.
也能夠指定一個包名,MyBatis會在包名下面搜索須要的Java Bean
<typeAliases> <package name="org.ccgogoing.domian"/> </typeAliases>
每個在包org.ccgogoing.domain中的Java Bean,在沒有註解的狀況下,會使用Bean的首字母小寫的非限定類名來做爲它的別名.好比org.ccgogoing.domain.User
的別名爲user,如有註解,則別名爲其註解值.
@Alias("user") public class User { ... }
不管是MyBatis在預處理語句(preparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成Java類型,下圖描述了一些默認的類型處理器.
MyBatis每次建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成.默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認構造方法,要買在參數映射存在的時候經過參數構造方法來實例化.若是想覆蓋對象工廠的默認行爲,則能夠經過建立本身的對象工廠來實現.
MyBatis的環境配置實際就是數據源的配置.MyBatis能夠配置多種環境,這種機制使得MyBatis能夠將SQL映射應用於多種數據庫中.例如,開發,測試盒生產環境須要不一樣的配置;多個生產數據庫想使用相同的sql映射,等等.
儘管能夠配置多個環境,可是每一個SqlSessionFactory實例只能選擇一個環境,即每一個數據庫對應一個SqlSessionFactory實例.因此若是你想鏈接兩個數據庫,就須要建立兩個SqlSessionFactory實例,每一個數據庫對應一個.
環境配置示例以下:
<environments default="development"> <environment id="development"> <!--指定事務管理類型,type="JDBC"指直接簡單使用了JDBC的提交和回滾事務--> <transactionManager type="JDBC"></transactionManager> <!-- dateSource指定數據源配置,POOLED是jdbc鏈接對象的數據源鏈接池的實現--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
默認的環境ID(default="development");
每一個environment元素定義的環境ID(好比,id="development").
環境ID能夠隨意命名,建議簡潔有意義,而默認環境必定要匹配定義的其中一個環境ID.
<transactionManager.../>表示事務管理配置,在MyBatis中有JDBC和MANAGED兩中類型的事務管理器:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
提示: 若是開發使用Spring+MyBatis,則沒有必要配置事務管理器,由於Spring模塊會使用自帶的管理器來覆蓋前面的配置.
<dataSource.../>表示數據源配置,在MyBatis中有UNPOOLED、POOLED和JNDI三種數據源類型:
UNPOOLED類型的數據源僅僅須要配置一下5種屬性:
drive、url、username、password、defaultTransactionIsolationLevel。默認的鏈接事務隔離級別。
POOLED:這種數據源的實現利用「池」的概念將JDBC鏈接對想組織起來,避免了建立新的鏈接實例時所必需的初始化時間和認證時間。這是一種使得併發Web應用快速響應請求的流行處理方式,除了上述提到的UNPOOLED的5中屬性外,還可使用更多的屬性來配置POOLED的數據源:
MyBatis須要開發者本身寫sql語句,mapper映射器正是告訴MyBatis到哪裏去找映射文件,進而找到這些sql語句.實際開發中可使用相對於類路徑的資源引用或徹底限定資源定位符(包括file:///的URL),以及類名和包名等,例如:
<!-- 使用類路徑查找資源文件 --> <mappers> <mapper resource="com/ccgogoing/fileupload/mapper/sqlmap-mapping-user.xml"/> </mappers> <!-- 使用本地文件 --> <mappers> <mapper url="file:///C:/mapper/UserMapper.xml"> </mappers> <!-- 使用接口類 --> <mappers> <mapper class="org.ccgogoing.mapper.UserMapper" </mappers> <!-- 使用包名 --> <mappers> <package name="org.ccgogoing.mapper"/> </mappers>
mapper映射器會告訴MyBatis去哪裏找映射文件,剩下的細節就是每一個SQL映射文件了,我會在接下來的文章中詳細說明這部分知識.