整體架構(gòu)

Mybatis 整體架構(gòu)
這只是MySql的一個邏輯劃分架構(gòu)。
- 接口層:通
SqlSession類提供對數(shù)據(jù)庫訪問能力,隱藏了后續(xù)復(fù)雜的處理邏輯。 - 核心處理層:主要負(fù)責(zé)執(zhí)行SQL,并返回結(jié)果。
- 基礎(chǔ)支撐層:對一些基礎(chǔ)功能進(jìn)行封裝,為核心處理層提供服務(wù)。
代碼結(jié)構(gòu)

Mybatis 代碼結(jié)構(gòu).png
Mybatis的代碼結(jié)構(gòu)非常工整,堪稱完美的java編程規(guī)范教科書,當(dāng)我們深入源碼我們會發(fā)現(xiàn),Mybatis的注釋量相當(dāng)少,那是因為基本上我們可以通過名稱就能明白其中的含義。
Mybatis中的設(shè)計模式
如果想學(xué)習(xí)設(shè)計模式在代碼中的應(yīng)用,閱讀Mybatis源碼也是一個不錯的選擇,如:
- 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
// 測試自動映射以及下劃線自動轉(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í)行流程

Mybatis 執(zhí)行流程.png
-
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個,分別是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、SQL Mapper。
-
SqlSessionFactoryBuilde:讀取配置信息(XML文件),創(chuàng)建SqlSessionFactory,建造者模式,方法級別生命周期; -
SqlSessionFactory:創(chuàng)建Sqlsession,工廠單例模式,存在于程序的整個應(yīng)用程序生命周期; -
SqlSession:代表一次數(shù)據(jù)庫連接,可以直接發(fā)送SQL執(zhí)行,也可以通過調(diào)用Mapper訪問數(shù)據(jù)庫;線程不安全,要保證線程獨享,方法級生命周期; -
SQL Mapper:由一個Java接口和XML文件組成,包含了要執(zhí)行的SQL語句和結(jié)果集映射規(guī)則。方法級別生命周期;
Mybatis核心流程三大階段
從上面的執(zhí)行流程可以看出,Mybatis核心流程主要分為以下三個階段:
- 初始化階段:讀取XML配置文件和注解中的配置信息,創(chuàng)建配置對象,并完成各個模塊的初始化的工作;
- 代理階段:封裝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工程