上一篇介紹了JDBC的相關(guān)概念、MyBatis的特性與Hibernate的區(qū)別、MyBatis的基本組件與生命周期,基本可以使用MyBatis了。
這一篇詳細介紹MyBatis的配置,首先看下配置XML文件的層次結(jié)構(gòu),然后詳細介紹每個配置項,說明每項的作用,值的取值與含義。
下面列出MyBatis配置XML文件的層次結(jié)構(gòu),這些層次是不能夠顛倒順序的。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties/>
<settings/>
<typeAliases/>
<typeHandles/>
<objectFactory/>
<plugins/>
<environments>
<environment>
<transanctionManager/> <!-- 配置事務(wù)管理器 -->
<dataSource/> <!-- 配置數(shù)據(jù)源 -->
</environment>
</environments>
<databaseIdProvider/> <!-- 數(shù)據(jù)庫廠商標識 -->
<mappers/> <!-- 映射器 -->
</configuration>
將一些公用、經(jīng)常變更的值單獨聲明,能在配置文件的上下文中使用它,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>
創(chuàng)建一個配置文件 jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mi-user
username = root
password = 123456
設(shè)置properties配置文件
<properties resource='jdbc.properties' />
實際工作中,會遇到這種場景:系統(tǒng)由運維人員配置,生成數(shù)據(jù)庫的密碼對開發(fā)者是保密的,對用戶名和密碼進行了加密。可以通過程序參數(shù)傳遞的方式,先解密,再設(shè)置property。
//讀入配置文件流
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);
//轉(zhuǎn)換為明文
properties.setProperty("username",decode(properties.getProperty("username")));
properties.setProperty("pwd",decode(properties.getProperty("pwd")));
//創(chuàng)建sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(cfgReader,properties);
如果3種配置同時出現(xiàn),優(yōu)先級為第3種 > 第2種 > 第1種,推薦使用第2種,有特殊需求時使用第3種。
設(shè)置會改變MyBatis運行時的行為,設(shè)置項很多,只會介紹常用的配置,想了解全部配置可以查看官方文檔。
在配置映射文件中,需要指定類的全限定名,為了簡化,可以聲明一個簡短的名稱去指代它,可以在MyBatis上下文中使用。系統(tǒng)已經(jīng)為我們定義了常用的類型,比如數(shù)值、字符串、日期、集合等。對于自定義的業(yè)務(wù)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在預(yù)處理語句中設(shè)置一個參數(shù)時,或者從結(jié)果集中取出一個值時,都會用注冊了的typeHader進行處理。typeHander的作用就是將參數(shù)從javaType轉(zhuǎn)化為jdbcType,或者從數(shù)據(jù)庫取出結(jié)果時把jdbcType轉(zhuǎn)化為javaType。
系統(tǒng)內(nèi)部已經(jīng)定義了常用的類型處理器,有些情況下,需要自定義。
MyBatis也提供了枚舉類型的類型處理器,有2個轉(zhuǎn)化枚舉類型的typeHandler,EnumTypeHandler和EnumOrdinalTypeHandler,其中EnumTypeHandler是使用枚舉字符串名稱作為參數(shù)傳遞的,EnumOrdinalTypeHandler是使用整數(shù)下標作為參數(shù)傳遞的。
但這2個枚舉類型應(yīng)用不那么廣泛,更多的時候,需要自定義typeHandler進行處理。
自定義類型處理器,首先要定義類型處理類,實現(xiàn)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>
當(dāng)MyBatis在構(gòu)建一個結(jié)果返回的時候,都會使用ObjectFactory去構(gòu)建POJO,在MyBatis中可以定制自己的對象工廠。一般不用配置,使用默認的DefaultObjectFactory即可。
插件比較復(fù)雜,后續(xù)單獨一篇文章介紹。
配置環(huán)境可以注冊多個數(shù)據(jù)源,每個數(shù)據(jù)源包括基本配置和數(shù)據(jù)庫事務(wù)配置。
<environments default="development">
<environment id="development">
<!-- 采用jdbc事務(wù)管理 -->
<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指定數(shù)據(jù)庫事務(wù),有3種配置方法:
dataSource標簽,配置數(shù)據(jù)源連接信息,type配置對數(shù)據(jù)庫連接方式,有以下幾種:
該屬性的作用在于指定SQL到對應(yīng)的數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫中運行。不常用,就不介紹了。
映射器是MyBatis最復(fù)雜、最核心的配置,包括參數(shù)類型、動態(tài)SQL、定義SQL、緩存信息等功能,上篇文章也演示了具體的例子,下篇文章會重點介紹細節(jié)。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
網(wǎng)站題目:深入淺出MyBatis:MyBatis的所有配置-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://aaarwkj.com/article40/dsjpeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、自適應(yīng)網(wǎng)站、軟件開發(fā)、用戶體驗、網(wǎng)站收錄、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)