Mybatis 相關執(zhí)行配置
設置相關的Configuration配置信息
Configuration configuration = new Configuration();
//設置環(huán)境配置
//通過JdbcTransactionFactory創(chuàng)建jdbc Transaction事務管理器
//創(chuàng)建DataSource
Environment environment = new Environment("development", new JdbcTransactionFactory(),
new UnpooledDataSource("org.***.jdbcDriver", "jdbc:***", "user", "123456"));
//2. 設置環(huán)境信息
configuration.setEnvironment(environment);
// 3. 設置是否自增
configuration.setUseGeneratedKeys(true);
configuration.addMapper(Mapper.class);
-
設置環(huán)境變量Environment,也可以通過XML方法配置
<environments default="development"> <environment id="development"> </environment> </environments>
- 默認使用的環(huán)境 ID(比如:default="development")缰猴。
- 每個 environment 元素定義的環(huán)境 ID(比如:id="development")侵歇。
MyBatis可以配置多種環(huán)境耗跛,簡單來說就是可以將 SQL 映射應用于多種數(shù)據(jù)庫。例如兆龙,開發(fā)壁熄、測試和生產(chǎn)環(huán)境需要有不同的配置核偿;或者想在具有相同 Schema 的多個生產(chǎn)數(shù)據(jù)庫中使用相同的 SQL 映射诚欠。
通過TransactionFactory設置事務管理器,也可以XML方法漾岳,如下
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
</environment>
</environments>
在 MyBatis 中有兩種事務管理器JDBC和MANAGED( type="JDBC/MANAGED")
JDBC – 直接使用了 JDBC 提交和回滾功能轰绵,它依賴從數(shù)據(jù)源獲得的連接來管理事務作用域。 ****
-
MANAGED – 讓容器來管理事務的整個生命周期尼荆。從不提交或回滾一個連接左腔, 默認情況下它會關閉連接。如果一些容器不希望連接被關閉捅儒,因此需要將closeConnection屬性設置為 false 來阻止默認的關閉行為液样。例如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
這兩種事務管理器類型都不需要設置任何屬性。用 TransactionFactory 接口實現(xiàn)來代替如JdbcTransactionFactory和ManagedTransactionFactory巧还。
public interface TransactionFactory {
default void setProperties(Properties props) { // 從 3.5.2 開始鞭莽,該方法為默認方法
// 空實現(xiàn)
}
Transaction newTransaction(Connection conn);
Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}
在事務管理器實例化后, XML 中配置的屬性將會被傳遞給 setProperties() 方法麸祷〈樽ィ可以通過 Transaction 接口的實現(xiàn)類來實現(xiàn)相關功能,如JdbcTransaction摇锋,ManagedTransaction,下發(fā)表格展示了JdbcTransaction站超,ManagedTransaction的特性和區(qū)別:
public interface Transaction {
Connection getConnection() throws SQLException;
void commit() throws SQLException;
void rollback() throws SQLException;
void close() throws SQLException;
Integer getTimeout() throws SQLException;
}
JdbcTransaction | ManagedTransaction |
---|---|
屬性訪問權限:protected | 屬性訪問權限:private |
public void commit() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Committing JDBC Connection [" + connection + "]"); } connection.commit(); } } |
public void commit() throws SQLException { // Does nothing } |
public void rollback() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Rolling back JDBC Connection [" + connection + "]"); } connection.rollback(); } } |
public void rollback() throws SQLException { // Does nothing } |
protected void openConnection() throws SQLException { if (log.isDebugEnabled()) { log.debug("Opening JDBC Connection"); } connection = dataSource.getConnection(); if (level != null) { connection.setTransactionIsolation(level.getLevel()); } **setDesiredAutoCommit(autoCommit); **//設置自動提交 } |
protected void openConnection() throws SQLException { if (log.isDebugEnabled()) { log.debug("Opening JDBC Connection"); } this.connection = this.dataSource.getConnection(); if (this.level != null) { this.connection.setTransactionIsolation(this.level.getLevel()); } } |
public void close() throws SQLException { if (connection != null) { resetAutoCommit(); if (log.isDebugEnabled()) { log.debug("Closing JDBC Connection [" + connection + "]"); } connection.close(); } } |
public void close() throws SQLException { if (this.closeConnection && this.connection != null) { if (log.isDebugEnabled()) { log.debug("Closing JDBC Connection [" + this.connection + "]"); } this.connection.close(); } } |
-
數(shù)據(jù)源(dataSource)荸恕,Mybatis3一般有三種數(shù)據(jù)源類型(UNPOOLED/POOLED/JNDI):
UNPOOLED– 每次請求都會打開和關閉連接。面向?qū)?shù)據(jù)庫連接可用性要求不高的程序涵卵。 UNPOOLED 類型的數(shù)據(jù)源需要配置如下:
-
driver
– 這是 JDBC 驅(qū)動的 Java 類全限定名(并不是 JDBC 驅(qū)動中可能包含的數(shù)據(jù)源類)宣吱。
-
url
– 這是數(shù)據(jù)庫的 JDBC URL 地址磷蛹。 -
username
– 登錄數(shù)據(jù)庫的用戶名疚脐。 -
password
– 登錄數(shù)據(jù)庫的密碼生宛。 -
defaultTransactionIsolationLevel
– 默認的連接事務隔離級別县昂。 -
defaultNetworkTimeout
– 等待數(shù)據(jù)庫操作完成的默認網(wǎng)絡超時時間(單位:毫秒)。
POOLED– 支持數(shù)據(jù)庫連接池陷舅,避免創(chuàng)建新的連接實例時所必需的初始化和認證時間倒彰。 配置 POOLED 數(shù)據(jù)源的屬性:
-
poolMaximumActiveConnections
– 最大連接數(shù)量,默認值:10 -
poolMaximumIdleConnections
– 任意時間可能存在的空閑連接數(shù)莱睁。(注意:任意時間待讳,默認值5) -
poolMaximumCheckoutTime
– 在被強制返回之前,池中連接被檢出(checked out)時間仰剿,默認值:20000 毫秒( 20 秒) -
poolTimeToWait
– 線程等待時間创淡,獲取連接超時,連接池會打印狀態(tài)日志南吮,并重新嘗試獲取一個連接(避免在誤配置的情況下一直失敗且不打印日志)琳彩,默認值:20000 毫秒(即 20 秒)。 -
poolMaximumLocalBadConnectionTolerance
– 這是一個關于壞連接容忍度的底層設置部凑, 作用于每一個嘗試從緩存池獲取連接的線程露乏。 如果這個線程獲取到的是一個壞的連接,那么這個數(shù)據(jù)源允許這個線程嘗試重新獲取一個新的連接砚尽,但是這個重新嘗試的次數(shù)不應該超過poolMaximumIdleConnections
與poolMaximumLocalBadConnectionTolerance
之和施无。 默認值:3 -
poolPingQuery
– 發(fā)送到數(shù)據(jù)庫的偵測查詢,用來檢驗連接是否正常工作并準備接受請求必孤。默認是“NO PING QUERY SET”猾骡,保證了多數(shù)數(shù)據(jù)庫驅(qū)動出錯時返回適當?shù)腻e誤消息。 -
poolPingEnabled
– 是否啟用偵測查詢敷搪。若開啟兴想,需要設置poolPingQuery
屬性為一個可執(zhí)行的 SQL 語句(最好是一個速度非常快的 SQL 語句)赡勘,默認值:false嫂便。 -
poolPingConnectionsNotUsedFor
– poolPingQuery 的頻率≌⒂耄可以設置為和數(shù)據(jù)庫連接超時時間一樣毙替,避免不必要的偵測,默認值:0(即所有連接每一時刻都被偵測 — 僅當 poolPingEnabled 為 true 時適用)践樱。
JNDI – 在 EJB 或應用服務器等容器中使用厂画,容器可以集中或在外部配置數(shù)據(jù)源,然后放在 JNDI 上下文引用拷邢。配置只需要兩個屬性:
-
initial_context
– 用來在 InitialContext 中尋找上下文(即袱院,initialContext.lookup(initial_context))。是個可選屬性,如果忽略忽洛,那么將會直接從 InitialContext 中尋找 data_source 屬性腻惠。 -
data_source
– 引用數(shù)據(jù)源實例位置的上下文路徑。提供了 initial_context 配置時欲虚,會在其返回的上下文中進行查找集灌,沒有提供時則直接在 InitialContext 中查找。
可以通過添加前綴“env.”直接把屬性傳遞給 InitialContext苍在。比如:
-
env.encoding=UTF8
// InitialContext 實例化時往它的構造方法傳遞值為UTF8
的encoding
屬性
一般通過DataSourceFactory` 來使用第三方數(shù)據(jù)源實現(xiàn):
public interface DataSourceFactory { void setProperties(Properties props); DataSource getDataSource(); }
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory
可被用作父類來構建新的數(shù)據(jù)源適配器绝页,比如下面這段插入 C3P0 數(shù)據(jù)源所必需的代碼:import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0DataSourceFactory extends UnpooledDataSourceFactory { public C3P0DataSourceFactory() { this.dataSource = new ComboPooledDataSource(); } }
為了令其工作,記得在配置文件中為每個希望 MyBatis 調(diào)用的 setter 方法增加對應的屬性寂恬。 下面是一個可以連接至 PostgreSQL 數(shù)據(jù)庫的例子:
<dataSource type="org.myproject.C3P0DataSourceFactory"> <property name="driver" value="org.postgresql.Driver"/> <property name="url" value="jdbc:postgresql:mydb"/> <property name="username" value="postgres"/> <property name="password" value="root"/> </dataSource>
-
參考資料
mybatis中文api:https://mybatis.org/mybatis-3/zh/configuration.html续誉。