1. 程式人生 > >初識MyBatis框架(四大核心元件和配置檔案)

初識MyBatis框架(四大核心元件和配置檔案)

一、概述

MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

優點:

  1. 簡單易學,本身比較小巧。
  2. 不遮蔽SQL語句,我們可以根據自己的需求去編寫優化SQL語句。
  3. 對映機制十分靈活,支援動態SQL、儲存過程。
  4. 對映器建立簡單,只需一個介面和一個XML檔案即可。

缺點:
需要手動編寫SQL語句和對映規則,某些情況下會加大工作量

二、四大核心元件

  • SqlSessionFactoryBuilder(構造器): 根據配置或程式碼生成SqlSessionFactory,採用分步構建的Builder模式,建立成功SqlSessionFactory後就失去了作用。
  • SqlSessionFactory(工廠介面):使用它來生成SqlSession介面物件,使用工廠模式。你可以認為它是一個數據庫連線池,為了避免它被多次建立,消耗資料庫資源,一般我們採用單例模式建立,存活於整個mybatis中。
  • SqlSession(會話):即可傳送SQL執行返回結果,又可獲取mapper的介面。相當於一個數據庫連線物件,可以在一個事務裡面執行多條SQL,通過commit、rollback進行提交或回滾事務。存活於一個業務邏輯中,處完成後為避免消耗資料庫資源,可以使用try…catch…finally確保將其關閉,
  • SQL Mapper(對映器):由一個Java介面和XML檔案(或註解)構成。根據編寫的SQL和對映規則,實現對資料庫的訪問,並返回結果。存活於一個請求中,一但請求完畢後,就會廢棄。

1、SqlSessionFactory的建立

SqlSessionFactory可以通過兩種方式進行建立,一種是java程式碼生成,一種是讀取XML配置檔案生成。一般大家都使用XML模式進行建立,因為修改時比較方便,方便日後的管理,其次看起來也比較直觀。

XML檔案建立:

這是一個簡單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>
    <!--資料庫環境 -->
    <properties resource="jdbc.properties"/>
   <environments default="development">
       <environment id="decelopment">
           <transactionManager type="JDBC" />
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis_studydb"/>
               <property name="username" value="root"/>
               <property name="password" value=""/>
           </dataSource>
       </environment>
   </environments>
</configuration>

有了資料庫環境,我們就可以簡單生成SqlSessionFactory了

// 配置檔案放到了resources資料夾中
// 如果你放到了一個包中,你可以這樣找到它 com/lzx/config/mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);//讀取配置檔案
MySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

java程式碼建立

// 配置資料庫
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_studydb");
dataSource.setUsername("root");
dataSource.setPassword("");
// 關閉事務的自動提交
dataSource.setDefaultAutoCommit(false);
// 採用Mybatis的JDBC的事務方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
// 加入對映器
configuration.addMapper(BlogMapper.class);
// 建立SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration)

2、掌握SqlSession的使用

mybatis中SqlSession是它的核心介面,有兩個實現類:DefaultSqlSession和SqlSessionManager,其中DefaultSqlSession是在單執行緒中使用的,SqlSessionManager是在多執行緒中使用的。

SqlSession共有一下三個作用:

  1. 獲取Mapper介面

  2. 傳送SQL給資料庫

  3. 控制資料庫事務

     //這裡的sqlSessionFactory是上面SqlSessionFactory創建出來的·
     SqlSession session =  sqlSessionFactory.openSession();
     try {
         // do work
         sqlSessionFactory.commit();
     } catch (Exception e){
         sqlSessionFactory.rollback();  
     } finally {
         session.close();
     }
    

3、瞭解對映器

對映器是MyBtis中最為重要、最複雜的元件。可以通過XML檔案和註解的形式去實現。可以用來配置以下內容:

  • 描述對映規則
  • 編寫SQL語句,可以配置引數型別、返回型別、快取重新整理等資訊。
  • 支援動態SQL
  • 配置快取

這裡我們暫時先了解一下它,因為它最為重要,我們以後會單獨去學習掌握。

對映器介面:

@Repository
public interface BillingInfoDAO {
    BillingInfoEntity queryById(int id);
}

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.lzx.dao.BillingInfoDAO">
    <select id="queryById" resultType="com.lzx.entity.BillingInfoEntity">
      select invoice_id,billing_address,billing_city,billing_state,
      billing_country,billing_postalcode from invoice where invoice_id=#{id}
    </select>
</mapper>

註解實現對映器:

public interface BillingInfoDAO {
	//這裡不推薦使用,較為複雜的sql語句不便於管理
	@select(select invoice_id,billing_address,billing_city,billing_state,
      billing_country,billing_postalcode from invoice where invoice_id=#{id})
    BillingInfoEntity queryById(int id);
}

三、掌握MyBatis配置檔案

瞭解MyBatis配置檔案的所有元素

<?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 /> <!--屬性-->
    <settings /> <!--設定-->	        
    <typeAliases /> <!--類型別名-->
    <typeHandlers /> <!--型別處理器-->
    <objectFactory /> <!--物件工廠-->
    <environments > <!--配置環境-->
        <environment > <!--環境配置-->
            <transactionManager ></transactionManager> <!--事務管理器-->
            <dataSource></dataSource> <!--資料來源-->
        </environment>
    </environments> 
    <databaseIdProvider /> <!--資料庫廠商-->
    <mappers /> <!--對映器-->
</configuration>

接下來我們開始掌握這些元素的使用,接下來的所有配置都是在configuration裡面完成的,注意這些元素的順序一定要按照上面的順序,不可隨意放置, MyBatis的配置檔案一般以mybatis-config.xml來命名,放置到類的載入路徑下

1、porperties屬性

<!-- 通過porpert的子元素來進行資料庫連線的相關配置-->
<properties>
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis_studydb" />
    <property name="jdbc.username" value="root" />
    <property name="jdbc.password" value="123456" />
</properties>

<environments default="development">
    <environment id="decelopment">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

為了方便管理,我們一般使用properties檔案進行資料庫的連線配置。建立jdbc.properties檔案,放置classpath路徑下。方便我們配置資料庫。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_studydb
jdbc.username=root
jdbc.password=123456

接下來我們就可以把properties和它的子元素進行替換即可

<properties resource="jdbc.properties"/>

2、settings設定

settings是 MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的執行時行為。大部分情況下保持預設值執行即可。

一個配置完整的 settings 元素的示例如下:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

下面是settings配置項的詳細說明:

設定引數描述有效值預設值
cacheEnabled全域性地開啟或關閉配置檔案中的所有對映器已經配置的任何快取。true|falsetrue
lazyLoadingEnabled延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態。true|falsefalse
aggressiveLazyLoading當開啟時,任何方法的呼叫都會載入該物件的所有屬性。否則,每個屬性會按需載入(參考lazyLoadTriggerMethods).true|falsefalse(truein≤3.4.1)
multipleResultSetsEnabled是否允許單一語句返回多結果集(需要相容驅動)。true|falsetrue
useColumnLabel使用列標籤代替列名。不同的驅動在這方面會有不同的表現,具體可參考相關驅動文件或通過測試這兩種不同的模式來觀察所用驅動的結果。true|falsetrue
useGeneratedKeys允許JDBC支援自動生成主鍵,需要驅動相容。如果設定為true則這個設定強制使用自動生成主鍵,儘管一些驅動不能相容但仍可正常工作(比如Derby)。true|falseFalse
autoMappingBehavior指定MyBatis應如何自動對映列到欄位或屬性。NONE表示取消自動對映;PARTIAL只會自動對映沒有定義巢狀結果集對映的結果集。FULL會自動對映任意複雜的結果集(無論是否巢狀)。NONE,PARTIAL,FULLPARTIAL
autoMappingUnknownColumnBehavior指定發現自動對映目標未知列(或者未知屬性型別)的行為。
  • NONE:不做任何反應
  • WARNING:輸出提醒日誌('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日誌等級必須設定為WARN)
  • FAILING:對映失敗(丟擲SqlSessionException)
NONE,WARNING,FAILINGNONE
defaultExecutorType配置預設的執行器。SIMPLE就是普通的執行器;REUSE執行器會重用預處理語句(preparedstatements);BATCH執行器將重用語句並執行批量更新。SIMPLEREUSEBATCHSIMPLE
defaultStatementTimeout設定超時時間,它決定驅動等待資料庫響應的秒數。任意正整數NotSet(null)
defaultFetchSize為驅動的結果集獲取數量(fetchSize)設定一個提示值。此引數只可以在查詢設定中被覆蓋。任意正整數NotSet(null)
safeRowBoundsEnabled允許在巢狀語句中使用分頁(RowBounds)。如果允許使用則設定為false。true|falseFalse
safeResultHandlerEnabled允許在巢狀語句中使用分頁(ResultHandler)。如果允許使用則設定為false。true|falseTrue
mapUnderscoreToCamelCase是否開啟自動駝峰命名規則(camelcase)對映,即從經典資料庫列名A_COLUMN到經典Java屬性名aColumn的類似對映。true|falseFalse
localCacheScopeMyBatis利用本地快取機制(LocalCache)防止迴圈引用(circularreferences)和加速重複巢狀查詢。預設值為SESSION,這種情況下會快取一個會話中執行的所有查詢。若設定值為STATEMENT,本地會話僅用在語句執行上,對相同SqlSession的不同調用將不會共享資料。SESSION|STATEMENTSESSION
jdbcTypeForNull當沒有為引數提供特定的JDBC型別時,為空值指定JDBC型別。某些驅動需要指定列的JDBC型別,多數情況直接用一般型別即可,比如NULL、VARCHAR或OTHER。JdbcType常量.大多都為:NULL,VARCHARandOTHEROTHER
lazyLoadTriggerMethods指定哪個物件的方法觸發一次延遲載入。用逗號分隔的方法列表。equals,clone,hashCode,toString
defaultScriptingLanguage指定動態SQL生成的預設語言。一個類型別名或完全限定類名。org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler指定Enum使用的預設TypeHandler。(從3.4.5開始)一個類型別名或完全限定類名。org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls指定當結果集中值為null的時候是否呼叫對映物件的setter(map物件時為put)方法,這對於有Map.keySet()依賴或null值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成null的。true|falsefalse
returnInstanceForEmptyRow當返回行的所有列都是空時,MyBatis預設返回null。當開啟這個設定時,MyBatis會返回一個空例項。請注意,它也適用於巢狀的結果集(i.e.collectioinandassociation)。(從3.4.2開始)true|falsefalse
logPrefix指定MyBatis增加到日誌名稱的字首。任何字串Notset
logImpl指定MyBatis所用日誌的具體實現,未指定時將自動查詢。SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGINGNotset
proxyFactory指定Mybatis建立具有延遲載入能力的物件所用到的代理工具。CGLIB|JAVASSISTJAVASSIST(MyBatis3.3orabove)
vfsImpl指定VFS的實現自定義VFS的實現的類全限定名,以逗號分隔。Notset
useActualParamName允許使用方法簽名中的名稱作為語句引數名稱。為了使用該特性,你的工程必須採用Java8編譯,並且加上-parameters選項。(從3.4.1開始)true|falsetrue
configurationFactory指定一個提供Configuration例項的類。這個被返回的Configuration例項用來載入被反序列化物件的懶載入屬性值。這個類必須包含一個簽名方法staticConfigurationgetConfiguration().(從3.2.3版本開始)類型別名或者全類名.Notset

3、typeAlias別名

由於類的完全限定名稱比較長,大量使用時十分不方便。MyBatis通過別名的方式來代表它,在MyBatis中別名是不區分大小寫。別名又分為系統定義別名和自定義別名。

配置自定義別名:

<typeAliases>
    <!--全寫-->
    <typeAlias type="com.lzx.entity.Author" alias="author" />
    <typeAlias type="com.lzx.entity.Blog" alias="blog" />
    <!--簡寫,MyBatis自動掃描這個包下面的所有類,把第一字母變成小寫作為別名-->
    <package name="com.lzx.entity" />
</typeAliases>

使用註解配置別名:

@Alias("blog")
public class Blog {
	...
}

系統自定義別名:

別名對映的型別
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

4、typeHandler型別轉換器

在JDBC中,需要在PreparedStatement中處理預編譯的SQL語句中的引數,執行完畢SQL後,通過ResultSet物件獲得資料庫中的資料,這些資料型別在MyBatis中通過typeHandler實現。在typeHandler中分為jdbcType和javaType。jdbcType定義資料庫型別,javaType定義java型別。typeHandler的作用是承擔jdbcType和javaType之間的相互轉換。一般來說,系統定義的typeHandler就足夠我們使用,我們還可以自定義typeHandler來處理我們需要滿足的轉換規則。

系統定義的typeHandler:

型別處理器Java型別JDBC型別
BooleanTypeHandlerjava.lang.Boolean,boolean資料庫相容的BOOLEAN
ByteTypeHandlerjava.lang.Byte,byte資料庫相容的NUMERICBYTE
ShortTypeHandlerjava.lang.Short,short資料庫相容的NUMERICSHORTINTEGER
IntegerTypeHandlerjava.lang.Integer,int資料庫相容的NUMERICINTEGER
LongTypeHandlerjava.lang.Long,long資料庫相容的NUMERICLONGINTEGER
FloatTypeHandlerjava.lang.Float,float資料庫相容的NUMERICFLOAT
DoubleTypeHandlerjava.lang.Double,double資料庫相容的NUMERICDOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal資料庫相容的NUMERICDECIMAL
StringTypeHandlerjava.lang.StringCHAR,VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB,LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR,NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]資料庫相容的位元組流型別
BlobTypeHandlerbyte[]BLOB,LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER或未指定型別
EnumTypeHandlerEnumerationTypeVARCHAR-任何相容的字串型別,儲存列舉的名稱(而不是索引)
EnumOrdinalTypeHandlerEnumerationType任何相容的NUMERICDOUBLE型別,儲存列舉的索引(而不是名稱)。
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHARorLONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

自定義typeHandler需要實現TypeHandler介面

public class MyTypeHandler implements TypeHandler<Integer> {
    // ...重寫方法
}

配置自定義typeHandler:

<typeHandlers>
    <typeHandler handler="com.lzx.element.MyTypeHandler" 
		javaType="string" jdbcType="VARCHAR" />

	<!--掃描包配置typeHandler-->
    <package name="com.lzx.mytypehandler" />
</typeHandlers>

使用包掃描和註解註冊typeHandler

@MappedTypes(Integer.class)
@MappedJdbcTypes(jdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<Integer> {
    // ...重寫方法	  
}

使用自定義typeHandler

<!--使用方式一-->
<resultMap id="authorMapper" type="author">
    <id property="id" column="id"/>
    <result property="name" column="name" typeHandler="com.lzx.element.MyTypeHandler"/>
</resultMap>

  <!--使用方式二-->
<select id="queryByName" >
    select `id`,`name` from author
      where `name` = #{name, typeHandler=com.lzx.element.MyTypeHandler}
</select>

列舉typeHandler

大多數情況下,typeHandler因為列舉而使用,MyBatis定義了兩個類作為列舉型別地支援,因為不常用,所以我們瞭解一下即可。分別是EnumOrdinalTypeHandler和EnumTypeHandler。其中,EnumOrdinalTypeHandler是按照MyBatis根據陣列下標索引的方式進行匹配的,它要求資料庫返回一個整數作為其下標,它會根據下標找到對應的列舉型別。 EnumTypeHandler會把使用的名稱轉換為對應的列舉,比如它根據資料庫返回的字串“MALE”進行Enum.valueOf(SexEnum.class,“MALE”)轉換。

檔案操作

MyBatis對資料的Blob的欄位進行了支援,提供了一個BlobTypeHandler,還有ByteArrayTypeHanddler,只不過不太常用。因為一次性把大批量的資料載入到JVM中,會對伺服器造成很大的壓力,應該考慮採用檔案流的形式。因為效能不佳,大型網際網路網站會採用檔案伺服器的形式,能夠對檔案進行更為告訴的操作。

5、ObjectFactory(物件工廠)

MyBatis 每次建立結果物件的新例項時,它都會使用一個物件工廠(ObjectFactory)例項來完成。MyBatis允許自定義ObjectFactory,可以繼承ObjectFactory來實現,但是由於裡面的自定義返回規則比較複雜且易出錯,所以我們繼承系統實現好的ObjectFactory即可。

public class MyObjectFactory extends DefaultObjectFactory {
// .....重寫方法
}

XML配置:

<objectFactory type="com.lzx.element.MyObjectFactory">
    <property name="properties" value="properties_value"/>
</objectFactory>

6、外掛(plugin)

外掛是MyBatis中最為強大和靈活的元件,也是最為複雜、最難使用的元件。因為它覆蓋了MyBatis底層物件的核心方法和屬性,如果不熟悉MyBatis底層的構建和執行原理,請不要隨意自定義使用。

MyBatis 允許使用外掛來攔截的方法呼叫包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

自定義外掛:

@Intercepts({@Signature(
    type= Executor.class,
    method = "update",
    args = {MappedStatement.class,Object.class})})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        return null;
    }

    @Override
    public Object plugin(Object o) {
        return null;
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

XML配置:

<plugins>
    <plugin interceptor="com.lzx.element.MyPlugin">
        <property name="someProperty" value="100"/>
    </plugin>
</plugins>

7、environment(執行環境)

執行環境主要用來配置資料庫資訊,可以配置多個數據庫。主要分為兩個配置元素transactionManager(事務管理器)和dataSource(資料庫)

<environments default="development">
    <environment id="decelopment">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

在 MyBatis 中有兩種型別的事務管理器(也就是 type=”[JDBC|MANAGED]”):

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。

  • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。

     <transactionManager type="MANAGED">
       <property name="closeConnection" value="false"/>
     </transactionManager>
    

dataSource三種資料來源及其屬性:

  • UNPOOLED
  • POOLED
  • JNDI

8、databaseIdProvider資料庫廠商標識

MyBatis 可以根據不同的資料庫廠商執行不同的語句,這種多廠商的支援是基於對映語句中的 databaseId 屬性。 MyBatis 會載入不帶 databaseId 屬性和帶有匹配當前資料庫 databaseId 屬性的所有語句。 如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則後者會被捨棄。

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

使用時,需要在對映器中加上databaseId

<select id="queryByName" resultType="com.lzx.entity.Author" databaseId="oracle">
    select * from author where name = #{name}
</select> 

9、引入對映器

前面我們知道實現對映器常用的實現方式是宣告一個介面並配合xml檔案使用。對映器中的定義名稱空間(namespace),名稱空間對應的是一個介面的全路徑。

在配置檔案中我們要引入對映器,共有以下幾種實現方式:

1. 使用相對於類路徑的資源引用

2. 使用完全限定資源定位符(URL)

3. 使用對映器介面實現類的完全限定類名

4. 將包內的對映器介面實現全部註冊為對映器

<!--方式一-->
<mappers>
    <mapper resource="mapper/AuthorMapper.xml"/>
    <mapper resource="mapper/BlogMapper.xml"/>
</mappers>
<!--方式二-->
<mappers>
    <mapper url="file:///var/mapper/AuthorMapper.xml"/>
    <mapper url="file:///var/mapper/BlogMapper.xml"/>
</mappers>
<!--方式三-->
<mappers>
    <mapper class="mapper.AuthorMapper"/>
    <mapper class="mapper.BlogMapper"/>
</mappers>
<!--方式四-->
<mappers>
    <package name="mapper"/>
</mappers>