Mybatis SQL執(zhí)行前準備

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);
  1. 設置環(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 映射诚欠。

  2. 通過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();
}
}
  1. 數(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ù)不應該超過 poolMaximumIdleConnectionspoolMaximumLocalBadConnectionTolerance 之和施无。 默認值: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 實例化時往它的構造方法傳遞值為 UTF8encoding 屬性

    一般通過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续誉。

JDBC:http://www.reibang.com/p/1635f4bda51b

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市初肉,隨后出現(xiàn)的幾起案子酷鸦,更是在濱河造成了極大的恐慌,老刑警劉巖牙咏,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼隔,死亡現(xiàn)場離奇詭異,居然都是意外死亡妄壶,警方通過查閱死者的電腦和手機摔握,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丁寄,“玉大人氨淌,你說我怎么就攤上這事∫粱牵” “怎么了盛正?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屑埋。 經(jīng)常有香客問我豪筝,道長,這世上最難降的妖魔是什么摘能? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任续崖,我火速辦了婚禮,結果婚禮上团搞,老公的妹妹穿的比我還像新娘袜刷。我一直安慰自己,他們只是感情好莺丑,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般梢莽。 火紅的嫁衣襯著肌膚如雪萧豆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天昏名,我揣著相機與錄音涮雷,去河邊找鬼。 笑死轻局,一個胖子當著我的面吹牛洪鸭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仑扑,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼览爵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镇饮?” 一聲冷哼從身側(cè)響起蜓竹,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎储藐,沒想到半個月后俱济,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡钙勃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年蛛碌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辖源。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔚携,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出同木,到底是詐尸還是另有隱情浮梢,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布彤路,位于F島的核電站秕硝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洲尊。R本人自食惡果不足惜远豺,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坞嘀。 院中可真熱鬧躯护,春花似錦、人聲如沸丽涩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至继准,卻和暖如春枉证,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背移必。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工室谚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崔泵。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓秒赤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憎瘸。 傳聞我的和親對象是個殘疾皇子入篮,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容