Mybatis的配置文件如下所示挽牢。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration> <!--配置 -->
<properties/> <!--屬性 -->
<settings/> <!--設(shè)置 -->
<typeAliases /> <!--類型命名 -->
<typeHandlers /> <!--類型處理器 -->
<objectFactory /> <!--對(duì)象工廠 -->
<plugins /> <!--插件 -->
<environments> <!-- 配置環(huán)境 -->
<environment> <!--環(huán)境變量 -->
<transactionManager /> <!--事務(wù)管理器 -->
<dataSource /> <!--數(shù)據(jù)源 -->
<environment>
<environments>
<databaseIdProvider /> <!--數(shù)據(jù)庫(kù)廠商標(biāo)識(shí) -->
<mappers /> <!--映射器 -->
</configuration>
需要注意的是:MyBatis配置項(xiàng)的順序不能顛倒累提!
properties配置
properties屬性可以給系統(tǒng)配置一些運(yùn)行參數(shù)和措,供其它配置使用。一共有3種方式使用properties:
- property子元素
- properties文件
- 程序代碼傳遞
這里主要講解前兩種宙项。
property子元素
如下所示罕邀,使用property子元素將數(shù)據(jù)庫(kù)連接的相關(guān)配置放到一起畅形。好處是可以一次定義,到處引用燃少。但如果需要配置的參數(shù)過多的時(shí)候就不太合適束亏。
<?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>
<properties>
<property name="database.driver" value="com.mysql.jdbc.Driver" />
<property name="database.url" value="jdbc:mysql://localhost:3306/mybatis_demo?characterEncoding=utf-8" />
<property name="database.uaername" value="root" />
<property name="databse.password" value="123" />
</properties>
<settings>
<!-- 日志 -->
<setting name="logImpl" value="LOG4J" />
</settings>
<environments default="development">
<environment id="development">
<!-- 使用JDBC事務(wù)管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 數(shù)據(jù)庫(kù)連接池 -->
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/wyk/mybatisDemo/mapper/userMapper.xml" />
</mappers>
</configuration>
properties文件
這種方法使用較多铃在,文件也便于維護(hù)阵具。
在classpath下創(chuàng)建一個(gè)properties文件jdbc.properties。
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/mybatis_demo?characterEncoding=utf-8
database.username=root
database.username=123
同時(shí)修改MyBatis配置文件properties屬性定铜。
<properties resource="jdbc.properties" />
程序傳遞
這種方式一般應(yīng)用在文件需要加密的場(chǎng)景阳液,通過程序進(jìn)行解密在傳遞進(jìn)去。
settings配置
settings屬性本身較為復(fù)雜揣炕,但大部分情況使用默認(rèn)值即可帘皿,不需要配置。只需修改一些常用規(guī)則畸陡,比如自動(dòng)映射鹰溜、駝峰命名映射、級(jí)聯(lián)規(guī)則丁恭、是否啟動(dòng)緩存曹动、執(zhí)行器類型等。
有關(guān)該項(xiàng)可以直接查看 MyBatis中文開發(fā)文檔
typeAliases別名
typeAliases屬性用來(lái)為SQL映射文件中的輸入輸出參數(shù)設(shè)置類型別名牲览。
配置方式如下:
<typeAliases>
<typeAlias alias="user" type="com.wyk.mybatisDemo.pojo.User">
</typeAliases>
MyBatis還提供了批量注釋的方法墓陈,指定包名,程序會(huì)為該包下的所有包裝類加上別名。別名規(guī)范是對(duì)應(yīng)包裝類的類名首字母小寫贡必。
<typeAliases>
<package name="com.wyk.mybatisDemo.pojo" />
</typeAliases>
如果不想使用批量自動(dòng)使用的別名規(guī)則兔港,別可以通過注解"@Alias"來(lái)使用自定義別名。注意:只有typeAliases屬性中的包名下的類使用"@Alias"才會(huì)有效仔拟。
@Alias("user")
public class User {
...
}
typeHandler類型轉(zhuǎn)換器
類型處理器(typeHandler)負(fù)責(zé)數(shù)據(jù)庫(kù)類型(jdbcType)和Java類型(javaType)之間的相互轉(zhuǎn)換衫樊。一般情況下,使用默認(rèn)的系統(tǒng)定義typeHandler即可滿足需求利花。少部分特殊場(chǎng)景需要使用自定義的typeHandler橡伞,比如一些枚舉類型。
自定義typeHandler
自定義typehandler需要實(shí)現(xiàn)TypeHandler接口晋被,需要實(shí)現(xiàn)以下4個(gè)方法:
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
public String getResult(ResultSet rs, String columnName)
public String getResult(ResultSet rs, int columnIndex)
public String getResult(CallableStatement cs, int columnIndex)
寫一個(gè)自定義的typeHandler兑徘,實(shí)現(xiàn)String的轉(zhuǎn)換。
package com.wyk.mybatisDemo.typehandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;
/**
* 自定義TypeHandler
* @author yunkai
*
*/
public class MyTypeHandler implements TypeHandler<String>{
Logger logger = Logger.getLogger(MyTypeHandler.class);
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
logger.info("設(shè)置string參數(shù)[" + parameter + "]");
ps.setString(i, parameter);
}
public String getResult(ResultSet rs, String columnName) throws SQLException {
String result = rs.getString(columnName);
logger.info("讀取string參數(shù)1[" + result + "]");
return result;
}
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
logger.info("讀取string參數(shù)2[" + result + "]");
return result;
}
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
String result = cs.getString(columnIndex);
logger.info("讀取string參數(shù)3[" + result + "]");
return result;
}
}
在配置文件中配置typeHandler
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string"
handler="com.wyk.mybatisDemo.typehandler.MyTypeHandler"/>
</typeHandlers>
在映射文件中顯式使用typeHandler羡洛。
<select id="findUserByUsername2" resultType="user" >
SELECT * FROM T_USERS WHERE username LIKE CONCAT('%',
#{value, typeHandler=com.wyk.mybatisDemo.typehandler.MyTypeHandler}, '%')
</select>
MyBatis還支持?jǐn)?shù)據(jù)庫(kù)的Blob字段挂脑,提供BlobTypeHandler將byte[]轉(zhuǎn)換為blob。
一般在實(shí)際中使用文件流的形式來(lái)減小服務(wù)器的壓力欲侮,使用BlobInputStreamTypeHandler將InputStream轉(zhuǎn)為blob崭闲,更多的情況是使用文件服務(wù)器。
ObjectFactory對(duì)象工廠
創(chuàng)建結(jié)果集時(shí)威蕉,MyBatis會(huì)使用一個(gè)對(duì)象工廠來(lái)完成創(chuàng)建這個(gè)結(jié)果集實(shí)例刁俭。自己創(chuàng)建對(duì)象工廠比較復(fù)雜且容易出錯(cuò),一般繼承系統(tǒng)實(shí)現(xiàn)好的DefaultObjectFactory韧涨。
package com.wyk.mybatisDemo.objectfactory;
import java.util.List;
import java.util.Properties;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;
public class MyObjectFactory extends DefaultObjectFactory {
private static final long serialVersionUID = -7370040641835916468L;
Logger log = Logger.getLogger(MyObjectFactory.class);
private Object temp = null;
//處理參數(shù)
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
log.info("初始化參數(shù):[" + properties.toString() + "]");
}
//方法2
@Override
public <T> T create(Class<T> type) {
T result = super.create(type);
log.info("創(chuàng)建對(duì)象:" + result.toString());
log.info("是否和上次創(chuàng)建的是同一個(gè)對(duì)象:[" + (temp == result) + "]");
return result;
}
//方法1
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgsTypes,
List<Object> constructorArgs) {
T result = super.create(type, constructorArgsTypes, constructorArgs);
log.info("創(chuàng)建對(duì)象:" + result.toString());
temp = result;
return result;
}
//判斷集合類型參數(shù)
@Override
public <T> boolean isCollection(Class<T> type) {
return super.isCollection(type);
}
}
然后在配置文件進(jìn)行配置牍戚。其中的property參數(shù)會(huì)在加載配置的時(shí)候初始化到MyObjectFactory,作為該類的全局參數(shù)使用。
<objectFactory type="com.wyk.mybatisDemo.objectfactory.MyObjectFactory">
<property name="prop1" value="hahaha" />
</objectFactory>
輸出如下虑粥。每次都掉用兩個(gè)方法生成同一對(duì)象如孝。沒太明白原因,留到以后解析代碼的時(shí)候在研究娩贷。
plugins插件配置
待續(xù)
environments運(yùn)行環(huán)境配置
在MyBatis中第晰,運(yùn)行環(huán)境主要是配置數(shù)據(jù)庫(kù)信息”蜃妫可以配置多個(gè)數(shù)據(jù)庫(kù)茁瘦。它一共分為兩部分:事務(wù)管理器(tansactionManager)、數(shù)據(jù)源(dataSource)储笑。實(shí)際應(yīng)用中甜熔,大部分使用Spring進(jìn)行管理。
tansactionManager
事務(wù)管理器有2種類型:JDBC和MANAGED.
- 配置為JDBC會(huì)直接使用JDBC對(duì)數(shù)據(jù)庫(kù)的提交和回滾進(jìn)行操作南蓬。
- 配置為MANAGED則不提交和回滾連接纺非,而是由容器來(lái)管理事務(wù)的生命周期哑了。
dataSource
MyBatis中有3種內(nèi)建的數(shù)據(jù)源類型。
- UNPOOLED 設(shè)置每次請(qǐng)求時(shí)打開與關(guān)閉連接烧颖。
- POOLED 可以設(shè)置一個(gè)管理數(shù)據(jù)庫(kù)連接的資源池弱左。
- JNDI 配置外部連接數(shù)據(jù)源。
databaseIdProvider數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)
該元素用來(lái)支持不同廠商的數(shù)據(jù)庫(kù)炕淮。
mappers映射器
mappers用來(lái)配置需要加載的的SQL映射配置文件的路徑拆火。有以下幾種配置方式:
第一種,使用相對(duì)路徑涂圆。
<mappers>
<mapper resource="com/wyk/mybatisDemo/mapper/userMapper.xml" />
</mappers>
第二種们镜,使用絕對(duì)路徑。
<mappers>
<mapper url="file:///var/mappers/userMapper.xml" />
</mappers>
第三種润歉,使用接口信息配置模狭。
<mappers>
<mapper class="com.wyk.mybatisDemo.mapper.userMapper" />
</mappers>
第四種,使用接口所在的包進(jìn)行配置踩衩。
<mappers>
<package name="com.wyk.mybatisDemo.mapper" />
</mappers>