整體架構(gòu)
這只是MySql的一個(gè)邏輯劃分架構(gòu)赁炎。
- 接口層:通
SqlSession
類提供對數(shù)據(jù)庫訪問能力统屈,隱藏了后續(xù)復(fù)雜的處理邏輯漠魏。 - 核心處理層:主要負(fù)責(zé)執(zhí)行SQL昭齐,并返回結(jié)果。
- 基礎(chǔ)支撐層:對一些基礎(chǔ)功能進(jìn)行封裝加叁,為核心處理層提供服務(wù)揉燃。
代碼結(jié)構(gòu)
Mybatis的代碼結(jié)構(gòu)非常工整唇敞,堪稱完美的java編程規(guī)范教科書窿撬,當(dāng)我們深入源碼我們會(huì)發(fā)現(xiàn)启昧,Mybatis的注釋量相當(dāng)少,那是因?yàn)榛旧衔覀兛梢酝ㄟ^名稱就能明白其中的含義劈伴。
Mybatis中的設(shè)計(jì)模式
如果想學(xué)習(xí)設(shè)計(jì)模式在代碼中的應(yīng)用密末,閱讀Mybatis源碼也是一個(gè)不錯(cuò)的選擇,如:
- SqlSession使用門面模式
- 日志模塊使用了適配器模式
- 數(shù)據(jù)源模塊使用工廠模式
- 數(shù)據(jù)連接池使用策略模式
- 緩存模塊使用了裝飾器模式
- Executor模塊使用了模板方法模式
- Builder模塊使用了建造者模式
- Mapper接口使用了代理模式
- 插件模塊使用責(zé)任鏈模式
Mybatis 快速入門
public class MybatisTest extends BaseTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
String resource = "config/mybatis-config.xml";
try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
// 1.讀取mybatis配置文件創(chuàng)SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
@Test
// 測試自動(dòng)映射以及下劃線自動(dòng)轉(zhuǎn)化駝峰
public void quickStart() throws Exception {
// 2.獲取sqlSession
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
initH2dbMybatis(sqlSession);
// 3.獲取對應(yīng)mapper
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
// 4.執(zhí)行查詢語句并返回結(jié)果
Person person = mapper.selectByPrimaryKey(1L);
System.out.println(person.toString());
}
}
}
Mybatis執(zhí)行流程
-
new SqlSessionFactoryBuilder().build(inputStream);
:讀取mybatis配置文件構(gòu)建SqlSessionFactory
跛璧。 -
sqlSessionFactory.openSession();
:獲取sqlSession資源 -
sqlSession.getMapper(PersonMapper.class);
:獲取對應(yīng)mapper -
mapper.selectByPrimaryKey(1L);
:執(zhí)行查詢語句并返回結(jié)果 - 關(guān)閉資源
上圖是Mybatis的執(zhí)行流程严里,由此我們可以看出Mybatis的核心類有4個(gè),分別是SqlSessionFactoryBuilder
追城、SqlSessionFactory
刹碾、SqlSession
、SQL Mapper
座柱。
-
SqlSessionFactoryBuilde
:讀取配置信息(XML文件)教硫,創(chuàng)建SqlSessionFactory叨吮,建造者模式辆布,方法級別生命周期瞬矩; -
SqlSessionFactory
:創(chuàng)建Sqlsession,工廠單例模式锋玲,存在于程序的整個(gè)應(yīng)用程序生命周期景用; -
SqlSession
:代表一次數(shù)據(jù)庫連接,可以直接發(fā)送SQL執(zhí)行惭蹂,也可以通過調(diào)用Mapper訪問數(shù)據(jù)庫伞插;線程不安全,要保證線程獨(dú)享盾碗,方法級生命周期媚污; -
SQL Mapper
:由一個(gè)Java接口和XML文件組成,包含了要執(zhí)行的SQL語句和結(jié)果集映射規(guī)則廷雅。方法級別生命周期耗美;
Mybatis核心流程三大階段
從上面的執(zhí)行流程可以看出,Mybatis核心流程主要分為以下三個(gè)階段:
- 初始化階段:讀取XML配置文件和注解中的配置信息航缀,創(chuàng)建配置對象商架,并完成各個(gè)模塊的初始化的工作;
- 代理階段:封裝iBatis的編程模型芥玉,使用mapper接口開發(fā)的初始化工作蛇摸;
- 數(shù)據(jù)讀寫階段:通過SqlSession完成SQL的解析,參數(shù)的映射灿巧、SQL的執(zhí)行赶袄、結(jié)果的解析過程;
示例源碼
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程