1. 程式人生 > 實用技巧 >Mybatis-配置解析

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 --已廢棄,不推薦使用--> id7

1. SqlSessionFactoryBuilder

  • 一旦建立了 SqlSessionFactory,就不再需要SqlSessionFactoryBuilder了
  • 區域性變數

2. SqlSessionFactory

  • 說白了可以想象為,資料庫連線池

  • SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項

  • SqlSessionFactory 的最佳作用域是應用作用域(程式一旦開始就開始作用,直到程式結束)

  • 最簡單的就是使用單例模式或者靜態單例模式 ==> 保證全域性只有一個變數

3. SqlSession

  • 連線到連線池的一個請求,需要開啟和關閉
  • SqlSession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域
  • 用完之後需要趕緊關閉,否則資源會被佔用
  • getMapper方法會建立一個Mapper,每一個Mapper都代表一個具體的業務