1 概述
-
Mybatis的全局配置文件包含了影響Mybatis行為甚深的設置(settings)和屬性(properties)信息。
-
文檔的頂層結構如下:
- Configuration配置:
- properties屬性
- settings設置
- typeAliases類型命名
- typeHandlers類型處理器
- objectFactory對象工廠
- plugins插件
- environments環境
- environment環境變量
- transactionManager事務管理器
- dataSource數據源
- environment環境變量
- databaseIdProvider數據庫廠商標識
- mappers 映射器
- Configuration配置:
2 properties(了解)
-
Mybatis可以使用properties標簽來引入外部的properties屬性配置文件中的內容。
-
屬性:
- resource:引入類路徑下的配置文件。
- url:引入網絡或磁盤上的配置文件。
-
示例:
-
db.properties
jdbc.url=jdbc:mysql://192.168.134.100:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=123456
- mybatis-config.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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties" ></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
3 settings
-
這是Mybatis中極為重要的調整設置,它們會改變Mybatis的運行時行為。
-
示例:
-
mybatis-config.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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties" ></properties>
<settings>
<!--
開啟自動駝峰命名規則映射,可以將諸如last_name封裝為lastName。
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
4 typeAliases(別名處理器)
- 類型別名是為Java類型設置一個短的名字,可以方便我們引用某個類。
<?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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties" ></properties>
<settings>
<!-- 開啟自動駝峰命名規則映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--
類型別名是為Java類型設置一個短的名字,可以方便我們引用某個類
-->
<typeAlias type="com.sunxiaping.domain.Employee" alias="emp"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
- 在類很多的情況下,可以批量設置別名。
<?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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties" ></properties>
<settings>
<!-- 開啟自動駝峰命名規則映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--
通過package標簽的name屬性指定需要生成別名的包,默認會創建一個別名,就是類名的小寫
-->
<package name="com.sunxiaping"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
- 可以在類上使用@Alias注解設置別名:
package com.sunxiaping.domain;
import org.apache.ibatis.type.Alias;
@Alias("emp")
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
- 需要注意的是,Mybatis已經為許多常見的Java類型內建了相應的類型別名。它們都是大小寫不敏感的,我們在起別名的時候千萬不要占用已有的別名。
別名 | 映射的類型 |
---|---|
_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 |
5 typeHandlers(類型處理器)
- 無論是Mybatis在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值的時候,都會用類型處理器將獲取的值以合適的方式轉換為Java類型。
類型處理器 | Java類型 | JDBC類型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean,boolean | 數據庫兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte,byte | 數據庫兼容的NUMERIC或BYTE |
ShortTypeHandler | java.lang.Short,short | 數據庫兼容的NUMERIC或SHROT 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.lang.BigDecimal | 數據庫兼容的NUMERIC或DECIMAL |
StringTypeHandler | java.lang.String | CHAR,VARCHAR |
-
日期類型的處理:JDK1.8以前一直是個頭疼的問題。我們通常使用JSR310規范領導者Stephen Colebourne創建的Joda-Time來操作。JDK1.8已經實現全部的JST310規范了。日期時間處理上,我們可以使用Mybatis基於JSR310編寫的各種日期時間類型處理器。Mybatis3.4以前的版本需要我們手動注冊這些處理器,以后的版本都是自動注冊的。
-
自定義類型處理器:我們可以重寫類型處理器或者創建自己的類型處理器來處理器不支持的或非標准的類型。
- 步驟:
- ①實現org.apche.ibatis.type.TypeHandler接口或者繼承org.apche.ibatis.type.BaseTypeHandler。
- ②指定其映射某個JDBC類型。
- ③在Mybatis的全局配置文件中注冊。
- 步驟:
6 plugins(插件)
- 插件是Mybatis提供的一個非常強大的機制,我們可以通過插件來修改Mybatis的一些核心行為。插件通過動態代理機制,可以介入四大對象的任何一個方法的執行。
Executor(update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
ParameterHandler(getParameterObject, setParameters)
ResultSetHandler(handleResultSets, handleOutputParameters)
StatementHandler(prepare, parameterize, batch, update, query)
7 environments(環境)
-
Mybatis可以配置多種環境,比如開發、測試和生產環境需要有不同的配置。
-
每種環境使用一個environment標簽進行配置並指定唯一標識符。
-
可以通過environments標簽中的default屬性指定一個環境的標識符來快速的切換環境。
-
environment:指定具體環境
- id:指定當前環境的唯一標識。
- transactionManager:事務管理器。
- type:事務管理器的類型。有JDBC、MANAGED和自定義類型。
- JDBC:使用了JDBC的提交和回滾設置,依賴於從數據源得到的連接來管理事務范圍。
- MANAGED:不提交或回滾一個連接、讓容器來管理事務的整個生命周期。
- 自定義:實現TransactionFactory接口,type=全類名/別名。
- type:事務管理器的類型。有JDBC、MANAGED和自定義類型。
- dataSource:數據源。
- type:數據源類型。有UNPOOLED、POOLED、JNDI和自定義類型。
- UNPOOLED:不使用連接池。
- POOLED:使用連接池。
- JNDI:在EJB或應用服務器這類容器中查找指定的數據源。
- 自定義:實現DataSourceFactory接口,定義數據源的獲取方式。
- type:數據源類型。有UNPOOLED、POOLED、JNDI和自定義類型。
-
示例:
<?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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties" ></properties>
<settings>
<!-- 開啟自動駝峰命名規則映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--
通過package標簽的name指定需要生成別名的包,默認會創建一個別名,就是類名的小寫
-->
<package name="com.sunxiaping"/>
</typeAliases>
<!--
environments,Mybatis可以配置多種環境
environment:配置一個具體的環境信息;必須有transactionManager和dataSource標簽。屬性id代表當前環境的標識,可以達到快速切換環境
transactionManager:事務管理器
type:事務管理器的類型,有JDBC和MANAGED兩種類型,還可以自定義事務管理器
dataSource:數據源
type:數據源的類型,有UNPOOLED、POOLED、JNDI和自定義類型。
-->
<environments default="development">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
8 databaseIdProvider
- Mybatis可以根據不同的數據庫廠商執行不同的語句。
<databaseIdProvider type="DB_VENDOR">
<!--
為不同的數據庫廠商起別名
-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
-
databaseIdProvider標簽的屬性type的值是DB_VENDOR,會通過DatabaseMetaData中的getDatabaseProductName()方法返回的字符串進行設置。由於通常情況下這個字符串非常長而且相同產品的不同版本會返回不同的值,所以最好通過設置屬性別名來使其變短。
-
Mybatis的匹配規則如下:
- ①如果沒有配置databaseIdProvider標簽,那么databaseId的值就為null。
- ②如果配置了databaseIdProvider標簽,使用標簽配置的name去匹配數據庫的信息,匹配上設置databaseId=配置指定的值,否則依舊為null。
- ③如果databaseId不為null,Mybatis只會找到配置databaseId的SQL語句。
- ④Mybatis會同時加載不帶databaseId屬性和帶有匹配當前數據庫databaseId屬性的所有語句。如果同時找到帶有databaseId和不帶databaseId的相同語句,則后者會被舍棄。
-
示例:
-
mybatis-config.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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties"></properties>
<settings>
<!-- 開啟自動駝峰命名規則映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--
通過package標簽的name指定需要生成別名的包,默認會創建一個別名,就是類名的小寫
-->
<package name="com.sunxiaping"/>
</typeAliases>
<!--
environments,Mybatis可以配置多種環境
environment:配置一個具體的環境信息;必須有transactionManager和dataSource標簽。屬性id代表當前環境的標識,可以達到快速切換環境
transactionManager:事務管理器
type:事務管理器的類型,有JDBC和MANAGED兩種類型,還可以自定義事務管理器
dataSource:數據源
type:數據源的類型,有UNPOOLED、POOLED、JNDI和自定義類型。
-->
<environments default="development">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--
databaseIdProvider:支持多數據庫廠商
type="DB_VENDOR":VendorDatabaseIdProvider
- 作用: 得到數據庫廠商的標識(驅動,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),
Mybatis就能數據數據庫廠商標識來指定不同的SQL
-->
<databaseIdProvider type="DB_VENDOR">
<!--
為不同的數據庫廠商起別名
-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
- EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunxiaping.mapper.EmployeeMapper">
<select id="findById" resultType="com.sunxiaping.domain.Employee">
SELECT id,last_name as lastName,email,gender
FROM employee
WHERE id = #{id,jdbcType=INTEGER}
</select>
<!--
select標簽中databaseId用來指定在那種數據庫環境下執行
-->
<select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="mysql">
SELECT id,last_name as lastName,email,gender
FROM employee
WHERE id = #{id,jdbcType=INTEGER}
</select>
<!--
select標簽中databaseId用來指定在那種數據庫環境下執行
-->
<select id="findById" resultType="com.sunxiaping.domain.Employee" databaseId="oracle">
SELECT id,last_name as lastName,email,gender
FROM employees
WHERE id = #{id,jdbcType=INTEGER}
</select>
</mapper>
9 mapper(映射)
- mapper逐個注冊SQL映射文件
<mappers>
<mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>
</mappers>
- 使用批量注冊:如果有SQL映射文件存在,文件名必須和Mapper接口名相同且必須在同一個目錄下
<mappers>
<package name="com.sunxiaping.mapper"/>
</mappers>
- 示例:
<?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>
<!--
Mybatis可以使用properties標簽來引入外部properties配置文件的內容
resource屬性:引入類路徑下的配置文件
url屬性:引入網絡或磁盤上的配置文件
-->
<properties resource="db.properties"></properties>
<settings>
<!-- 開啟自動駝峰命名規則映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!--
通過package標簽的name指定需要生成別名的包,默認會創建一個別名,就是類名的小寫
-->
<package name="com.sunxiaping"/>
</typeAliases>
<!--
environments,Mybatis可以配置多種環境
environment:配置一個具體的環境信息;必須有transactionManager和dataSource標簽。屬性id代表當前環境的標識,可以達到快速切換環境
transactionManager:事務管理器
type:事務管理器的類型,有JDBC和MANAGED兩種類型,還可以自定義事務管理器
dataSource:數據源
type:數據源的類型,有UNPOOLED、POOLED、JNDI和自定義類型。
-->
<environments default="development">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用${}引入db.properties屬性文件中的內容 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--
databaseIdProvider:支持多數據庫廠商
type="DB_VENDOR":VendorDatabaseIdProvider
- 作用: 得到數據庫廠商的標識(驅動,Connection接口中的getMetaData()返回了DatabaseMetaData,DatabaseMetaData中有getDatabaseProductName()方法),
Mybatis就能數據數據庫廠商標識來指定不同的SQL
-->
<databaseIdProvider type="DB_VENDOR">
<!--
為不同的數據庫廠商起別名
-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<!--
mappers將SQL映射注冊到全局配置中
-->
<mappers>
<!--
mapper:注冊一個SQL映射
- resource:引用類路徑下的SQL映射文件
- url:引用網絡路徑下的SQL映射文件
- class:引用接口,
- 有SQL配置文件,接口和配置文件必須放在同一目錄下,且接口名和配置文件的名稱必須相同
- 沒有SQL配置文件,所有的SQL都是利用注解寫在接口上
-->
<!-- mapper resource="com/sunxiaping/mapper/EmployeeMapper.xml"/>-->
<!--
package:批量注冊,如果有SQL配置文件,接口和配置文件必須放在同一目錄下,且接口名和配置文件的名稱必須相同
-->
<package name="com.sunxiaping.mapper"/>
</mappers>
</configuration>