天天看點

MyBatis的核心對象及配置檔案詳解

一、MyBatis核心對象

MyBatis的核心對象及配置檔案詳解

1. SqlSessionFactory

SqlSessionFactory是MyBatis架構中十分重要的對象,它是單個資料庫映射關系經過編譯後的記憶體鏡像,其主要作用是建立SqlSession。可以利用SqlSessionFactoryBuilder對象,通過XML配置檔案,來建構SqlSessionFactory。

SqlSessionFactory對象是線程安全的,它一旦被建立,在整個應用執行期間都會存在。是以,在建構SqlSessionFactory執行個體時,建議使用單例模式。

示範代碼:

package com.clzhang.mybatis.mapper;

import java.io.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * SqlSessionFactory應該在你的應用執行期間都存在,是以定義一個通用類,是以擷取SqlSessionFactory句柄的程式都從這兒擷取。
 *
 */
public class MyBatisSessionFactory {

    private static final String MYBATIS_CONFIG_FILENAME = "config/mybatis-config.xml";
    private static SqlSessionFactory sqlSessionFactory = null;

    static {
        try {
            InputStream inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_FILENAME);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException("Get resource error:"+MYBATIS_CONFIG_FILENAME, e);
        }
    }

    public static SqlSessionFactory getSqlSessionFactory(){   
        return sqlSessionFactory;   
    }
}      

2. SqlSession

SqlSession是MyBatis架構中另一個重要的對象,它是應用程式與持久層之間執行互動操作的一個單線程對象,其主要作用是執行持久化操作。SqlSession 對應資料庫會話,它不能被共享,也不是線程安全的。

調用程式片段如下:

@Override
    public void updateProduct(ProductBean product) {
        SqlSession session = MyBatisSessionFactory.getSqlSessionFactory().openSession();
        try {
            session.update("ProductMapper.updateProduct", product);
            session.commit();
        } finally {
            session.close();
        }
    }      

SqlSession的常用方法

  • T selectOne(String statement);
  • List selectList(String statement);
  • int insert(String statement);
  • int update(String statement);
  • int delete(String statement);
  • void commit(); 
  • void rollback(); 
  • void close(); 
  • T getMapper(Class type); 
  • Connection getConnection(); 

更多方法,參考:​​javascript:void(0)​​

 二、MyBatis配置檔案,mybatis-config.xml

 configuration為最頂層節點,其餘所有的屬性都必須嵌套在configuration内

MyBatis的核心對象及配置檔案詳解

2.1 properties元素

properties是一個配置屬性的元素,該元素通常用來将内部的配置外在化,即通過外部的配置來動态的替換内部定義的屬性。例如,資料庫的連接配接等屬性,就可以通過典型的Java屬性檔案中的配置來替換,具體方式如下:

2.1.1 編寫db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root      

2.1.2 在mybatis-config.xml中配置<properties… />屬性

<properties resource="db.properties" />      

2.1.3 在mybatis-config.xml中配置<dataSource.../>屬性

<dataSource type="POOLED">
    <!-- 資料庫驅動 -->
    <property name="driver" value="${jdbc.driver}" />
    <!-- 連接配接資料庫的url -->
    <property name="url" value="${jdbc.url}" />
    <!-- 連接配接資料庫的使用者名 -->
    <property name="username" value="${jdbc.username}" />
    <!-- 連接配接資料庫的密碼 -->
    <property name="password" value="${jdbc.password}" />
</dataSource>      

2.2 settings元素

settings元素主要用于改變MyBatis運作時的行為,例如開啟二級緩存、開啟延遲加載等。這些配置通常不需要開發人員去幹涉,稍作了解即可。配置參考:

<!-- 設定 -->
 <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" />      
</settings>      

2.3 typeAliases元素

typeAliases元素用于為配置檔案中的Java類型設定一個簡短的名字,即設定别名。别名的設定與XML配置相關,其使用的意義在于減少全限定類名的備援。

2.3.1 使用元素配置别名的方法如下

<typeAliases>
             <typeAlias alias="user" type="com.clzhang.mybatis.entity.User"/>
</typeAliases>      

2.3.2 當POJO類過多時,可以通過自動掃描包的形式自定義别名,具體如下:

<typeAliases>
             <package name="com.clzhang.mybatis.entity"/>
</typeAliases>      

注意:如果在程式中使用了注解,則别名為其注解的值。

2.4 typeHandler元素

typeHandler的作用就是将預處理語句中傳入的參數從javaType(Java類型)轉換為jdbcType(JDBC類型),或者從資料庫取出結果時将jdbcType轉換為javaType。

2.5 objectFactory元素

MyBatis 每次建立結果對象的新執行個體時,它都會使用一個對象工廠(ObjectFactory)執行個體來完成。預設的對象工廠需要做的僅僅是執行個體化目标類,要麼通過預設構造方法,要麼在參數映射存在的時候通過參數構造方法來執行個體化。如果想覆寫對象工廠的預設行為,則可以通過建立自己的對象工廠來實作。

2.6 plugins元素

MyBatis允許你在已映射語句執行過程中的某一點進行攔截調用。

2.7 environments元素

environments元素用于對環境進行配置。MyBatis的環境配置實際上就是資料源的配置,我們可以通過environments元素配置多種資料源,即配置多種資料庫。

2.7.1 使用environments元素進行環境配置的示例如下:

<environments default="development"> 
       <environment id="development"> 
           <transactionManager type="JDBC"/> 
           <dataSource type="POOLED"> 
              <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> 
              <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
              <property name="username" value="mytest"/> 
              <property name="password" value="test001"/> 
           </dataSource> 
       </environment> 
    </environments>      

2.7.2 事務管理器的配置(transactionManager)

在MyBatis中,可以配置兩種類型的事務管理器,分别是JDBC和MANAGED。關于這兩個事務管理器的描述如下:

  • JDBC:此配置直接使用了JDBC的送出和復原設定,它依賴于從資料源得到的連接配接來管理事務的作用域。
  • MANAGED:此配置從來不送出或復原一個連接配接,而是讓容器來管理事務的整個生命周期。預設情況下,它會關閉連接配接,但一些容器并不希望這樣,為此可以将closeConnection屬性設定為false來阻止它預設的關閉行為。

注意: 如果項目中使用的是Spring+ MyBatis,則沒有必要在MyBatis中配置事務管理器,因為實際開發中,會使用Spring自帶的管理器來實作事務管理。

2.7.3 資料源的配置(dataSource )

  • UNPOOLED 配置此資料源類型後,在每次被請求時會打開和關閉連接配接。它對沒有性能要求的簡單應用程式是一個很好的選擇。
  • POOLED 此資料源利用“池”的概念将JDBC連接配接對象組織起來,避免了在建立新的連接配接執行個體時所需要初始化和認證的時間。這種方式使得并發Web應用可以快速的響應請求,是目前流行的處理方式。
  • JNDI 可以在EJB或應用伺服器等容器中使用。容器可以集中或在外部配置資料源,然後放置一個JNDI上下文的引用。

2.8 databaseIdProviderf元素

MyBatis 可以根據不同的資料庫廠商執行不同的語句,這種多廠商的支援是基于映射語句中的 databaseId 屬性。MyBatis 會加載不帶 databaseId 屬性和帶有比對目前資料庫databaseId 屬性的所有語句。

2.9 mappers元素

mappers元素用于指定MyBatis映射檔案的位置,一般可以使用以下4種方法引入映射器檔案,具體如下:

2.9.1 使用類路徑引入

<mappers>
   <mapper resource="com/clzhang/mybatis/mapper/UserMapper.xml" />
</mappers>      

2.9.2 使用本地檔案路徑引入

<mappers>
    <mapper url="file:///D:/com/clzhang/mybatis/mapper/UserMapper.xml"/>
</mappers>      

2.9.3 使用接口類引入

<mappers>
    <mapper class="com.clzhang.mybatis.mapper.UserMapper"/>
</mappers>      

2.9.4 使用包名引入

<mappers>
   <package name="com.clzhang.mybatis.mapper"/>
</mappers>