MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。
MyBatis框架的優(yōu)點(diǎn)
1. 與JDBC相比,減少了50%以上的代碼量。
2. MyBatis是最簡單的持久化框架,小巧并且簡單易學(xué)。
3. MyBatis相當(dāng)靈活,不會對應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計(jì)強(qiáng)加任何影響,SQL寫在XML里,從程序代碼中徹底分離,降低耦合度,便于統(tǒng)一管理和優(yōu)化,并可重用。
4. 提供XML標(biāo)簽,支持編寫動態(tài)SQL語句。
5. 提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的ORM字段關(guān)系映射。
MyBatis框架的缺點(diǎn)
1. SQL語句的編寫工作量較大,尤其是字段多、關(guān)聯(lián)表多時(shí),更是如此,對開發(fā)人員編寫SQL語句的功底有一定要求。
2. SQL語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差,不能隨意更換數(shù)據(jù)庫。
MyBatis框架適用場合
MyBatis專注于SQL本身,是一個(gè)足夠靈活的DAO層解決方案。
對性能的要求很高,或者需求變化較多的項(xiàng)目,如互聯(lián)網(wǎng)項(xiàng)目,MyBatis將是不錯(cuò)的選擇。
mybatis核心組件
mybatis的核心組件包括:SqlSessionFactoryBuilder(構(gòu)造器)、SqlSessionFactory(工廠接口)、SqlSession(會話接口)、SQL Mapper(映射器)。接下來通過一張圖來整體展示四個(gè)核心組件的關(guān)系:
mybatis作用
一 SqlSessionFactoryBuilder(構(gòu)造器)
(1)作用:根據(jù)配置信息或者代碼來生成SqlSessionFactory
(2)實(shí)現(xiàn)原理:SqlSessionFactoryBuilder類負(fù)責(zé)構(gòu)建SqlSessionFactory,通過源碼分析,該類下提供了多個(gè)build的重載方法。其實(shí)這些方法可以歸結(jié)為一個(gè)簽名的方法,但是這些方法的參數(shù)不統(tǒng)一,為了方便調(diào)用,故重載了多個(gè)方法。如下圖:
究其根源,SqlSessionFactoryBuilder真正重載build方法只有如下三種,分別是InputStream(字節(jié)流)、Reader(字符流)、Configuration(類),字節(jié)流和字符流都是通過讀取XML配置文件的形式創(chuàng)建SqlSessionFactory,而Configuration采用的是java代碼方式創(chuàng)建SqlSessionFactory,我們一般常用的是讀取配置文件的形式:
[java] view plain copypublic SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
public SqlSessionFactory build(Reader reader, String environment, Properties properties)
public SqlSessionFactory build(Configuration config)
讀取xml配置文件的方式構(gòu)造SqlSessionFactory,構(gòu)造過程中注入了configuration的實(shí)例對象,之后configuration實(shí)例對象解析XML配置文件來構(gòu)建SqlSessionFactory,示例代碼
[java] view plain copyString resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = null;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
通過分析,SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory采用了建造者的設(shè)計(jì)模式,相信大家一定非常熟悉,這里SqlSessionFactoryBuilder扮演具體的建造者,Configuration類則負(fù)責(zé)建造的細(xì)節(jié)工作,SqlSession則是構(gòu)造出來的產(chǎn)品。如下圖所示
二 SqlSessionFactory(工廠接口)
(1)作用:生產(chǎn)SqlSession會話
(2)實(shí)例代碼:sqlSession = sqlSessionFactory.openSession();
三 SqlSession(會話)
(1)作用:1)獲取映射器,讓映射器通過命名空間和方法名稱找到對應(yīng)的SQL,發(fā)送給數(shù)據(jù)庫執(zhí)行后返回結(jié)果;2)通過update、insert、select、delete等方法,帶上SQL的id來操作在XML中配置好的SQL,從而完成工作,與此同時(shí)它也支持事務(wù),通過commit、rollback方法提交或者回滾事務(wù)。
(2)四大對象:
1)執(zhí)行器(Executor):調(diào)度StatementHandler、ParameterHandler、ResultHandler等來執(zhí)行對應(yīng)的SQL。
種類:SIMPLE:簡易執(zhí)行器,默認(rèn)執(zhí)行器
REUSE:一種執(zhí)行器重用預(yù)處理語句
BATCH:執(zhí)行器重用語句和批量更新,針對批量專用的執(zhí)行器。
執(zhí)行過程:步驟一,MyBatis根據(jù)Configuration來構(gòu)建StatementHandler
步驟二,使用prepareStatement方法,對SQL編譯并對參數(shù)進(jìn)行初始化
步驟三,調(diào)用prepareStatement的prepare()進(jìn)行預(yù)編譯和基礎(chǔ)設(shè)置,再通過StatementHandler的parameterize()來設(shè)置參數(shù)并執(zhí)行
步驟四,resultHandler再組裝查詢結(jié)果返回給調(diào)用者。
2)數(shù)據(jù)庫會話器(StatementHandler):使用數(shù)據(jù)庫的Statement(PrepareStatement)執(zhí)行操作,四大對象的核心,起到承上啟下的作用。
種類:SimpleStatementHandler:對應(yīng)SIMPLE執(zhí)行器
PrepareStatementHandler:對應(yīng)REUSE執(zhí)行器
CallableStatementHandler:對應(yīng)BATCH執(zhí)行器
3)參數(shù)處理器(ParameterHandler):用于SQL對參數(shù)的處理
4)結(jié)果處理器(ResultSetHandler):進(jìn)行最后數(shù)據(jù)集(ResultSet)的封裝返回處理。
(3)運(yùn)行原理:SqlSession通過Executor(執(zhí)行器)創(chuàng)建StatementHandler來運(yùn)行的,具體原理請看下圖
四 Sql Mapper(映射器)
(1) 作用:1)定義參數(shù)、2)描述緩存、3)描述SQL語句、4)定義查詢結(jié)果和POJO的映射關(guān)系
(2) 主要元素:通過一個(gè)表格簡單介紹
(3)引入映射器mapper的方法
1)用文件路徑引入映射器
《mappers》
《mapper resource=“對應(yīng)mapper接口全路徑的配置文件”》
《/mappers》
2)用包名引入映射器
《mappers》
《mapper resource=“對應(yīng)mapper接口包的全路基”》
《/mappers》
3)用類注冊引入映射器
《mappers》
《mapper resource=“對應(yīng)mapper接口類的路徑”》
《/mappers》
4)用xml配置文件引入映射器
《mappers》
《mapper url=“file:///var/mappers+文件路徑”》
《/mappers》
(4)引入映射器步驟
1)定義映射器接口RoleMapper.java
[java] view plain copypackage com.liming.domain.mapper;
import com.liming.domain.po.Role;
public interface RoleMapper{
public Role getRole(Long id);
}
2)對應(yīng)映射器接口的配置文件RoleMapper.xml:定義mapper映射規(guī)則和SQL語句
[html] view plain copy<?xml version=“1.0” encoding=“UTF-8” ?>
<!DOCTYPE mapper PUBLIC
“-//mybatis.org//DTD Mapper 3.0//EN”
“http://mybatis.org/dtd/mybatis-3-mapper.dtd”>
3)在核心配置SqlMapConfig.xml文件中引入映射器
[html] view plain copy《?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》
《!-- 別名定義 --》
《typeAliases》
《typeAlias alias=“role” type=“com.liming.domain.po.Role”/》
《/typeAliases》
《!--定義數(shù)據(jù)庫信息,默認(rèn)使用development數(shù)據(jù)庫構(gòu)建環(huán)境--》
《environments default=“development”》
《environment id=“development”》
《!--采用jdbc事務(wù)管理--》
《transactionMapper type=“JDBC”/》
《!--配置數(shù)據(jù)庫鏈接信息--》
《dataSource type=“POOLED”》
《property name=“driver” value=“com.mysql.jdbc.Driver”/》
《property name=“url” value=“jdbc:mysql://localhost:3306/mybatis”/》
《property name=“username” value=“root”/》
《property name=“password” value=“****”/》
《/dataSource》
《/environment》
《/environments》
《!--定義映射器--》
《mappers》
《mapper resource=“com/liming/domain/mapper/roleMapper.xml”/》
《/mappers》
《/configuration》
評論
查看更多