上一篇介紹了JDBC的相關概念、MyBatis的特性與Hibernate的區別、MyBatis的基本組件與生命週期,基本可使用MyBatis了。php
文章索引:
java
這一篇詳細介紹MyBatis的配置,首先看下配置XML文件的層次結構,而後詳細介紹每一個配置項,說明每項的做用,值的取值與含義。mysql
下面列出MyBatis配置XML文件的層次結構,這些層次是不可以顛倒順序的。sql
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties/>
<settings/>
<typeAliases/>
<typeHandles/>
<objectFactory/>
<plugins/>
<environments>
<environment>
<transanctionManager/> <!-- 配置事務管理器 -->
<dataSource/> <!-- 配置數據源 -->
</environment>
</environments>
<databaseIdProvider/> <!-- 數據庫廠商標識 -->
<mappers/> <!-- 映射器 -->
</configuration>
複製代碼
將一些公用、常常變動的值單獨聲明,能在配置文件的上下文中使用它,MyBatis提供了3種配置方式:數據庫
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mi-user"/>
<property name="username" value="root"/>
<property name="pwd" value="123456"/>
</properties>
複製代碼
建立一個配置文件 jdbc.propertiesapache
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mi-user
username = root
password = 123456
複製代碼
設置properties配置文件緩存
<properties resource='jdbc.properties' />
複製代碼
實際工做中,會遇到這種場景:系統由運維人員配置,生成數據庫的密碼對開發者是保密的,對用戶名和密碼進行了加密。能夠經過程序參數傳遞的方式,先解密,再設置property。bash
//讀入配置文件流
InputStream cfgStream = Resources.getResourceAsStream("mybatis-config.xml");
Reader cfgReader = new InputStreamReader(cfgStream);
//讀入屬性文件流
InputStream proStream = Resources.getResourceAsStream("jdbc.properties");
Reader proReader = new InputStreamReader(proStream);
Properties properties = new Properties();
properties.load(proReader);
//轉換爲明文
properties.setProperty("username",decode(properties.getProperty("username")));
properties.setProperty("pwd",decode(properties.getProperty("pwd")));
//建立sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(cfgReader,properties);
複製代碼
若是3種配置同時出現,優先級爲第3種 > 第2種 > 第1種,推薦使用第2種,有特殊需求時使用第3種。微信
設置會改變MyBatis運行時的行爲,設置項不少,只會介紹經常使用的配置,想了解所有配置能夠查看官方文檔。mybatis
在配置映射文件中,須要指定類的全限定名,爲了簡化,能夠聲明一個簡短的名稱去指代它,能夠在MyBatis上下文中使用。系統已經爲咱們定義了經常使用的類型,好比數值、字符串、日期、集合等。對於自定義的業務POJO,須要自定義別名。
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
</typeAliases>
複製代碼
也能夠經過註解方式進行,首先配置一個掃描的包,而後在類定義時添加註解@Alias("role")。
<typeAliases>
<package name="com.learn.chapter2.po" />
</typeAliases>
複製代碼
@Alias("role")
public class Role{
}
複製代碼
MyBatis在預處理語句中設置一個參數時,或者從結果集中取出一個值時,都會用註冊了的typeHader進行處理。typeHander的做用就是將參數從javaType轉化爲jdbcType,或者從數據庫取出結果時把jdbcType轉化爲javaType。
系統內部已經定義了經常使用的類型處理器,有些狀況下,須要自定義。
MyBatis也提供了枚舉類型的類型處理器,有2個轉化枚舉類型的typeHandler,EnumTypeHandler和EnumOrdinalTypeHandler,其中EnumTypeHandler是使用枚舉字符串名稱做爲參數傳遞的,EnumOrdinalTypeHandler是使用整數下標做爲參數傳遞的。
但這2個枚舉類型應用不那麼普遍,更多的時候,須要自定義typeHandler進行處理。
自定義類型處理器,首先要定義類型處理類,實現TypeHandler泛型接口:
public class SexEnumTypeHandler implements TypeHandler<Sex> {
@Override
public void setParameter(PreparedStatement ps, int i, Sex sex, JdbcType jdbcType) throws SQLException {
ps.setInt(i, sex.getId());
}
@Override
public Sex getResult(ResultSet rs, String name) throws SQLException {
return Sex.getSex(rs.getInt(name));
}
@Override
public Sex getResult(ResultSet rs, int id) throws SQLException {
return Sex.getSex(id);
}
@Override
public Sex getResult(CallableStatement cs, int id) throws SQLException {
return Sex.getSex(cs.getInt(id));
}
}
複製代碼
而後註冊自定義的TypeHandler
<typeHandlers>
<typeHandler handler="com.qqdong.study.SexEnumTypeHandler" javaType="sex"/>
</typeHandlers>
複製代碼
最後,在定義映射器時,指定typeHandler便可
<select id="getUser" parameterType="long" resultType="userMap">
</select>
<resultMap id="userMap" type="user">
<result column="sex" property="sex" typeHandler="com.qqdong.study.SexEnumTypeHandler">
</resultMap>
複製代碼
當MyBatis在構建一個結果返回的時候,都會使用ObjectFactory去構建POJO,在MyBatis中能夠定製本身的對象工廠。通常不用配置,使用默認的DefaultObjectFactory便可。
插件比較複雜,後續單獨一篇文章介紹。
配置環境能夠註冊多個數據源,每一個數據源包括基本配置和數據庫事務配置。
<environments default="development">
<environment id="development">
<!-- 採用jdbc事務管理 -->
<transactionManager type="JDBC">
<property name="autoCommit" value="false">
</transactionManager>
<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>
複製代碼
其中,transactionManager指定數據庫事務,有3種配置方法:
dataSource標籤,配置數據源鏈接信息,type配置對數據庫鏈接方式,有如下幾種:
該屬性的做用在於指定SQL到對應的數據庫廠商提供的數據庫中運行。不經常使用,就不介紹了。
映射器是MyBatis最複雜、最核心的配置,包括參數類型、動態SQL、定義SQL、緩存信息等功能,上篇文章也演示了具體的例子,下篇文章會重點介紹細節。
歡迎掃描下方二維碼,關注個人我的微信公衆號 ~