寫在前面:十分感謝《深入淺出Mybatis技術原理與實戰(zhàn)》這本書,大多數(shù)地方是書上的話,希望自己能在后面的文章中多寫一些自己的理解。而且最重要的是!每次照書無腦敲的時候,都好羞愧?。êπ吣槪:竺嬉欢ㄗ⒁膺@些問題。最后要感謝點贊、評論以及指正的朋友們,你們是墜吼的!!
MyBatis配置元素
MyBatis配置xml文件的層次結構是不能夠顛倒順序的,在解析的過程中,如果出現(xiàn)什么問題的話可以來這里查看一下下。先看一段文件:
<?xml version"1.0" encoding="UTF-8"?>
<!-- 配置 -->
<configuration>
<!-- 屬性 -->
<properties/>
<!-- 設置 -->
<settings/>
<!-- 類型命名 -->
<typeAliases/>
<!-- 類型處理器 -->
<typeHandlers/>
<!-- 對象工廠 -->
<objectFactory/>
<!-- 插件 -->
<plugins/>
<!-- 配置環(huán)境 -->
<environments>
<!-- 環(huán)境變量 -->
<environment>
<!-- 事務管理器 -->
<transactionManager/>
<!-- 數(shù)據(jù)源-->
<dataSource/>
</environment>
</environments>
<!-- 數(shù)據(jù)庫廠商標識 -->
<databaseIdProvider/>
<!-- 映射器 -->
<mappers/>
</configuration>
這是MyBatis的全部配置,相信很多人第一眼看完之后會發(fā)出和我一樣的感慨:霧草!這都是什么東西?但是其實理解后還是蠻簡單的,而且很多東西我們在初級的使用中,讓它默認就好,我也會在眾多的配置方式中,省去繁瑣不必要的部分,直接介紹最好用的給大家。那么寫這篇文的目的就在于——好好的了解他們一下,簡單知道他們分別都是做啥的!接下來不要方,我們一個個的來,嘿嘿嘿。
1.Properties 元素
顧名思義,properties是配置屬性的元素。這個呢,是必要的,因為在JDBC我們要設定driver、url、username和password。而在配置中,我們直接把這些東西放到Properties元素中即可,是必要而且簡單的東西。
有三種方式供選擇:
- property 子元素
- properties 配置文件
- 程序參數(shù)傳遞
第一種方式:property 子元素
<dataSource type="POOLED">
<property name="driver" value=“com.mysql.jdbc.Driver”/>
<property name="url" value=“jdbc:mysql://localhost:端口號/數(shù)據(jù)庫名”/>
<property name="username" value=“數(shù)據(jù)庫用戶名“/>
<property name="password" value=“數(shù)據(jù)庫密碼”/>
</dataSource>
配置:這個是dataSource了,不知道它在哪里的請看上面那個全部配置元素展示~在dataSource里直接用'$'符號,
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
第二種方式: properties 配置文件
properties文件:
driver= com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:端口號/數(shù)據(jù)庫名
username= 數(shù)據(jù)庫用戶名
password= 數(shù)據(jù)庫密碼
我們把這個配置文件放在源包下,引入它就可以了。
<properties resource=“jdbc.properties/>
當然還有第三種方式:通過程序參數(shù)傳遞
這里先不寫代碼了,因為好多啊,而且以現(xiàn)有的知識去研究,不太好理解的,可以等前兩個先用6了然后再研究這個,這里先寫一下什么情況使用它。
在開發(fā)中,數(shù)據(jù)庫的密碼往往掌握在運維人員的手中,對搞開發(fā)的來說,這些屬于機密文件,而這些密碼往往都是通過運維人員加密的,我們是沒辦法通過加密的字符串去直接連接數(shù)據(jù)庫的!那么就要在生成SqlSessionFactory之前通過代碼將加密的字符串轉化成明文!吶,這是個解碼的過程。系統(tǒng)提供的解密方法是decode(str)…不過我倒是感覺吧,每個公司如果要加密的話,解碼方法要視情況而定,到時候知道這個途徑就隨機應變咯。
這里說一下優(yōu)先級的問題:通過參數(shù)傳遞的屬性具有最高優(yōu)先級,然后是resource/url屬性中指定的配置文件,最后是properties屬性中指定的屬性。
最好還是別混合亂用了,多亂啊。最好的方式就是通過properties文件!如果需要處理加密解密啥的,最好使配置來自同一個配置文件。
2.Settings 元素
Settings的Mybatis最復雜也是最重要的元素,它可以改變Mybatis的運行行為,但是!最重要的但是!即使我們不配置Settings,我們依然可以正常使用Mybatis!Settings的配置內容簡直多的令人發(fā)指!我相信就算我全寫下來,大家也沒打個耐心看,就算有那個耐心看,也肯定記不??!(此處省略10000字介紹......)
3.typeAliases 元素
別名是個指代名稱。其實很簡單的東西如果總結起來就太麻煩了,我們需要知道的是,Mybatis系統(tǒng)定義了一系列經(jīng)常使用的類型的別名,例如:數(shù)值、字符串、日期和集合。比如要用Map了,我們不需要寫java.util.Map,直接寫map就好啦!
重點要說的是自定義別名,因為我們有很多實體類,如果每次都按照路徑去寫豈不是很累(滑稽臉)。
<!—定義別名—>
<typeAliases>
<typeAliases alias=“role” type=“com.cream.model.Role”>
</typeAliases>
利用這種途徑,我們就可以使用role來代替完整路徑,方便很多!
但是如果我們有很多類呢?這樣的話,設置起來就很麻煩。所以介紹第二種方式給大家:通過自動掃描的形式自定義別名。
<typeAliases>
<package name=“com.cream.study1.model”/>
<package name=“com.cream.study2.model”/>
</typeAliases>
```
定義別名的方式是使用注解 @Alias,比如:
```
@Alias(“role”)
public class Role {
//coding……
}
```
配合起來之后,Mybatis自動掃描指定的package,注意的是,配置包掃描的路徑之后,沒有@Alias注解的Mybatis也會被裝載,然后把類名的第一個字母變成小寫,作為Mybatis的別名。建議使用一部分的包名+類名的格式去限定,以避免出現(xiàn)重名的情況。
####4.typeHandler 元素
typeHandler是類型處理器,,Mybatis在預處理語句中設置參數(shù)的時候,從結果集取出值的時候,都會用已注冊的typeHandler去處理。
typeHandler允許根據(jù)項目的需要去自定義設置Java傳遞到數(shù)據(jù)庫的參數(shù)中。還有從數(shù)據(jù)庫讀數(shù)據(jù)出來的時候,我們也需要進行特殊處理。這些情況都可以通過自定義typeHandler去處理。
其實系統(tǒng)定義的typeHandler就可以實現(xiàn)大部分的功能了,也很多,使用的時候,可以查一查。
注意事項:
數(shù)值類型的精度,數(shù)據(jù)庫int、double、decimal與java中的精度、長度是不一樣的。
時間精度,取到日:DateOnlyTypeHandler。取到秒:SqlTimerstamp。額,都可以源碼查看。想看例子的直接查官方文檔就好,忽視其他的英文,直接看代碼ok,個人感覺這個是挺復雜的一個東西。
####ObjectFactory元素
ObjectFactory是有結果返回的時候,構造實體類(POJO)的,大部分的場景下我們都不用修改,當然想自定義也可以,恩。。。知道這些就好!下一個!
####Plugins元素
插件很復雜,書上概括下來就是,如果不懂原理,那么就完全無法掌握插件的使用,而且插件用不好的話就會是一個很危險的東西!所以無法簡單理解。以后研究研究再單獨寫一寫。
####environments配置環(huán)境
它很關鍵,environments是配置環(huán)境,他可以注冊多個數(shù)據(jù)源dataSource,數(shù)據(jù)源包括數(shù)據(jù)源的配置和數(shù)據(jù)庫事務(transactionManager)的配置。
配置數(shù)據(jù)源
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
這里粘的是源碼的示例。
- environments中的屬性default,標明我們默認啟用的數(shù)據(jù)源配置。
- environment中的id是設置這個數(shù)據(jù)源的標識。
- transactionManager配置數(shù)據(jù)庫的事務,type有三種配置方式。
1.JDBC:采用jdbc方式管理事務,獨立編碼中常用。
2.MANAGED:采用容器方式管理事務,在JNDI數(shù)據(jù)源中常用。
3.自定義:用于特殊應用,自己定義數(shù)據(jù)庫事務管理。
- property 元素是配置數(shù)據(jù)源的各類屬性,比如說可以name處寫"autoCommit",value寫"false",這樣就代表著數(shù)據(jù)源不自動提交。
- dataSource :配置數(shù)據(jù)源連接的信息,type屬性設置我們對數(shù)據(jù)庫連接方式的配置。
1.UNPOOLED,非連接池數(shù)據(jù)庫。
2.POOLED,連接池數(shù)據(jù)庫。
3.JNDI,JNDI數(shù)據(jù)源。
4.自定義
這里說一下數(shù)據(jù)庫事務,在Mybaits把事務交由SqlSession控制,我們可以通過SqlSession執(zhí)行commit提交,或者roolback回滾。
簡單打個比方:A去銀行轉賬,余額100塊,A要給B轉200塊,但是A余額不足,轉賬失敗了,這時候就需要回滾事務。否則A雖然失敗了,但B卻可以收到200塊。
大部分工作環(huán)境下使用Spring控制。
再來討論一下數(shù)據(jù)源:
Mybatis提供了三種數(shù)據(jù)源連接方式:
1.UNPOOLED:非連接池。
2.POOLED:連接池。
3.JNDI:通過JndiDataSourceFactory獲取數(shù)據(jù)源。
當然我們可以自定義數(shù)據(jù)源,他必須實現(xiàn):org.apache.ibatis.datasource.DataSourceFactory
接口,當我們使用了spring框架,配置就會很簡單
####databaseIdProvider數(shù)據(jù)庫廠商標識
相同數(shù)據(jù)庫廠商環(huán)境下,數(shù)據(jù)庫廠商標識沒啥意義。Mybatis如果運行在不同廠商的數(shù)據(jù)庫的話,可以提供標識,但是一般情況下都不會使用多廠商的數(shù)據(jù)庫。
####映射器
簡單說一下引入映射器的方法(官方文檔代碼)
1.用文件路徑引入。
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2.用類注冊引入映射器。
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
3.用包名引入。
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
4.用xml文件引入。