Mybatis-配置解析
配置解析
目錄
1. 核心配置檔案
- mybatis-config.xml(官方建議的檔名,建在resource目錄下)
- MyBatis 的配置檔案包含了會深深影響 MyBatis 行為的設定和屬性資訊。
- 包含如下的配置
- properties(屬性)
- settings(設定)
- typeAliases(類型別名)
- typeHandlers(型別處理器)
- objectFactory(物件工廠)
- plugins(外掛)
- environments(環境配置)
- environment(環境變數)
- transactionManager(事務管理器)
- dataSource(資料來源)
- databaseIdProvider(資料庫廠商標識)
- mappers(對映器)
2. 環境變數(environments)
MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中
不過要記住:儘管可以配置多個環境,但每個 SqlSessionFactory 例項只能選擇一種環境。
Mybatis預設的事務管理器就是JDBC,連線池:POOLED
學會使用多套執行環境(選擇對應的id)
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> </dataSource> </environment> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> </dataSource> </environment> </environments>
3. 屬性(properties)
我們可以通過properties屬性來實現引用配置檔案
這些屬性可以在外部進行配置,並可以進行動態替換。你既可以在典型的 Java 屬性檔案中配置這些屬性,也可以在 properties 元素的子元素中設定。[db.properties]
1. 編寫一個配置檔案
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicodeEncode=true&characterEncoding=UTF-8
username = root
password = 123456
2. 在核心配置檔案中引入
由於在XML中可以規定標籤的順序,properties必須寫在上面!
<!--引入外部配置檔案,由於此處都在resource目錄下,直接寫檔名-->
<properties resource="db.properties"/>
可以在properties中指定引數,利用鍵值對的方式(name,value)
<properties resource="db.properties">
<property name = "username" value = "root"/>
<property name = "password" value = "123456"/>
</properties>
- 可以直接引入外部檔案
- 可以在其中增加一些屬性配置
- 如果兩個檔案有同一個欄位,優先使用外部配置檔案的!
寫完配置後,在environment中使用
<environments default="development">
<environment id="development">
<transactionManager type="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>
3. 類型別名(typeAliases)
- 類型別名可為 Java 型別設定一個縮寫名字
- 它僅用於 XML 配置,意在降低冗餘的全限定類名書寫
<!--可以給實體類起別名-->
<typeAliases>
<typeAlias type="com.wang.pojo.User" alias="User"/>
</typeAliases>
也可以指定一個包名,Mybatis會在包名下面搜尋需要的Java Bean
掃描實體類的包,它的預設別名就為之歌類的類名,其中首字母小寫!
<typeAliases>
<typeAlias type="com.wang.pojo"/>
</typeAliases>
在實體類比較少的時候,使用第一種方式
如果實體類十分多,建議使用第二種
第一種可以DIY別名,第二種則不行,如果非要改,需要在實體類上增加註解
@Alias("user")
public class User {
}
使用內建型別時,加_的才是基本型別,不加的就為包裝型別
如:_int ==> int int ==> Integer
4. 設定(setting)
這是 MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的執行時行為
設定名 | 描述 | 有效值 | 預設值 |
---|---|---|---|
cacheEnabled | 全域性性地開啟或關閉所有對映器配置檔案中已配置的任何快取。 | true | false | true |
lazyLoadingEnabled | 延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定 fetchType 屬性來覆蓋該項的開關狀態。 |
true | false | false |
logImpl | 指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未設定 |
5. 其他配置
- typeHandlers(型別處理器)
- objectFactory(物件工廠)
- plugins(外掛)
- MyBatis Generator Core
- MyBatis Plus
- 通用Mapper
6. 對映器(mappers)
MapperRegistry: 註冊繫結我們的Mapper檔案
1. 方式一: 使用完全限定名[推薦使用]
使用完全限定名
<mappers>
<mapper resource="com/wang/dao/UserMapper.xml"/>
</mappers>
2. 方式二: 使用class檔案繫結註冊
<mappers>
<mapper class="com.wang.dao.UserMapper"/>
</mappers>
注意點:
- 介面和它的Mapper配置檔案必須同名!
- 介面和它的Mapper配置檔案必須放在同一個包下!
3. 方式三: 使用包掃描進行注入繫結
<mappers>
<package name="com.wang.dao"/>
</mappers>
注意點:
- 介面和它的Mapper配置檔案必須同名!
- 介面和它的Mapper配置檔案必須放在同一個包下!
4. 生命週期和作用域
理解不同作用域和生命週期類別是至關重要的,因為錯誤的使用會導致非常嚴重的併發問題。
graph TD id1[mybatis-config.xml配置檔案] id2[開始] id3[SqlSessionFactoryBuilder] id4[SQLSessionFactory] id5[SQLSession] id6[SQL Mapper] id7[結束] id1 --> id3 id2 --> id3 id3 --> id4 id4 --> id5 id5 --> id6 id6 --> id7 id5 --已廢棄,不推薦使用--> id71. SqlSessionFactoryBuilder
- 一旦建立了 SqlSessionFactory,就不再需要SqlSessionFactoryBuilder了
- 區域性變數
2. SqlSessionFactory
-
說白了可以想象為,資料庫連線池
-
SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項
-
SqlSessionFactory 的最佳作用域是應用作用域(程式一旦開始就開始作用,直到程式結束)
-
最簡單的就是使用單例模式或者靜態單例模式 ==> 保證全域性只有一個變數
3. SqlSession
- 連線到連線池的一個請求,需要開啟和關閉
- SqlSession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域
- 用完之後需要趕緊關閉,否則資源會被佔用
- getMapper方法會建立一個Mapper,每一個Mapper都代表一個具體的業務