一、概述
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對象)映射成數據庫中的記錄。
優點:
- 簡單易學,本身比較小巧。
- 不屏蔽SQL語句,我們可以根據自己的需求去編寫優化SQL語句。
- 映射機制十分靈活,支持動態SQL、存儲過程。
- 映射器創建簡單,只需一個接口和一個XML文件即可。
缺點:
需要手動編寫SQL語句和映射規則,某些情況下會加大工作量
官網幫助文檔:http://www.mybatis.org/mybatis-3/zh/index.html
二、四大核心組件
- 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共有一下三個作用:
-
獲取Mapper接口
-
發送SQL給數據庫
-
控制數據庫事務
//這裏的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|false | true |
lazyLoadingEnabled | 延遲加載的全局開關。當開啓時,所有關聯對象都會延遲加載。特定關聯關係中可通過設置fetchType屬性來覆蓋該項的開關狀態。 | true|false | false |
aggressiveLazyLoading | 當開啓時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載(參考lazyLoadTriggerMethods). | true|false | false(truein≤3.4.1) |
multipleResultSetsEnabled | 是否允許單一語句返回多結果集(需要兼容驅動)。 | true|false | true |
useColumnLabel | 使用列標籤代替列名。不同的驅動在這方面會有不同的表現,具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。 | true|false | true |
useGeneratedKeys | 允許JDBC支持自動生成主鍵,需要驅動兼容。如果設置爲true則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工作(比如Derby)。 | true|false | False |
autoMappingBehavior | 指定MyBatis應如何自動映射列到字段或屬性。NONE表示取消自動映射;PARTIAL只會自動映射沒有定義嵌套結果集映射的結果集。FULL會自動映射任意複雜的結果集(無論是否嵌套)。 | NONE,PARTIAL,FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定發現自動映射目標未知列(或者未知屬性類型)的行爲。
| NONE,WARNING,FAILING | NONE |
defaultExecutorType | 配置默認的執行器。SIMPLE就是普通的執行器;REUSE執行器會重用預處理語句(preparedstatements);BATCH執行器將重用語句並執行批量更新。 | SIMPLEREUSEBATCH | SIMPLE |
defaultStatementTimeout | 設置超時時間,它決定驅動等待數據庫響應的秒數。 | 任意正整數 | NotSet(null) |
defaultFetchSize | 爲驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。 | 任意正整數 | NotSet(null) |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置爲false。 | true|false | False |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設置爲false。 | true|false | True |
mapUnderscoreToCamelCase | 是否開啓自動駝峯命名規則(camelcase)映射,即從經典數據庫列名A_COLUMN到經典Java屬性名aColumn的類似映射。 | true|false | False |
localCacheScope | MyBatis利用本地緩存機制(LocalCache)防止循環引用(circularreferences)和加速重複嵌套查詢。默認值爲SESSION,這種情況下會緩存一個會話中執行的所有查詢。若設置值爲STATEMENT,本地會話僅用在語句執行上,對相同SqlSession的不同調用將不會共享數據。 | SESSION|STATEMENT | SESSION |
jdbcTypeForNull | 當沒有爲參數提供特定的JDBC類型時,爲空值指定JDBC類型。某些驅動需要指定列的JDBC類型,多數情況直接用一般類型即可,比如NULL、VARCHAR或OTHER。 | JdbcType常量.大多都爲:NULL,VARCHARandOTHER | OTHER |
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|false | false |
returnInstanceForEmptyRow | 當返回行的所有列都是空時,MyBatis默認返回null。當開啓這個設置時,MyBatis會返回一個空實例。請注意,它也適用於嵌套的結果集(i.e.collectioinandassociation)。(從3.4.2開始) | true|false | false |
logPrefix | 指定MyBatis增加到日誌名稱的前綴。 | 任何字符串 | Notset |
logImpl | 指定MyBatis所用日誌的具體實現,未指定時將自動查找。 | SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING | Notset |
proxyFactory | 指定Mybatis創建具有延遲加載能力的對象所用到的代理工具。 | CGLIB|JAVASSIST | JAVASSIST(MyBatis3.3orabove) |
vfsImpl | 指定VFS的實現 | 自定義VFS的實現的類全限定名,以逗號分隔。 | Notset |
useActualParamName | 允許使用方法簽名中的名稱作爲語句參數名稱。爲了使用該特性,你的工程必須採用Java8編譯,並且加上-parameters選項。(從3.4.1開始) | true|false | true |
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 {
...
}
系統自定義別名:
別名 | 映射的類型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4、typeHandler類型轉換器
在JDBC中,需要在PreparedStatement中處理預編譯的SQL語句中的參數,執行完畢SQL後,通過ResultSet對象獲得數據庫中的數據,這些數據類型在MyBatis中通過typeHandler實現。在typeHandler中分爲jdbcType和javaType。jdbcType定義數據庫類型,javaType定義java類型。typeHandler的作用是承擔jdbcType和javaType之間的相互轉換。一般來說,系統定義的typeHandler就足夠我們使用,我們還可以自定義typeHandler來處理我們需要滿足的轉換規則。
系統定義的typeHandler:
類型處理器 | Java類型 | JDBC類型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean,boolean | 數據庫兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte,byte | 數據庫兼容的NUMERIC或BYTE |
ShortTypeHandler | java.lang.Short,short | 數據庫兼容的NUMERIC或SHORTINTEGER |
IntegerTypeHandler | java.lang.Integer,int | 數據庫兼容的NUMERIC或INTEGER |
LongTypeHandler | java.lang.Long,long | 數據庫兼容的NUMERIC或LONGINTEGER |
FloatTypeHandler | java.lang.Float,float | 數據庫兼容的NUMERIC或FLOAT |
DoubleTypeHandler | java.lang.Double,double | 數據庫兼容的NUMERIC或DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 數據庫兼容的NUMERIC或DECIMAL |
StringTypeHandler | java.lang.String | CHAR,VARCHAR |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB,LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR,NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 數據庫兼容的字節流類型 |
BlobTypeHandler | byte[] | BLOB,LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER或未指定類型 |
EnumTypeHandler | EnumerationType | VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引) |
EnumOrdinalTypeHandler | EnumerationType | 任何兼容的NUMERIC或DOUBLE類型,存儲枚舉的索引(而不是名稱)。 |
InstantTypeHandler | java.time.Instant | TIMESTAMP |
LocalDateTimeTypeHandler | java.time.LocalDateTime | TIMESTAMP |
LocalDateTypeHandler | java.time.LocalDate | DATE |
LocalTimeTypeHandler | java.time.LocalTime | TIME |
OffsetDateTimeTypeHandler | java.time.OffsetDateTime | TIMESTAMP |
OffsetTimeTypeHandler | java.time.OffsetTime | TIME |
ZonedDateTimeTypeHandler | java.time.ZonedDateTime | TIMESTAMP |
YearTypeHandler | java.time.Year | INTEGER |
MonthTypeHandler | java.time.Month | INTEGER |
YearMonthTypeHandler | java.time.YearMonth | VARCHARorLONGVARCHAR |
JapaneseDateTypeHandler | java.time.chrono.JapaneseDate | DATE |
自定義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>