一、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内
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>