Spring框架的學(xué)習(xí)告一段落,重點學(xué)習(xí)了IoC和AOP的概念以及應(yīng)用,接下來本篇進入Mybatis的學(xué)習(xí)。
一、MyBatis簡介
MyBatis前身是iBatis,是Apache的一個開源項目,2010年這項目轉(zhuǎn)到Goodle并更名為MyBatis,2013年遷至github,是一款開源的數(shù)據(jù)持久層框架,內(nèi)部封裝了JDBC訪問數(shù)據(jù)庫的操作,支持普通的SQL查詢、存儲過程和高級映射,幾乎消除了所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索,其主要思想是將程序中大量的SQL語句剝離出來,配置在配置文件中,實現(xiàn)SQL的靈活配置。在我的另外一篇文章中有關(guān)于各個框架的介紹以及mybatis和hibernate這兩款數(shù)據(jù)持久層框架的區(qū)別介紹。
- 優(yōu)點:mybatis相當(dāng)靈活,SQL語句寫在XML中,從程序中徹底分離,既降低了耦合度,又便于統(tǒng)一管理和優(yōu)化,還可重用。
- 缺點:SQL語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差,不能隨意更換數(shù)據(jù)庫。

二、基本概念
Q:什么是ORM?
A:即對象/關(guān)系映射(Object Relational Mapping),是一種數(shù)據(jù)持久化技術(shù),它可以解決數(shù)據(jù)庫和程序間的異構(gòu)性。它在對象模型和關(guān)系型數(shù)據(jù)庫之間建立起對應(yīng)關(guān)系,并提供了一種機制,通過JavaBean對象去操作數(shù)據(jù)庫表中的數(shù)據(jù)。mybatis框架就是一種半自動化的ORM實現(xiàn),通過簡單的XML或者注解進行配置和原始映射,在實體類和SQL語句之間建立映射關(guān)系。
通過代碼來解釋如下圖:ORM圖.png
Q:什么是數(shù)據(jù)持久化?
A:數(shù)據(jù)持久化是將內(nèi)存中的數(shù)據(jù)類型轉(zhuǎn)化為存儲模型以及將存儲模型轉(zhuǎn)化為內(nèi)存中的數(shù)據(jù)類型的統(tǒng)稱。比如,文件的存儲,數(shù)據(jù)的讀取,對數(shù)據(jù)表的增刪改查。
Q:什么是DTD文件?
A:mybatis的DTD文件功能是實現(xiàn)自動聯(lián)想節(jié)點元素。
三、mybatis環(huán)境搭建步驟:
- 下載jar包并部署jar包
mybatis-3.2.2.jar與mysql-connector-java-5.1.0-bin.jar(連接mysql)和log4j-1.2.17.jar(打印日志)- 編寫mybatis核心配置文件
mybatis-cfg.xml- 創(chuàng)建實體類
pojo- 創(chuàng)建dao接口
dao- 創(chuàng)建SQL映射文件
mapper
SQL映射文件一般對應(yīng)相應(yīng)的POJO類,命名規(guī)則為:POJO名稱 +Mapper。一般情況下,保證POJO對象的屬性與數(shù)據(jù)庫表的字段名一致即可。
注意:mybatis-cfg.xml文件的元素節(jié)點是有一定順序的,如果節(jié)點元素位置不按順序則XML文件會報錯。順序如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置 -->
<properties /> <!-- 用來引入外部配置屬性文件或者直接配置屬性 -->
<settings /> <!-- 設(shè)置mybatis在運行時的行為方式 -->
<typeAliases /> <!-- 為Java類型命名一個別名 -->
<typeHandlers /> <!-- 類型處理器 -->
<objectFactory /> <!-- 對象工廠 -->
<plugins /> <!-- 插件 -->
<environments> <!-- 配置環(huán)境 -->
<environment> <!-- 環(huán)境變量 -->
<transactionManager /> <!-- 事務(wù)管理器 -->
<dataSource /> <!-- 數(shù)據(jù)源 -->
</environment>
</environments>
<databaseIdProvider /> <!-- 數(shù)據(jù)庫廠商標(biāo)識 -->
<mappers /> <!-- 映射器 -->
</configuration>
四、應(yīng)用
每個MyBatis的應(yīng)用程序都以一個SqlSessionFactory對象的實例為核心。
步驟:先獲取SqlSessionFactoryBuilder對象,調(diào)用build()方法創(chuàng)建SqlSessionFactory對象,之后再通過SqlSessionFactory對象的openSession()方法獲取SqlSession實例,而SqlSession對象中就完全包含了以數(shù)據(jù)庫為背景的所有執(zhí)行SQL操作的方法。
1、SqlSessionFactoryBuilder生命周期和作用域?
其最大的特點就是用過即丟,一旦創(chuàng)建了SqlSessionFactory對象,這個類就不需要存在了,因此SqlSessionFactoryBuild的最佳使用是作為局部變量。
2、SqlSessionFactory的生命周期和作用域?
其特點與SqlSessionFactoryBuild的特點恰恰相反,它是一旦創(chuàng)建,就會在整個應(yīng)用運行過程中始終存在。SqlSessionFactory的最佳作用域是Application,即隨著應(yīng)用程序的生命周期一同存在。“存在于整個應(yīng)用運行期間,并且僅有一個對象實例”,這種模式就是單例模式。實現(xiàn)方式可放在靜態(tài)代碼塊中,保證SqlSessionFactory對象只被創(chuàng)建一次。
3、SqlSession的生命周期和作用域?
SqlSession對應(yīng)一次數(shù)據(jù)庫會話,由于數(shù)據(jù)庫會話不會是永久的,所以自然的,其生命周期也不會永久。SqlSession實例不能被共享,不是線程安全,因此最佳作用域是request作用域或者方法體作用域,還有注意SqlSession實例使用完要關(guān)閉掉。

