MyBatis 配置文件

MyBatis 的持久化離不開 SqlSessionFactory 對象,這個對象是整個數據庫映射關係經過編譯後的內存鏡像。SqlSessionFactory 能夠打開 SqlSession 對象,而 SqlSessionFactory 由 SqlSessionFactoryBuilder 加載 MyBatis 的配置文件產生。

我們先來看一下上篇筆記中我們配置文件 mybatis.cfg.xml 中的內容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>    
    <!-- 爲JavaBean起類別名 -->
    <typeAliases>
        <!-- 指定一個包名起別名,將包內的 Java 類的類名作爲類的類別名 -->
        <package name="com.gler.mybatis.model" />
    </typeAliases>   

    <!-- 配置mybatis運行環境 -->
    <environments default="development">
        <environment id="development">
           <!-- type="JDBC" 代表直接使用 JDBC 的提交和回滾設置 -->
            <transactionManager type="JDBC" />

            <!-- POOLED 表示支持JDBC數據源連接池 -->
            <!-- 數據庫連接池,由 Mybatis 管理,數據庫名是 mybatis,MySQL 用戶名 root,密碼 root -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments> 

    <mappers>
        <!-- 通過 mapper 接口包加載整個包的映射文件 -->
        <package name="com/gler/mybatis/mapper" />
    </mappers>
</configuration>

MyBatis 配置文件的 configuration 標籤主要包括:

  • configuration 配置
    • properties 屬性
    • settings 設置
    • typeAliases 類型命名
    • typeHandlers 類型處理器
    • objectFactory 對象工廠
    • plugins 插件
    • environments 環境
      • environment 環境變量
      • transactionManager 事務管理器
    • databaseIdProvider 數據庫廠商標識
    • mappers 映射器

在上面的示例配置文件中,值包含了最基本的 typeAliases 類型命名、 environments 環境和 mappers 映射器。

1.properties 屬性

這些屬性是可外部配置且動態替換的,例如在上篇筆記的基礎上在目錄 /Java Resources/src 下建立了 Java 屬性文件 config.properties ,用於配置一些數據庫的信息,內容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root

在配置文件中配置

<properties resource="config.properties">
    <property name="username" value="root"/>
    <property name="password" value="123"/>
</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>

注:MyBatis 加載屬性的順序如下(引用自MyBatis中文文檔——properties):

  • 首先讀取 properties 元素體內指定的屬性
  • 然後根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性
  • 最後讀取作爲方法參數傳遞的屬性,並覆蓋已讀取的同名屬性

2.settings 設置

settings 是 MyBatis 極爲重要的設置,它們會改變 MyBatis 的運行時行爲,如開啓二級緩存、開啓延遲加載等。

settings 設置的詳細情況可參考MyBatis中文文檔——settings

3. typeAliases 類型命名

同樣來看上篇筆記的 mybatis.cfg.xml ,可以看到我們爲 Java 類型設置了一個短的名字取代了類型的全路徑。

同時在映射文件 UserMapper.xml 中存在類似如下的語句:

<update id="updateUser"  parameterType="User">
    update user set
    address=#{address} where
    id=#{id}
</update>
<select id="selectUserById" parameterType="int" resultType="User">
    select * from user where id=#{id}
</select>

typeAliases 只和 XML 配置有關,用來減少類完全限定名的冗餘,如:

<typeAliases>  
      <typeAliase alias="User" type="com.gler.mybatis.model.User"/>
</typeAliases>

這裏將全路徑的 com.gler.mybatis.model.User 起一個別名 User 。在映射文件中 parameterTyperesultType 就可以直接使用別名 User ,無需使用全路徑。

除了上述方法,還可以指定一個包名起別名, MyBatis 會在包名下面搜索需要的 JavaBean,將 Java 類的類名作爲類的類別名,如:

<typeAliases>  
      <package name="com.gler.mybatis.model" />
</typeAliases>

MyBatis 中內建的別名,來自MyBatis中文文檔——typeAliases

別名 映射的類型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

4.typeHandlers 類型處理器

typeHandlers 的作用是實現 JDBC 類型和 Java 類型的之間的轉換,MyBatis 中默認的類型處理器基本能滿足日常需求。

類型處理器 Java 類型 JDBC 類型
BooleanTypeHandler java.lang.Boolean, boolean 數據庫兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 數據庫兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 數據庫兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 數據庫兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 數據庫兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler java.lang.Float, float 數據庫兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double 數據庫兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal 數據庫兼容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 數據庫兼容的字節流類型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定類型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)

5. environments 環境

MyBatis 的環境配置實際是數據源的配置。MyBatis 可以配置多個環境,幫助你將 SQL 映射對應到多種數據庫。

注:儘管可以配置多個環境,每個 SqlSessionFactory 實例只能對應一個數據庫,有幾個數據庫就需要創建幾個 SqlSessionFactory 實例。

接受環境配置的兩個方法:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment,properties);

如果忽略了環境參數,默認環境將會被加載:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);

(1) transactionManager 事務管理器

MyBatis 中的兩種事務管理器,即 type=”[JDBC|MANAGED]”:

  • JDBC:直接使用 JDBC 的提交和回滾設置
  • MANAGED:讓容器來管理事務的整個生命週期

(2)dataSource 數據源

dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 連接對象的資源。MyBatis 三種內建的數據源類型,即 type=”[UNPOOLED|POOLED|JNDI]”,這裏只詳細介紹 UNPOOLED

1> UNPOOLED

UNPOOLED 不支持 JDBC 數據源連接池,實現的只是每次被請求時打開和關閉連接。其包含的屬性:

  • driver:JDBC 驅動的 Java 類的完全限定名,如 MySQL 的 com.mysql.jdbc.Driver
  • url:數據庫的 JDBC URL 地址
  • username:數據庫的用戶名
  • password:數據庫的密碼
  • defaultTransactionIsolationLevel:默認的連接事務隔離級別。

2> POOLED

POOLED 支持 JDBC 數據源連接池,利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間。除了有 UNPOOLED 的屬性外還有包括 poolMaximumActiveConnections 、 poolMaximumIdleConnections 等屬性。

3> JNDI

JNDI 支持外部數據源連接池,它的實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然後放置一個 JNDI 上下文的引用。其包含的屬性:

  • initial_context:用來在 InitialContext 中尋找上下文
  • data_source:引用數據源實例位置的上下文的路徑

6. mappers 映射器

mappers 用於引用已經定義好的映射文件,告訴 MyBatis 去哪尋找映射 SQL 的語句。常見的方法:

(1)通過 resource 加載單個映射文件

<mappers>
    <mapper resource="com/gler/mybatis/mapper/UserMapper.xml"/> 
</mappers>

(2)通過完全限定資源定位符(絕對路徑前加上”file:///”)加載單個映射文件

<mappers>
    <mapper url="file:///home/gler/workspace/MyBatisTest/src/com/gler/mybatis/mapper/UserMapper.xml"/> 
</mappers>

(3)通過 mapper 接口對象加載單個映射文件

<mappers>
    <mapper class="com.gler.mybatis.mapper.UserMapper"/>
</mappers>

(4)通過 mapper 接口包加載整個包的映射文件

<mappers>
    <package name="com/gler/mybatis/mapper" />
</mappers>

注:(3)和(4)中需要將 mapper 接口類名和 mapper.xml 映射文件名稱保持一致,且在一個目錄中。

參考鏈接

發佈了39 篇原創文章 · 獲贊 207 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章