Mybatis基礎(核心元件的構成及用法)
學習Mybatis框架,首要任務就是學習Mybatis基本構成,也即Mybatis核心元件。對核心元件的學習大致可分為兩部分,首先是核心元件的構成及用法,其次是核心元件的生命週期,本文主要介紹元件的構成及用法。
Mybatis核心元件包括四部分,分別為:
(1)SqlSessionFactoryBuilder:構造器
(2)SqlSessionFactory:工廠介面
(3)SqlSession:回話介面
(4)SQL Mapper:對映器
它們之間的關聯關係如下圖:
SqlSessionFactoryBuilder依據XML配置檔案資訊或者程式碼的方式建立SqlSessionFactory,SqlSessionFactory用於生成SqlSession,SqlSession用於獲取對映器或者與資料庫進行互動。以下分別對每個介紹每個元件的用法。
(1)SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在於依據配置資訊或者程式碼生成SqlSessionFactory。原始碼提供的方法如下圖:
通過檢視原始碼可知,該類有一個預設構造器和多個build()的過載方法。進一步分析便可發現,該類中主要的方法為三個:
public SqlSessionFactory build(Reader reader, String environment, Properties properties); public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties); public SqlSessionFactory build(Configuration config)
第一個方法通過字元流讀取配置檔案資訊;第二個方法通過位元組流讀取配置檔案資訊;第三個方法通過程式碼的方式建立SqlSessionFactory。通過字元流或位元組流讀取配置檔案資訊建立SqlSessionFactory,實際均是利用第三個方法,最終都會建立Configuration物件以建立SqlSessionFactory,其本質是一致的。
(2)SqlSessionFactory
SqlSessionFactory用於生產SqlSession回話。由前文可知,建立SqlSessionFactory有兩種方式,一種使用XML配置檔案的方式,另一種使用Java程式碼的方式。以下舉例子簡要介紹兩種方式建立SqlSessionFactory。
建立一個java專案,引入mybatic相關jar包(本例中使用的mybatis版本為3.3.0)。
第一、使用XML配置檔案的方式,本例中的配置檔案為mybatis-config.xml,配置檔案內容如下:
<configuration>
<!-- 載入db.propertiies檔案 -->
<properties resource="db.properties"></properties>
<!-- 環境 -->
<environments default="developement">
<environment id="developement">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置對映 -->
<mappers>
<mapper class="cn.don.dao.EmpDao"/>
</mappers>
</configuration>
配置檔案簡要說明如下:
① 配置properties,db.properties檔案儲存資料庫連線資訊
② 配置環境內容,預設使用id為developement的環境配置,包含事務管理模式和資料庫連線資訊
③ 配置對映器,引入一個XML(empMapper.xml)檔案,它提供了SQL和POJO的對映規則,包含對映器中的資訊,內容如下:
<mapper namespace="cn.don.dao.EmpDao">
<!-- 依據empno查詢員工 -->
<select id="queryEmpById" parameterType="int" resultType="cn.don.entity.Emp">
SELECT * FROM EMP WHERE EMPNO=#{empno}
</select>
<!-- 依據job查詢員工 -->
<select id="queryEmpByJob" parameterType="String" resultType="cn.don.entity.Emp">
SELECT EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
FROM EMP WHERE JOB=#{job}
</select>
</mapper>
由此可知,EmpDao介面中定義了兩個方法,也即queryEmpById和queryEmpByJob
接下來實現建立SqlSessionFactory,本例中使用Junit作單元測試,程式碼如下:
package cn.don.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.don.dao.EmpDao;
import cn.don.entity.Emp;
public class EmpDaoTest {
private static final String CONFIGE_FILE = "mybatis-config.xml";
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
InputStream inputStream = Resources.getResourceAsStream(CONFIGE_FILE);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(sqlSessionFactory);
}
@Test
public void testQueryEmpByJob(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpDao empMapper = sqlSession.getMapper(EmpDao.class);
System.out.println(empMapper);
List<Emp> empList = empMapper.queryEmpByJob("CLERK");
System.out.println(empList);
sqlSession.close();
}
}
測試輸入結果為:
例中使用檔案輸入流,利用SqlSessionFactoryBuilder讀取配置檔案資訊以 建立SqlSessionFactory,至此,使用XML配置檔案的方式建立SqlSessionFactory完成。
第二、使用Java程式碼的方式,在test包下新建一個類TestCreateSqlSessionFactoryWithCode,類中的詳細程式碼如下程式碼如下:
public class TestCreateSqlSessionFactoryWithCode {
private static byte[] lock = new byte[1];
private static SqlSessionFactory sqlSessionFactory = null;
public static SqlSessionFactory getSqlSessionFactory() {
synchronized (lock){
if(sqlSessionFactory == null) {
init();
}
return sqlSessionFactory;
}
}
private static void init() {
// 1、設定資料庫連線資訊
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
dataSource.setUsername("test");
dataSource.setPassword("test");
// 2、事務管理方式
TransactionFactory transaction = new JdbcTransactionFactory();
// 3、建立執行環境
Environment environment = new Environment("development", transaction, dataSource);
// 4、建立Configuration物件
Configuration configuration = new Configuration(environment);
// 5、新增對映器
configuration.addMapper(EmpDao.class);
// 6、構建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
}
}
至此,構建SqlSessionFactory的兩種方式結束完畢,兩種方式本質是一樣的。實際開發中,大多數情況下,建議使用XML配置檔案的方式。一般在情況下,在需要加入自己的特性時才會選擇使用Java程式碼的方式。
(3)SqlSession
SqlSession是Mybatis非常重要的介面,主要進行持久化操作。SqlSession為我們提供的方法如下:
由上圖可知,一方面,SqlSession提供了進行增刪該查的方法,同時可進行事物提交或者回滾;另一方面,提供了獲取對映器的方法。需要注意:SqlSession的例項是執行緒不安全的,不能將其放在類的靜態欄位或者例項欄位中;使用完SqlSession之後,應用利用finally塊來確保關閉它。
(4)SQL Mapper
SQL Mapper(對映器)的作用主要體現在定義引數型別、描述快取、描述SQL語句以及定義查詢結果和POJO的對映關係四方面。Mybatis通過對映器找到對映檔案從而找到SQL語句,引入Mapper的方法分別為:使用類路徑查詢資原始檔、使用本地檔案、介面類或者包名,例如:
<mappers>
<!-- 使用類路徑查詢資原始檔 -->
<mapper resource="cn/don/mappers/testMapper.xml"/>
<!-- 使用本地檔案 -->
<mapper url="file:///F:/test/testMapper.xml"/>
<!-- 使用介面類 -->
<mapper class="cn.don.dao.testDao"/>
<!-- 使用包名 -->
<package name="cn.don.mapper"/>
</mappers>
它由Java介面和XML檔案組成,也可由Java介面和註解組成。實際開發中,推薦使用前者。