MyBatis學(xué)習(xí)筆記(二):配置介紹

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í)候在研究娩贷。

對(duì)象工廠測(cè)試.png

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚼鹉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驱富,更是在濱河造成了極大的恐慌锚赤,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐鸥,死亡現(xiàn)場(chǎng)離奇詭異线脚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門浑侥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人翠霍,你說我怎么就攤上這事锭吨。” “怎么了寒匙?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)躏将。 經(jīng)常有香客問我锄弱,道長(zhǎng),這世上最難降的妖魔是什么祸憋? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任会宪,我火速辦了婚禮,結(jié)果婚禮上蚯窥,老公的妹妹穿的比我還像新娘掸鹅。我一直安慰自己塞帐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布巍沙。 她就那樣靜靜地躺著葵姥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪句携。 梳的紋絲不亂的頭發(fā)上榔幸,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音矮嫉,去河邊找鬼削咆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蠢笋,可吹牛的內(nèi)容都是我干的拨齐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼昨寞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奏黑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起编矾,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熟史,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窄俏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹂匹,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年凹蜈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了限寞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仰坦,死狀恐怖履植,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悄晃,我是刑警寧澤玫霎,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站妈橄,受9級(jí)特大地震影響庶近,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眷蚓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一鼻种、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沙热,春花似錦叉钥、人聲如沸罢缸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枫疆。三九已至,卻和暖如春蛾洛,著一層夾襖步出監(jiān)牢的瞬間养铸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工轧膘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钞螟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓谎碍,卻偏偏與公主長(zhǎng)得像鳞滨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蟆淀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容