1. 程式人生 > >mybatis核心配置檔案詳解

mybatis核心配置檔案詳解

1.屬性(properties)

<properties resource="db.properties">
        <property name="driver" value="driver" />
        <property name="url" value="driver" />
        <property name="username" value="driver" />
        <property name="password" value="driver" />
</properties>

其中的屬性就可以在整個配置檔案中使用來替換需要動態配置的屬性值,例如

<dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
</dataSource>

2.設定(Setting)

這是 MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的執行時行為。下表描述了設定中各項的意圖、預設值等。

設定引數

描述 有效值 預設值
cacheEnabled 該配置影響的所有對映器中配置的快取的全域性開關。 true | false true
lazyLoadingEnabled 延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態。 true | false false
aggressiveLazyLoading 當啟用時,對任意延遲屬性的呼叫會使帶有延遲載入屬性的物件完整載入;反之,每種屬性將會按需載入。 true | false true
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 Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.
  • NONE: Do nothing
  • WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set toWARN)
  • FAILING: Fail mapping (Throw SqlSessionException)
NONE, WARNING, FAILING NONE
defaultExecutorType 配置預設的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 設定超時時間,它決定驅動等待資料庫響應的秒數。 Any positive integer Not Set (null)
defaultFetchSize Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. Any positive integer Not Set (null)
safeRowBoundsEnabled 允許在巢狀語句中使用分頁(RowBounds)。 If allow, set the false. true | false False
safeResultHandlerEnabled 允許在巢狀語句中使用分頁(ResultHandler)。 If allow, set the false. true | false True
mapUnderscoreToCamelCase 是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。 true | false False
localCacheScope MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享資料。 SESSION | STATEMENT SESSION
jdbcTypeForNull 當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情況直接用一般型別即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER OTHER
lazyLoadTriggerMethods 指定哪個物件的方法觸發一次延遲載入。 A method name list separated by commas equals,clone,hashCode,toString
defaultScriptingLanguage 指定動態 SQL 生成的預設語言。 A type alias or fully qualified class name. org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls 指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。 true | false false
logPrefix 指定 MyBatis 增加到日誌名稱的字首。 Any String Not set
logImpl 指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING Not set
proxyFactory 指定 Mybatis 建立具有延遲載入能力的物件所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 or above)
vfsImpl Specifies VFS implementations Fully qualified class names of custom VFS implementation separated by commas. Not set
useActualParamName Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with-parameters option. (Since: 3.4.1) true | false true

一個完整的Setting示例展示,

<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>

3.類型別名(typeAliases)

它的作用僅僅就是為java型別設定一個短的名字,存在的意義僅在於用來減少類完全限定名的冗餘

<typeAliases>
        <typeAlias type="com.shali.pojo.AUsers" alias="Users"/>
</typeAliases>

這樣配置完,以後使用com.shali.pojo.AUsers這個類的時候直接寫Users即可

4.型別處理(typeHandler)

無論是 MyBatis 在預處理語句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時, 都會用型別處理器將獲取的值以合適的方式轉換成 Java 型別。

你可以重寫型別處理器或建立你自己的型別處理器來處理不支援的或非標準的型別。 具體做法為:

實現 org.apache.ibatis.type.TypeHandler 介面,

或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然後可以選擇性地將它對映到一個 JDBC 型別。

栗子:

@MappedJdbcTypes(JdbcType.VARCHAR)publicclassMyTypeHandlerextendsBaseTypeHandler<String>{@Overridepublicvoid setNonNullParameter(PreparedStatement ps,int i,String parameter,JdbcType jdbcType)throwsSQLException{
    ps.setString(i, parameter);}@OverridepublicString getNullableResult(ResultSet rs,String columnName)throwsSQLException{return rs.getString(columnName);}@OverridepublicString getNullableResult(ResultSet rs,int columnIndex)throwsSQLException{return rs.getString(columnIndex);}@OverridepublicString getNullableResult(CallableStatement cs,int columnIndex)throwsSQLException{return cs.getString(columnIndex);}}

<typeHandlers><typeHandlerhandler="com.shali.handler.TypeHandler"/>
<!-- 讓mybatis查詢型別-->
  <package name="com.shali.handler"/>
</typeHandlers>

5.物件工廠(ObjectFactory)

MyBatis 每次建立結果物件的新例項時,它都會使用一個物件工廠(ObjectFactory)例項來完成。 預設的物件工廠需要做的僅僅是例項化目標類,要麼通過預設構造方法,要麼在引數對映存在的時候通過引數構造方法來例項化。 如果想覆蓋物件工廠的預設行為,則可以通過建立自己的物件工廠來實現。比如:

// ExampleObjectFactory.javapublicclassExampleObjectFactoryextendsDefaultObjectFactory{publicObject create(Class type){returnsuper.create(type);}publicObject create(Class type,List<Class> constructorArgTypes,List<Object> constructorArgs){returnsuper.create(type, constructorArgTypes, constructorArgs);}publicvoid setProperties(Properties properties){super.setProperties(properties);}public<T>boolean isCollection(Class<T> type){returnCollection.class.isAssignableFrom(type);}}
<!-- mybatis-config.xml --><objectFactorytype="org.mybatis.example.ExampleObjectFactory"><propertyname="someProperty"value="100"/></objectFactory>

ObjectFactory 介面很簡單,它包含兩個建立用的方法,一個是處理預設構造方法的,另外一個是處理帶引數的構造方法的。 最後,setProperties 方法可以被用來配置 ObjectFactory,在初始化你的 ObjectFactory 例項後, objectFactory 元素體中定義的屬性會被傳遞給 setProperties 方法。

6.外掛( plugins)

<plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper" />
</plugins>

7.環境配置(environment)

mybatis環境是可以配置多個的,但是每個SqlSessionFactory只能選擇其中的一個

<environments default="def-env">
        <environment id="def-env">
            <transactionManager type="JDBC"></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>
        <environment id="">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>

  • 預設的環境 ID(比如:default=”development”)。
  • 每個 environment 元素定義的環境 ID(比如:id=”development”)。
  • 事務管理器的配置(比如:type=”JDBC”)。
  • 資料來源的配置(比如:type=”POOLED”)
  • mybatis的事務管理器有兩種:

    • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務範圍。
    • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為
  • 資料來源-->有三種內建的資料來源型別-> type=”[UNPOOLED|POOLED|JNDI]

UNPOOLED– 這個資料來源的實現只是每次被請求時開啟和關閉連線。雖然一點慢,它對在及時可用連線方面沒有效能要求的簡單應用程式是一個很好的選擇。 不同的資料庫在這方面表現也是不一樣的,所以對某些資料庫來說使用連線池並不重要,這個配置也是理想的。UNPOOLED 型別的資料來源僅僅需要配置以下 5 種屬性:

  • driver – 這是 JDBC 驅動的 Java 類的完全限定名(並不是JDBC驅動中可能包含的資料來源類)。
  • url – 這是資料庫的 JDBC URL 地址。
  • username – 登入資料庫的使用者名稱。
  • password – 登入資料庫的密碼。
  • defaultTransactionIsolationLevel – 預設的連線事務隔離級別。

作為可選項,你也可以傳遞屬性給資料庫驅動。要這樣做,屬性的字首為“driver.”,例如:

  • driver.encoding=UTF8

這將通過DriverManager.getConnection(url,driverProperties)方法傳遞值為 UTF8 encoding 屬性給資料庫驅動。

POOLED– 這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來,避免了建立新的連線例項時所必需的初始化和認證時間。 這是一種使得併發 Web 應用快速響應請求的流行處理方式。

除了上述提到 UNPOOLED 下的屬性外,會有更多屬性用來配置 POOLED 的資料來源:

  • poolMaximumActiveConnections – 在任意時間可以存在的活動(也就是正在使用)連線數量,預設值:10
  • poolMaximumIdleConnections – 任意時間可能存在的空閒連線數。
  • poolMaximumCheckoutTime – 在被強制返回之前,池中連線被檢出(checked out)時間,預設值:20000 毫秒(即 20 秒)
  • poolTimeToWait – 這是一個底層設定,如果獲取連線花費的相當長的時間,它會給連線池列印狀態日誌並重新嘗試獲取一個連線(避免在誤配置的情況下一直安靜的失敗),預設值:20000 毫秒(即 20 秒)。
  • poolPingQuery – 傳送到資料庫的偵測查詢,用來檢驗連線是否處在正常工作秩序中並準備接受請求。預設是“NO PING QUERY SET”,這會導致多數資料庫驅動失敗時帶有一個恰當的錯誤訊息。
  • poolPingEnabled – 是否啟用偵測查詢。若開啟,也必須使用一個可執行的 SQL 語句設定 poolPingQuery 屬性(最好是一個非常快的 SQL),預設值:false。
  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用頻度。這可以被設定成匹配具體的資料庫連線超時時間,來避免不必要的偵測,預設值:0(即所有連線每一時刻都被偵測 — 當然僅當 poolPingEnabled 為 true 時適用)。

JNDI– 這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。這種資料來源配置只需要兩個屬性:

  • initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那麼 data_source 屬性將會直接從 InitialContext 中尋找。
  • data_source – 這是引用資料來源例項位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查詢,沒有提供時則直接在 InitialContext 中查詢。

和其他資料來源配置類似,可以通過新增字首“env.”直接把屬性傳遞給初始上下文。比如:

  • env.encoding=UTF8

8.資料庫廠商標識(databaseIdProvider)

MyBatis 可以根據不同的資料庫廠商執行不同的語句,這種多廠商的支援是基於對映語句中的 databaseId 屬性。 MyBatis 會載入不帶databaseId 屬性和帶有匹配當前資料庫 databaseId 屬性的所有語句。 如果同時找到帶有 databaseId 和不帶databaseId 的相同語句,則後者會被捨棄。 為支援多廠商特性只要像下面這樣在 mybatis-config.xml 檔案中加入 databaseIdProvider 即可:

<databaseIdProvidertype="DB_VENDOR"/>

這裡的 DB_VENDOR 會通過 DatabaseMetaData#getDatabaseProductName() 返回的字串進行設定。 由於通常情況下這個字串都非常長而且相同產品的不同版本會返回不同的值,所以最好通過設定屬性別名來使其變短,如下:

<databaseIdProvidertype="DB_VENDOR"><propertyname="SQL Server"value="sqlserver"/><propertyname="DB2"value="db2"/><propertyname="Oracle"value="oracle"/></databaseIdProvider>

在有 properties 時,DB_VENDOR databaseIdProvider 的將被設定為第一個能匹配資料庫產品名稱的屬性鍵對應的值,如果沒有匹配的屬性將會設定為 “null”。 在這個例子中,如果getDatabaseProductName() 返回“Oracle (DataDirect)”,databaseId 將被設定為“oracle”。

你可以通過實現介面 org.apache.ibatis.mapping.DatabaseIdProvider 並在 mybatis-config.xml 中註冊來構建自己的 DatabaseIdProvider:

publicinterfaceDatabaseIdProvider{void setProperties(Properties p);String getDatabaseId(DataSource dataSource)throwsSQLException;}

9.對映器(mapping)

既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。 Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括file:/// 的 URL),或類名和包名等。例如:

<!-- Using classpath relative resources --><mappers><mapperresource="org/mybatis/builder/AuthorMapper.xml"/><mapperresource="org/mybatis/builder/BlogMapper.xml"/><mapperresource="org/mybatis/builder/PostMapper.xml"/></mappers>
<!-- Using url fully qualified paths --><mappers><mapperurl="file:///var/mappers/AuthorMapper.xml"/><mapperurl="file:///var/mappers/BlogMapper.xml"/><mapperurl="file:///var/mappers/PostMapper.xml"/></mappers>
<!-- Using mapper interface classes --><mappers><mapperclass="org.mybatis.builder.AuthorMapper"/><mapperclass="org.mybatis.builder.BlogMapper"/><mapperclass="org.mybatis.builder.PostMapper"/></mappers>
<!-- Register all interfaces in a package as mappers --><mappers><packagename="org.mybatis.builder"/></mappers>

相關推薦

mybatis核心配置檔案

1.屬性(properties) <properties resource="db.properties">         <property name="driver" val

Spring Boot 核心配置檔案

用過 Spring Boot 的都知道在 Spring Boot 中有以下兩種配置檔案 bootstrap (.yml 或者 .properties) application (.yml 或者 .properties) 為什麼會有這兩種配置檔案呢?大家

MyBatismybatis-generator配置檔案

MyBatis:mybatis-generator配置檔案詳解 mybatis-generator外掛的配置檔案詳解如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorC

mybatis配置檔案

mybatis主配置檔案 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

Mybatis配置檔案

##1、properties (1)、可以使用標籤來引入外部properties配置檔案的內容,一般用於引入資料來源: a)、resource:引入類路徑下的資源 b)、url:引入網路路徑或者磁碟路徑

MyBatis xml配置檔案

一、MyBatis 配置檔案基本結構        在使用mybatis框架時,首先匯入其對應的jar包,並進行相應的配置,所以得對配置檔案的每個引數都得了解。一個完全的mybatis配置檔案結構如下: <?xmlversion="1.0

mybatis框架——配置檔案

一、全域性配置檔案 1、概覽 全域性配置檔案(SqlMapConfig.xml)的配置內容和順序如下(順序不能亂): Properties(屬性) Settings(全域性引數設定) typeAliases(類型別名) typeHandlers(型別處理器) o

web應用的入口:web.xml核心配置檔案

前言:如果要了解web專案的底層實現,web.xml配置檔案,是必須要掌握的。web.xml配置檔案,是web專案的核心,web專案的啟動,從這裡開始。 為了方便大家理解,我們從最常見的配置開始著手來說明。一,contextConfigLocation contextCo

Elasticsearch6.2基本概念及核心配置檔案

以下內容,都摘自官網6.2 版本文件,有些屬性名字和以前都不一樣,如果沒有找到對應的屬性,請閱讀官方文件進行查詢:官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concept

Hibernate_day01---Hibernate環境搭建、配置檔案核心api介紹

JavaEE三層結構對應的框架 1) web層:struts2框架 2) service層:spring框架 3)dao層:hibernate框架 -- 對資料庫進行crud操作 什麼是框架: 可複用的設計構件 作用:可以少寫一部分程式碼。使用框架寫程式,會幫我們實現一部

MyBatis Generator】程式碼自動生成工具 generatorConfig.xml配置檔案

MyBatis Generator官網地址:http://www.mybatis.org/generator/index.html MyBaris Generator中文地址:http://mbg.cndocs.ml/ 在MBG中,最主要也最重要的,就是generatorConfig.xml

轉:ssm spring+springmvc+mybatis中的xml配置檔案

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的配

MyBatis的體系結構和配置檔案

一、SqlSessionFactory MyBatis 的應用都是以一個 SqlSessionFactory 的例項為中心的,它是單個數據庫對映關係經過編譯後的記憶體映象;SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSes

Hibernate5(2016)——配置檔案核心API

1.Hibernate配置檔案詳解: 1.1 Hibernate對映配置檔案: 1 對映配置檔名稱和位置沒有固定要求 2 對映配置檔案中,標籤name屬性值寫實體類相關內容 class標籤name屬性值寫實體類的全路徑 id標籤和property的name屬性值寫實體類的屬性名稱

Mybatis學習記錄(三)--Mybatis配置檔案

關於mybatis的配置檔案,主要有兩個,一個是SqlMapperConfig.xml檔案一個是mapper.xml檔案,分別對這兩個進行深入全面學習. 一.SqlMapperConfig.xml檔案 1.標籤概況 在SqlMapperConfig

Mybatis配置檔案

Properties(屬性) Java屬性檔案可以配置直觀的。 如: <properties> <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/

02.MyBatis配置檔案

1.properties 屬性1.在MyBatis配置檔案中引用屬性檔案MyBatis允許在mybatis-config.xml配置檔案中載入*.properties屬性檔案,並使用屬性檔案的屬性值,以提高應用的配置能力。例如在mybatis-config.xml檔案所在目錄下建立檔案config.prope

ssm spring+springmvc+mybatis中的xml配置檔案

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的

MyBatis 3的XML配置檔案

Mybatis-config.xml的配置檔案:<?xml version="1.0" encoding="UTF-8" ?> <!--DOCTYPE標籤是一種標準通用標記語言的文件型別宣告,它的目的是要告訴標準通用標記語言解析器,它應該使用什麼樣的文件型別

三大框架(ssh)學習——配置檔案(一)

配置檔案詳解 指定web應用預設字符集 <constant name="struts.i18n.encoding" value="gbk" /> 此配置相當於: request.setCharacterEncoding(“gbk”); r