4 配置文件解析

配置文件解析

核心配置文件mysql

  • mybatis-config.xml 系統核心配置文件。
  • Mybatis 的配置文件會深入影響MyBatis行爲的設置和屬性信息。
  • 配置參數以下:
configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)

environments元素sql

    
  • MyBatis能夠配置多套運行環境,將SQL映射到不一樣的數據庫上,但只能指定一個來運行,經過default來指定數據庫

  • 子元素節點:environment服務器

    • POOLED:使用Mybatis自帶的數據庫鏈接池來管理數據庫鏈接,這種數據源的實現利用「池」的概念將 JDBC 鏈接對象組織起來 , 這是一種使得併發 Web 應用快速響應請求的流行處理方式。
    • UNPOOLED:不使用任何數據庫鏈接池來管理數據庫鏈接,即便用時請求鏈接,使用完關閉鏈接。
    • JNDI:jndi形式使用數據庫鏈接、主要用於項目正常使用的時候,這個數據源的實現是爲了能在如 Spring 或應用服務器這類容器中使用,容器能夠集中或在外部配置數據源,而後放置一個 JNDI 上下文的引用。
    • dataSource元素使用標準的JDBC數據源接口來配置JDBC鏈接對象的資源,數據源是必須配置的,type可選參數以下:mybatis

    • transactionManager 事務管理器併發

    • property 數據庫鏈接設置app

  • 具體環境靠id進行區分,id保證惟一!ide

mappers元素優化

  • 映射器:定義映射SQL語句文件
  • 既然 MyBatis 的行爲已經由上述元素配置完了,咱們如今就要來定義 SQL 映射語句了。 但首先,咱們須要告訴 MyBatis 到哪裏去找到這些語句。 在自動查找資源方面,Java 並無提供一個很好的解決方案,因此最好的辦法是直接告訴 MyBatis 到哪裏去找映射文件。 你可使用相對於類路徑的資源引用,或徹底限定資源定位符(包括 file:/// 形式的 URL),或類名和包名等。

引入資源方式ui





Mapper文件



  • namespace 中文意思:命名空間,做用以下:
    • namespace 的值必須爲某個接口(含包名),即包名+類名
    • 接口中的方法與映射文件中的SQL語句的id一一對應
    • namespace 和子元素的 id 聯合保證惟一,區別不一樣的mapper

Properties優化

數據庫這些屬性都是可外部配置且可動態替換的,既能夠在典型的 Java 屬性文件中配置,亦可經過 properties 元素的子元素來傳遞。

優化MyBatis核心配置文件

  • 在resources目錄下建立db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?Unicode=true&characterEncoding=utf8
username=root
password=1234
  • 在mybatis-config.xml配置文件中引入properties文件
-->

注意:配置文件的配置參數是有優先級的,優先級順序以下,若是不知道,能夠經過IDEA報錯提醒。

properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?

typeAliases

類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,意在下降冗餘的全限定類名書寫。

    

這樣配置時,就可使用 User 代替任何 com.bg.pojo.User

也能夠指定一個包名,MyBatis會在包名下面搜索須要的Java Bean,好比:


每個在包 com.bg.pojo 中的Java Bean,在沒有註解的狀況下,會使用 Bean 的首字母小寫的非限定類名來做爲它的別名。。例如,user 做爲 com.bg.pojo.User 的別名。

如有註解,則別名爲其註解值,以下:

@Alias("user")
public class User {
  ...
}

設置(settings)

這是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲。具體參數含義參考官方文檔。

一個配置完整的 settings 元素的示例以下:


類型處理器(typeHandlers)

MyBatis 在設置預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉換成 Java 類型。

對象工廠(objectFactory)

每次 MyBatis 建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工做。 默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認無參構造方法,要麼經過存在的參數映射來調用帶有參數的構造方法。

生命週期和做用域

理解咱們以前討論過的不一樣做用域和生命週期類別是相當重要的,由於錯誤的使用會致使很是嚴重的併發問題。

首先經過流程圖,分析下MyBatis的執行過程:

image-20201126230734563

做用域理解:

  • SqlSessionFactoryBuilder 的做用在於建立 SqlSessionFactory,建立成功後,SqlSessionFactoryBuilder 就失去了做用,因此它只能存在於建立 SqlSessionFactory 的方法中,而不要讓其長期存在。所以 SqlSessionFactoryBuilder 實例的最佳做用域是方法做用域(也就是局部方法變量)。

  • SqlSessionFactory 能夠被認爲是一個數據庫鏈接池,它的做用是建立 SqlSession 接口對象。由於 MyBatis 的本質就是 Java 對數據庫的操做,因此 SqlSessionFactory 的生命週期存在於整個 MyBatis 的應用之中,因此一旦建立了 SqlSessionFactory,就要長期保存它,直至再也不使用 MyBatis 應用,因此能夠認爲 SqlSessionFactory 的生命週期就等同於 MyBatis 的應用週期。

  • 因爲 SqlSessionFactory 是一個對數據庫的鏈接池,因此它佔據着數據庫的鏈接資源。若是建立多個 SqlSessionFactory,那麼就存在多個數據庫鏈接池,這樣不利於對數據庫資源的控制,也會致使數據庫鏈接資源被消耗光,出現系統宕機等狀況,因此儘可能避免發生這樣的狀況。

  • 所以在通常的應用中咱們每每但願 SqlSessionFactory 做爲一個單例,讓它在應用中被共享。因此說 SqlSessionFactory 的最佳做用域是應用做用域。

  • 若是說 SqlSessionFactory 至關於數據庫鏈接池,那麼 SqlSession 就至關於一個數據庫鏈接(Connection 對象),你能夠在一個事務裏面執行多條 SQL,而後經過它的 commit、rollback 等方法,提交或者回滾事務。因此它應該存活在一個業務請求中,處理完整個請求後,應該關閉這條鏈接,讓它歸還給 SqlSessionFactory,不然數據庫資源就很快被耗費精光,系統就會癱瘓,因此用 try...catch...finally... 語句來保證其正確關閉。因此 SqlSession 的最佳的做用域是請求或方法做用域。

image-20201126231936863

相關文章
相關標籤/搜索