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
。在映射文件中 parameterType
和 resultType
就可以直接使用別名 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 映射文件名稱保持一致,且在一個目錄中。
參考鏈接