MyBatis 核心配置文件( mybatis-config.xml),該文件配置了 MyBatis 的一些全局信息,包含數據庫連接信息和 MyBatis 運行時所需的各種特性,以及設置和影響 MyBatis 行為的一些屬性。
mybatis-config.xml 文件結構
mybatis-config.xml 文件需配置一些基本元素,需要注意的是,該配置文件的元素節點是有先后順序的,其層次結構如下圖:
說明
1、從上圖中可以看出,configuration 元素是整個 XML 配置文件的根節點,其角色就相當於是 MyBatis 的總管, MyBatis 所有的配置信息都會存放在它里面。 MyBatis 還提供了設置這些配置信息的方法。 Configuration 可從配置文件里獲取屬性值,也可以通過程序直接設置。Configuration 可供配置的內容如下。
2、mybatis-config.xml 文件的元素節點是有一定順序的,節點位置若不按順序排位,那么 XML 文件會報錯。
1、properties 元素
properties 元素描述的都是外部化、可替代的屬性。那么這些屬性如何獲取?有以下兩種方式實現。
(1)可通過外部指定的方式,將數據庫連接相關信息配置在典型的 Java 屬性配置文件中(如 database. properties),並使用這些屬性對配置項實現動態配置。即通過 resource 屬性從外部指定 properties 屬性文件( database.properties ),該屬性文件描述數據庫連接的相關配置(數據庫驅動、連接數據庫的 url ,數據庫用戶名,數據庫密碼),位置也是在/ resources 目錄下。代碼如下:
①database. properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/smbms?userUnicode=true&characterEncoding=utf-8&&zeroDateTimeBehavior=convertToNull username=root password=root ②mybatis-config.xml 部分內容: <configuration> <!-- 引入 database.properties 文件 --> <properties resource="database.properties" /> ...... <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </configuration>
說明:上述代碼中,driver、url、username、password 屬性將會用包含進來的 database. properties 文件中的值來替換。
(2)直接配置為 xml ,並使用這些屬性對配置項實現動態配置,代碼如下:
mybatis-config.xml 部分內容: <!--properties 元素中直接配置 property 屬性--> <properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?userUnicode=true&characterEncoding=utf-8&&zeroDateTimeBehavior=convertToNull"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> ······ <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> 說明:上述代碼中,driver、url、username、password 將會由 properties 元素中設置的值來替換。
問題思考:若兩種方式同時都用了,那么哪種方式優先?如下代碼所示:
<properties resource="database.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
分析:這個例子中的 property 子節點設置的 username 和 password 的值會先被讀取,由於 database properties 中也設置了這兩個屬性,所以 resource 中同名屬性將會覆蓋 property 子節點的值。
結論: resource 屬性值的優先級高於 property子節點配置的值。
2、settings 元素
settings 元素的作用是設置一些非常重要的設置選項,用於設置和改變 MyBatis 運行中的行為,比如此處設置 MyBatis 的 log 日志實現為 LOG4J,即使用 log4j 實現日志功能。
常用配置如下表:
設置項 | 描述 | 允許值 | 默認值 |
cacheEnabled | 對在此配置文件下的所有 cache 進行全局性開/關設置 | true/false | true |
lazyLoadingEnabled | 全局性設置懶加載。如果設為 false ,則所有相關聯的都會被初始化加載 | true/false | true |
autoMappingBehavior | MyBatis對於resultMap自動映射匹配級別 | NONE /PARTIAL: /FULL | PARTIAL |
logImpl | 指定 Mybatis 所用日志的具體實現,未指定時將自動查找 | SLF4J | LOG4J | LOG4J2 |... | Not set |
autoMappingBehavior 講解
Mybatis的自動映射策略默認是開啟的,而且默認是只對非嵌套的resultMap進行自動映射。這是通過Mybatis的全局配置autoMappingBehavior參數配置的。它一共有三種取值,分別是NONE、PARTIAL和FULL。
NONE:表示不啟用自動映射
PARTIAL:表示只對非嵌套的resultMap進行自動映射
FULL:表示對所有的resultMap都進行自動映射
3、typeAliases 元素
typeAliases 元素的作用是配置類型別名,通過與 MyBatis 的 SQL 映射文件相關聯,減少輸入多余的完整類名,以簡化操作。具體配置如下:
<typeAliases> <!--這里給實體類取別名,方便在 mapper 配置文件中使用--> <typeAlias alias="User" type="cn.smbms.pojo.User"/> </typeAliases>
以上這種寫法的弊端在於如果一個項目中有多個 POJO 的時候,需要一一進行配置,所以有更加簡化的寫法,就是通過 package 的 name 屬性直接指定包名, MyBatis 會自動掃描指定包下的 JavaBean ,並默認設置一個別名,默認名稱為 JavaBean 的非限定類名。具體配置如下:
<typeAliases>
<!--默認名稱:指定包下 JavaBean 的非限定類名-->
<package name ="cn.smbms.pojo" />
</typeAliases>
說明:
1、配置了 typeAliases 元素,在 Mapper.xml 中的 resultType 屬性無須寫完全限定名com.smbms.pojo.User,只需要寫 User 或 user 不區分大小寫。
2、
對於基礎數據類型, MyBatis 已經為許多常見的 Java 類型內建了相應的類型別名,一般都是與其映射類型一致,並且它們都是大小寫不敏感的,
比如映射的類型 int、Boolean、String、Integer 等,它們的別名就是 int 、Boolean或boolean、String或string、Integer或integer。
4、environments 元素
表示配置 MyBatis 的多套運行環境,MyBatis 可以配置多套運行環境,如開發環境、測試環境、生產環境等,我們可以靈活選擇不同的配置,從而將 SQL 映射應用到不同的數據庫環境上。這些不同的運行環境,就可以通過 environments 元素來配置。environments 元素節點下通過配置多個 environment 子元素節點,實現配置多套運行環境,但是不管增加幾套運行環境,都必須要明確選擇出當前的唯一一個運行環境(即默認運行環境:通過 default 指定)。這是因為毎個數據庫都是對應一個 SqlSessionFactorγ 實例的,需要指明哪個運行環境將被創建,並把運行環境中設置的參數傳遞給 SqlSessionFactoryBuilder。具體配置如下:
<!-- 配置 mybatis 多套運行環境,通過 default 屬性選擇一套運行環境 --> <environments default="development"> <!--開發環境--> <environment id="development"> <!-- 配置事務管理,采用 JDBC 的事務管理 --> <transactionManager type="JDBC" /> <!-- POOLED:mybatis 自帶的數據源,JNDI:基於 Tomcat 的數據源 --> <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> <!--測試環境--> <environment id="test"> ·········· </environment> </environments> environment:配置 MyBatis 的一套運行環境,需指定運行環境 ID、事務管理、數據源配置等相關信息。
注意點:
1、默認的運行 ID :通過 default 屬性來指定當前的運行環境 ID 為 development ,對於環境 ID 的命名要確保唯一。
2、transactionManager 事務管理器,設置其類型為 JDBC(MyBatis 有兩種事務管理類型,即JDBC、MANAGED),直接使用 JDBC 的提交和回滾功能,依賴於從數據源獲得連接來管理事務的生命周期。
3、dataSource 元素使用標准的 JDBC 數據源接口來配置 JDBC 連接對象的資源。 MyBatis 提供了三種數據源類型(UNPOOLED、POOLED、JNDI),這里我們使用 POOLED 數據源類型。該類型的實現利用 “池” 的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間,是 MyBatis 實現的簡單的數據庫連接池類型,它使數據庫連接可被復用,不必在每次請求時都去創建一個物理連接。這對於高並發的 Web 應用是一種流行的處理方式,有利於快速響應請求。
5、mappers 元素
mappers:映射器,在 <mappers> 中有兩個子元素 <package> 、<mapper> ,用來定義 SQL 的映射語句,我們只需要告訴 MyBatis 去哪里找到這些 SQL 語句(即去哪里找相應的 SQL 映射文件),整個項目中可以有1個或多個SQL 映射文件。可以使用類資源路徑或者 URL 等,具體代碼如下:
方式一:使用類資源路徑獲取資源(推薦使用)
<!-- 將 mapper 映射文件加入到系統核心配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> <mapper resource=""/> ...... </mappers>
mapper: mappers 的子元素節點,具體指定 SQL 映射文件的路徑,其中 resource 屬性的值表述了 SQL 映射文件的路徑(類資源路徑)。
方式二:使用 URL 獲取資源
eclipse 查看文件 URL:右擊要查看的文件 >> Properties >> Resource >> 右側 Location 即為文件位置(復制粘貼路徑即可)
<mappers> <mapper url="file:///E:/sqlmappers/UserMapper.xml"/> <mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/> </mappers>
方式三:使用 <package> 獲取資源
<mappers> <package name="映射文件所在包名"> </mappers>
注意:這種方式必須保證接口名和 SQL 映射文件名相同,還必須在同一個包中。
方式四:<mapper class= "接口路徑" >
<mappers>
<mapper class="cn.mybatis.dao.ProviderMapper"/>
</mappers>
注意:
1、這種方式必須保證接口名和 SQL 映射文件名相同,還必須在同一個包中。
2、使用此方式對於接口方法使用注解方式來說,沒有同包同名的限制條件。