今天這咱主要介紹一下MyBatis的全局配置文件的使用java
mybatis-config.xml文件的頭部格式咱們就不說了,直接從屬性開始介紹,configuration爲最頂層節點,其他全部的屬性都必須嵌套在configuration內,MyBatis配置文件的頂層節點以下:sql
<properties></properties><!-- 屬性 -->
<settings></settings> <!-- 設置-->
<typeAliases></typeAliases><!-- 配置別名 -->
<typeHandlers></typeHandlers><!-- 類型處理器 -->
<objectFactory></objectFactory><!-- 對象工廠 -->
<plugins></plugins><!-- 插件 -->
<environments default=""><!-- 環境配置-->
<environment id=""><!-- 環境變量 -->
<transactionManager></transactionManager><!-- 事務管理器 -->
<dataSource></dataSource><!-- 數據源 -->
</environment>
</environments>
<databaseIdProvider></databaseIdProvider><!-- 數據庫廠商標識 -->
<mappers></mappers><!-- 映射器 -->
能夠看到configuration內的所有頂層節點只有9個,下面咱們就一個個來分析一下數據庫
下面是一個相對完整的屬性配置apache
<!-- 配置resource-->
<properties resource="xxx/xxx.properties"><!-- 屬性 -->
<property name="jdbc.driver" value="db.properties"/>
</properties>
<!-- 配置url-->
<properties url="http://xxxx"><!-- 屬性 -->
<property name="jdbc.driver" value="db.properties"/>
</properties>
上面我特地分開寫,就是怕引發你們的誤解,由於resource和url只容許存在一個,不能同時配置兩個屬性,能夠看到源碼中的解析過程:同時配置了resource和url會拋出異常。服務器
配置了properties屬性以後,在xml其餘配置文件中能夠直接經過${xxx}來讀取。mybatis
properties配置有三種方式,resource或者url指定,直接配置在子節點properties中,另外一種就是上一篇提到的,直接代碼中去其餘地方讀取properties文件,而後傳入build方法。mvc
那麼這三種方式既然都能配置,假如屬性配置重複了,優先級是怎麼樣的呢?app
properties配置的屬性若是重複,優先級以下:maven
在實際開發中,建議是隻使用一種,使用多種方式混合的話會給後期維護形成困難,並且不一樣類型的配置屬性混合時可讀性也很差。編輯器
settings是MyBatis中最複雜,也是最重要的內容之一。固然這裏說的複雜並非說配置方式複雜,而是settings能配置的東西很是多,一些很核心的功能都是經過settings標籤配置的。下面是一個完整的屬性配置示例:
<settings><!-- 設置-->
<setting name="cacheEnabled" value="false"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="multipleResultSetsEnabled" value="false"/>
<setting name="useColumnLabel" value="false"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="NONE"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="VARCHAR"/>
<setting name="lazyLoadTriggerMethods" value="equals"/>
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver"/>
<setting name="callSettersOnNulls" value="false"/>
<setting name="logPrefix" value="LONELY_WOLF_"/>
<setting name="logImpl" value="SLF4J"/>
<setting name="proxyFactory" value="JAVASSIST"/>
</settings>
全部的可設置值列舉以下(這些屬性有個映像就能夠了,不須要去記,經常使用的多用幾回天然就記住了,不經常使用的須要的時候再查一下資料就能夠了,因此建議你們能夠收藏以後方便查詢):
類型別名是爲 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘。
例如:
<typeAlias alias="UserMapper" type="com.lonelyWolf.mybatis.mapper.UserMapper"/>
這樣配置的話在MyBatis的xml文件中能夠直接使用UserMapper代替其類的全限定名。
也能夠指定一個包名,MyBatis會在包名下面搜索須要的 Java Bean,好比:
<package name="com.lonelyWolf.mybatis.mapper"/>
這麼配置的話每個在指定包名中的Java類,若是沒有使用註解指定名稱,則會默認使用Bean的首字母小寫的非限定類名來做爲它的別名,若是有註解,則優先使用註解指定的別名。如:
@Alias("lonely_wolf")
public class LonelyWolf{
}
這裏由於註解指定了別名,因此會以註解爲準,若是沒有註解,則默認使用lonelyWolf做爲別名。
實際開發中,有不少返回類型是數據基本類型或者String,Map,List等很是常見的類型,這些類型MyBatis已經爲咱們提供好了別名,咱們就不須要另外再定義了。如下就時MyBatis中默認提供的別名:PS:這些別名的字母都是不區分大小寫的,由於MyBatis在註冊別名的時候會所有轉爲小寫字母存儲
typeHandlers主要是用來實現Java對象和數據庫字段類型額轉換關係。不管是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。配置方式以下:
<typeHandlers>
<!-- 自定義typeHandlers全限定類名 -->
<typeHandler handler="xxx.xxx.xxx"></typeHandler>
<!-- 獲取指定包名下的typeHandlers -->
<package name="xxx.xxx"/>
</typeHandlers>
MyBatis默認提供的Java Bean和數據庫字段類型映射關係以下:
上面是MyBatis提供的默認映射類型,能夠處理大部分需求,若是咱們須要有不一樣的需求,則能夠本身定義類型,具體如何定義,在後面的文章會單獨分析,在這裏不展開,感興趣的能夠關注我,留意後續文章。
MyBatis 每次建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成。默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認構造方法,要麼在參數映射存在的時候經過參數構造方法來實例化。若是想覆蓋對象工廠的默認行爲,則 能夠經過建立本身的對象工廠來實現
MyBatis 容許你在已映射語句執行過程當中的某一點進行攔截調用。這裏咱們不詳細討論,後期會有單獨文章介紹MyBatis插件
MyBatis 能夠配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中,例如:開發、測試和生產環境須要有不一樣的配置;或者共享相同 Schema 的多個生產數據庫, 想使用相同的 SQL 映射。許多相似的用例。注意:儘管能夠配置多個環境,每一個SqlSessionFactory實例只能選擇其一。因此,若是想鏈接兩個數據庫,就須要建立兩個SqlSessionFactory實例,每一個數據庫對應一個。配置示例以下:
<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>
environment配置關鍵點:
在 MyBatis 中有兩種類型的事務管理器(也就是 type=」JDBC"或者"MANAGED」):
dataSource元素使用標準的 JDBC 數據源接口來配置JDBC鏈接對象的資源。有三種內建的數據源類型(也就是 type=」[UNPOOLED|POOLED|JNDI]」)。
非鏈接池數據源。UNPOOLED 類型的數據源僅僅須要配置如下 5 種屬性:
鏈接池數據源。除了上述提到UNPOOLED下的屬性外,會有更多屬性用來配置 POOLED 的數據源:
這個數據源的實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器能夠集中或在外部配置數據源,而後放置一個 JNDI 上下文的引用。這種數據源配置只須要兩個屬性:
有些業務場景可能須要本身自定義數據源,MyBatis也是支持的。自定義數據源必需要實現DataSourceFactory接口。而後採用以下配置:
<dataSource type="自定義數據源全限定類名"></dataSource>
MyBatis 能夠根據不一樣的數據庫廠商執行不一樣的語句,這種多廠商的支持是基於映射語句中的 databaseId 屬性。MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數據庫 databaseId 屬性的全部語句。若是同時找到帶有databaseId 和不帶 databaseId 的相 同語句,則後者會被捨棄。爲支持多廠商特性只要像下面這樣在 mybatis-config.xml 文件中加入 databaseIdProvider 便可:
<databaseIdProvider type="DB_VENDOR" />
這個就是用來配置sql映射語句的xml文件了。mappers文件共有4種配置方式:
一、直接配置xml映射文件全限定名
<mappers>
<mapper resource="com/lonelyWolf/mybatis/mapping/UserMapper.xml"/>
</mappers>
二、經過url配置本地或者遠程映射文件路徑
<mappers>
<mapper url="file://xxx.xxx.UserMapper.xml"></mapper>
</mappers>
三、經過配置Mapper接口的方式來配置。
<mappers>
<mapper class="com.lonelyWolf.mybatis.mapper.UserMapper"></mapper>
</mappers>
四、經過配置Mapper接口包名的形式來配置
<mappers>
<package name="com.lonelyWolf.mybatis.mapper"/>
</mappers>
注意:在使用第3和第4兩種方式配置的時候,須要把xml映射文件和Mapper接口文件放在同一個目錄,並且必須同名。
若是用的是maven配置的話,可能會出現如下錯誤:Invalid bound statement (not found),出現以後須要注意檢查一下target下面的class目錄內有沒有xml映射文件,若是沒有的話須要在pom文件中加入如下配置(由於maven默認不會加載xml文件):
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
本文主要介紹了MyBatis中的核心配置文件的使用,本文其實更適合做爲手冊來參考,只需大體瀏覽,內心有個印象,須要用的時候再去查詢便可
來自:https://mp.weixin.qq.com/s/NsNhuyFVYBkcfYJPd0O4FQ