1. 程式人生 > >mybatis~configuration 之九子

mybatis~configuration 之九子

配置環境(environments)

MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映。許多類似的用例。

不過要記住:儘管可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一。

所以,如果你想連線兩個資料庫,就需要建立兩個 SqlSessionFactory 例項,每個資料庫對應一個。而如果是三個資料庫,就需要三個例項,依此類推,記起來很簡單:

  • 每個資料庫對應一個 SqlSessionFactory 例項

為了指定建立哪種環境,只要將它作為可選的引數傳遞給 SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是:

SqlSessionFactory factory =newSqlSessionFactoryBuilder().build(reader, environment);SqlSessionFactory factory =newSqlSessionFactoryBuilder
().build(reader, environment,properties);

如果忽略了環境引數,那麼預設環境將會被載入,如下所示:

SqlSessionFactory factory =newSqlSessionFactoryBuilder().build(reader);SqlSessionFactory factory =newSqlSessionFactoryBuilder().build(reader,properties);

環境元素定義瞭如何配置環境。

<environmentsdefault="development">
<environmentid="development"><transactionManagertype="JDBC"><propertyname="..."value="..."/></transactionManager><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments>

注意這裡的關鍵點:

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

預設的環境和環境 ID 是一目瞭然的。隨你怎麼命名,只要保證預設環境要匹配其中一個環境ID。

事務管理器(transactionManager)

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

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
  • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。例如:
    <transactionManagertype="MANAGED"><propertyname="closeConnection"value="false"/></transactionManager>

NOTE如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模組會使用自帶的管理器來覆蓋前面的配置。

這兩種事務管理器型別都不需要任何屬性。它們不過是類型別名,換句話說,你可以使用 TransactionFactory 介面的實現類的完全限定名或類型別名代替它們。

publicinterfaceTransactionFactory{void setProperties(Properties props);Transaction newTransaction(Connection conn);Transaction newTransaction(DataSource dataSource,TransactionIsolationLevel level,boolean autoCommit);}

任何在 XML 中配置的屬性在例項化之後將會被傳遞給 setProperties() 方法。你也需要建立一個 Transaction 介面的實現類,這個介面也很簡單:

publicinterfaceTransaction{Connection getConnection()throwsSQLException;void commit()throwsSQLException;void rollback()throwsSQLException;void close()throwsSQLException;Integer getTimeout()throwsSQLException;}

使用這兩個介面,你可以完全自定義 MyBatis 對事務的處理。

資料來源(dataSource)

dataSource 元素使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。

  • 許多 MyBatis 的應用程式將會按示例中的例子來配置資料來源。然而它並不是必須的。要知道為了方便使用延遲載入,資料來源才是必須的。

有三種內建的資料來源型別(也就是 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)方法傳遞值為 UTF8encoding 屬性給資料庫驅動。

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

這就會在初始上下文(InitialContext)例項化時往它的構造方法傳遞值為 UTF8encoding 屬性。

通過需要實現介面 org.apache.ibatis.datasource.DataSourceFactory , 也可使用任何第三方資料來源,:

publicinterfaceDataSourceFactory{void setProperties(Properties props);DataSource getDataSource();}

org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory 可被用作父類來構建新的資料來源介面卡,比如下面這段插入 C3P0 資料來源所必需的程式碼:

import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;import com.mchange.v2.c3p0.ComboPooledDataSource;publicclass C3P0DataSourceFactory extendsUnpooledDataSourceFactory{public C3P0DataSourceFactory(){this.dataSource =newComboPooledDataSource();}}

為了令其工作,為每個需要 MyBatis 呼叫的 setter 方法中增加一個屬性。下面是一個可以連線至 PostgreSQL 資料庫的例子:

<dataSourcetype="org.myproject.C3P0DataSourceFactory"><propertyname="driver"value="org.postgresql.Driver"/><propertyname="url"value="jdbc:postgresql:mydb"/><propertyname="username"value="postgres"/><propertyname="password"value="root"/></dataSource>
  </div>

  <a name="databaseIdProvider"></a>

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;}
  </div>

  <a name="mappers"></a>

對映器(mappers)

既然 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 去哪裡找對映檔案,剩下的細節就應該是每個 SQL 對映檔案了,也就是接下來我們要討論的。

相關推薦

mybatis~configuration

配置環境(environments) MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同

程式設計師面試100題陣列的最大和

                        題目:輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。要求時間複雜度為O(n)。       例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為

Zookeeper客戶端API讀取節點內容(

本篇部落格介紹一下Zookeeper原聲API讀取節點內容的使用方法。 讀取節點內容方法介紹 方法 Zookeeper提供了兩個方法來獲取節點內容,同步獲取和非同步獲取: public byte[] getData(String path,

刨根究底字符編碼——字符編碼方案的演變與字節序

不同 桌面應用 提示 編碼方式 power 同時 建議 travel n) 字符編碼方案的演變與字節序 一、字符編碼方案的演變 1. 前文已經提及,編號字符集CCS(簡稱字符集)與字符編碼方式CEF(簡稱編碼方式)這兩個概念,在早期並沒有必要嚴格區分。 在Unico

跟KingDZ學HTML5 HTML5新的 Input 種類

nth 搜索 選擇 utc body style 簡單 滾動 top 好了,我們這節課講解的可能有些難以測試,因為目前很多瀏覽器都不支持,這些新增加的標簽,我也只能,盡可能的去找支持的瀏覽器給大家測試展示效果。 HTML5中新增加了很多 Input 的種類。 1.<

Java經典編程題50道

因子 oid 例如 println out count 它的 編程題 num 一個數如果恰好等於它的因子之和,這個數就稱為"完數"。例如6=1+2+3。編程找出1000以內的所有完數。 public class Example09 { public static v

白話空間統計:方向分布(標準差橢圓)修正版

傳播 easy 概率 log 地下水 img lib 最終 行為 文章用紅色字體標記出來的內容是修正後的內容,感謝四川的楊同學對我曾經的錯誤提出指正。 最終寫到我最喜歡的一個的工具(算法)了。方向分布是蝦神我接觸的第一個空間統計工具,也是每次講空間統計必需要講的一

Mysql數據庫理論基礎---四類隔離級別

四類隔離級別 讀未提交 讀提交 可重讀 可串行一、簡介由MySQL AB公司開發,是最流行的開放源碼SQL數據庫管理系統,主要特點:1、是一種數據庫管理系統2、是一種關聯數據庫管理系統3、是一種開放源碼軟件,且有大量可用的共享MySQL軟件4、MySQL數據庫服務器具有快速、可靠和易於使用的特點5、MySQL

ceph學習筆記 層級化的Cluster Map

sds ceph.crush 集群映射由Device和桶(Buckets)組成,設備和桶都有ID描述和權重。Bucket可以包含任意設備或者其他的bucket,使他們形成內部節點的存儲層次結構,設備總是在葉子節點。存儲設備的權重由管理員設置以控制設備負責存儲的相對數據量。盡管大型系統的設備含不同的容量

WebRTC學習:攝像頭的捕捉和顯示

分享 註意 conn con wid pre rac art 升級版本 較新的WebRTC源代碼中已經沒有了與VoiceEngine結構相應的VidoeEngine了,取而代之的是MeidaEngine。MediaEngine包括了Medi

Mybatis框架動態SQL書寫方式小結

用戶輸入 ... pre efi date emp 表達式 內容 字符 動態SQL簡介 動態SQL是Mybatis框架中強大特性之一。在一些組合查詢頁面,需要根據用戶輸入的查詢條件生成不同的查詢SQL,這在JDBC或其他相似框架中需要在代碼中拼寫SQL,經常容易出錯,在My

java mybatis學習$和#區別,mapper代理接口,動態SQL,在日誌中輸出mybatis的sql語句

except 控制臺 處理方式 ron target 技術分享 需要 prefix job 1.在mybatis中,$和#的區別: #{}:表示一個預處理參數,參數類型不定,是根據傳入的參數類型來設定的。類似於JDBC中的? 特例使用,模糊查詢:(針對oracle): an

Modbus庫開發筆記:利用協議棧開發Modbus TCP Server應用

數根 網絡 received ant getc multiple 利用 這不 tar 前面我們已經完成了Modbus協議棧的開發,但這不是我們的目的。我們開發它的目的當然是要使用它來解決我們的實際問題。接下來我們就使用剛開發的Modbus協議棧開發一個Modbus TCP

mybatis基礎

fin code byname import int bsp arr 生成 rop UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-

Mybatis 示例 foreach

可選 手動 tails col 例如 () 入參 描述 lose foreach屬性: 屬性描述 item 循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。具體說明:在list和數組中是其中的對象,在map中是va

JS獲取節點

區別 ren 標簽 什麽 cnblogs 成功 屬性 des size    在JS中獲取子節點有以下幾種方法: firstElementChild、firstChild、childNodes和children 我們通過一個例子來分析這幾種方法的區別(獲取div下的p標簽)

深入淺出Mybatis系列()---強大的動態SQL

tool 復制代碼 otherwise strong sql語句 src sep des col   傳統的使用JDBC的方法,相信大家在組合復雜的的SQL語句的時候,需要去拼接,稍不註意哪怕少了個空格,都會導致錯誤。Mybatis的動態SQL功能正是為了解決這種問題

Linux學習筆記————ubuntu軟件安裝與卸載

升級 獲取 tor mage 技術 png bsp and rem 一、更新 源 1. 尋找國內鏡像源 所謂的鏡像源:可以理解為提供下載軟件的地方,比如Android手機上可以下載軟件的91手機助手;iOS手機上可以下載軟件的AppStore 2. 備份Ubuntu

大數據學習——Combiner,Partitioner,shuffle和MapReduce排序分組

pareto 聚合 文件 ner 數據傳輸 定義排序 str ack 獲取數據 1.Combiner Combiner是MapReduce的一種優化手段。每一個map都可能會產生大量的本地輸出,Combiner的作用就是對map端的輸出先做一次合並,以減少map和reduc

1.4- 定時任務總結句箴言

日誌 排查 一個 p s 方便 變量 相對 found null 1.4定時任務之九句箴言九句箴言---- 不會九句箴言別做運維1.定時任務規則之前加註釋2.使用腳本代替命令行制定定時任務3.定時任務中date命令%的特殊含義定時任務中,%表示回車 -----可以使用\