1. 程式人生 > >Mybatis基礎(核心元件的構成及用法)

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介面和註解組成。實際開發中,推薦使用前者。