Mybatis框架之模板方法模式(Template Method Pattern)的實(shí)現(xiàn)
MyBatis 中也使用到了 模板方法模式 (Template Method Pattern),主要體現(xiàn)在 執(zhí)行 SQL 語句的流程控制 上。模板方法模式允許 MyBatis 定義數(shù)據(jù)庫操作的標(biāo)準(zhǔn)流程,并允許子類或特定實(shí)現(xiàn)類去實(shí)現(xiàn)某些步驟。這種模式使得 MyBatis 能夠在處理不同類型的 SQL 操作(如查詢、插入、更新、刪除)時(shí)保持整體流程的一致性,同時(shí)具備靈活性去處理每種操作的具體細(xì)節(jié)。
1. 什么是模板方法模式 (Template Method Pattern)?
模板方法模式 是一種行為設(shè)計(jì)模式,它定義了一個(gè)操作中的算法骨架,而將某些步驟的實(shí)現(xiàn)延遲到子類中。通過這種方式,模板方法模式允許子類在不改變算法結(jié)構(gòu)的前提下重新定義算法中的某些步驟。
模板方法模式的特點(diǎn):
- 算法骨架:定義操作的基本步驟,且步驟的執(zhí)行順序是固定的。
- 延遲實(shí)現(xiàn):某些具體步驟的實(shí)現(xiàn)被延遲到子類中,允許子類提供自己的實(shí)現(xiàn)。
- 代碼復(fù)用:通過抽象類實(shí)現(xiàn)通用的邏輯,從而減少重復(fù)代碼。
2. MyBatis 中模板方法模式的應(yīng)用
在 MyBatis 中,模板方法模式的主要應(yīng)用場景是 執(zhí)行 SQL 語句的核心流程。MyBatis 使用模板方法模式來定義執(zhí)行 SQL 的標(biāo)準(zhǔn)流程(如查詢、插入、更新、刪除),并允許不同的 Mapper 操作去實(shí)現(xiàn)各自的 SQL 邏輯。
MyBatis 的 Executor
類及其子類是模板方法模式的典型實(shí)現(xiàn)。Executor
是 MyBatis 中執(zhí)行 SQL 語句的核心組件,通過模板方法模式來管理數(shù)據(jù)庫操作的整個(gè)流程。
3. MyBatis 模板方法模式的實(shí)現(xiàn)流程
3.1 Executor 接口和 BaseExecutor 類
Executor
接口:定義了 MyBatis 中執(zhí)行操作的通用方法,如query
、update
等。BaseExecutor
類:實(shí)現(xiàn)了Executor
接口中的模板方法,同時(shí)定義了操作的標(biāo)準(zhǔn)流程。- 例如:查詢時(shí),
BaseExecutor
定義了一個(gè)通用的查詢模板方法,包含緩存檢查、執(zhí)行查詢、緩存結(jié)果等步驟。
- 例如:查詢時(shí),
3.2 MyBatis 中模板方法的核心邏輯
以 查詢操作 為例,MyBatis 中的查詢操作遵循以下模板方法流程:
- 檢查是否啟用 一級(jí)緩存。
- 如果緩存命中,則直接返回緩存結(jié)果。
- 否則,調(diào)用子類的方法執(zhí)行數(shù)據(jù)庫查詢。
- 將查詢結(jié)果存入一級(jí)緩存。
- 返回查詢結(jié)果。
4. 實(shí)際代碼示例
為了更好地理解 MyBatis 中的模板方法模式,下面以 MyBatis 的 Executor
機(jī)制為例進(jìn)行講解。
4.1 Executor 接口
public interface Executor { // 查詢方法 <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler); // 更新方法(包括插入、更新、刪除) int update(MappedStatement ms, Object parameter); // 關(guān)閉 Executor void close(); }
4.2 BaseExecutor 抽象類(模板方法模式的核心)
public abstract class BaseExecutor implements Executor { private Cache localCache = new Cache(); @Override public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) { // Step 1: 先從一級(jí)緩存中查找 List<E> list = localCache.getObject(ms.getId()); if (list != null) { return list; // 如果緩存命中,則直接返回 } // Step 2: 緩存未命中,執(zhí)行數(shù)據(jù)庫查詢 list = doQuery(ms, parameter, rowBounds, resultHandler); // Step 3: 將結(jié)果存入一級(jí)緩存 localCache.putObject(ms.getId(), list); return list; // 返回查詢結(jié)果 } // 定義了一個(gè)抽象方法,由子類實(shí)現(xiàn)具體的查詢邏輯 protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler); }
4.3 SimpleExecutor 子類(實(shí)現(xiàn)具體查詢操作)
public class SimpleExecutor extends BaseExecutor { @Override protected <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) { // 這里是執(zhí)行具體的 SQL 查詢邏輯 StatementHandler handler = new StatementHandler(); return handler.query(ms, parameter, rowBounds, resultHandler); } }
5. 模板方法模式在 MyBatis 中的執(zhí)行流程
- 用戶通過 MyBatis
SqlSession
調(diào)用 Mapper 接口的查詢方法。 SqlSession
調(diào)用Executor.query()
方法。Executor.query()
方法在BaseExecutor
中被定義,它遵循以下流程:- 檢查一級(jí)緩存是否命中。
- 如果緩存未命中,則調(diào)用
doQuery()
方法。 doQuery()
方法在SimpleExecutor
中實(shí)現(xiàn),負(fù)責(zé)執(zhí)行真正的 SQL 查詢。- 將查詢結(jié)果存入緩存,并返回給用戶。
6. 模板方法模式的優(yōu)勢
- 代碼復(fù)用:模板方法模式在
BaseExecutor
中封裝了通用的查詢流程,使得不同的Executor
子類可以復(fù)用這些邏輯。 - 解耦和擴(kuò)展性:通過定義抽象方法(如
doQuery()
),模板方法模式允許子類實(shí)現(xiàn)自己的具體邏輯,而不必改變整體流程。 - 一致性:模板方法確保了所有的查詢操作都遵循相同的流程,提高了一致性。
7. 模板方法模式的不足
- 繼承的局限:由于模板方法模式依賴于繼承,所有的子類都必須是抽象類的子類,這限制了類的靈活性。
- 增加復(fù)雜度:模板方法模式可能會(huì)增加類的層次和復(fù)雜度,尤其是在流程較為復(fù)雜的情況下。
8. 總結(jié)
MyBatis 中的模板方法模式主要體現(xiàn)在 Executor
的設(shè)計(jì)上,通過定義標(biāo)準(zhǔn)化的數(shù)據(jù)庫操作流程(如查詢和更新),確保不同的執(zhí)行器遵循一致的操作步驟。模板方法模式使 MyBatis 能夠有效地復(fù)用代碼,并通過子類靈活地實(shí)現(xiàn)特定操作。這種設(shè)計(jì)不僅提高了代碼的可維護(hù)性和可讀性,還增強(qiáng)了系統(tǒng)的擴(kuò)展性。
到此這篇關(guān)于Mybatis框架之模板方法模式(Template Method Pattern)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis 模板方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC結(jié)合模板模式實(shí)現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)
- MybatisPlus 自定義.vm模板的生成
- idea使用easyCode生成代碼(根據(jù)mybatis-plus模板創(chuàng)建自己的模板)
- Mybatis自定義Sql模板語法問題
- easycode配置成mybatis-plus模板的實(shí)現(xiàn)方法
- springboot結(jié)合mybatis-plus快速生成項(xiàng)目模板的方法
- IDEA創(chuàng)建MyBatis配置文件模板的方法步驟
- 詳解Mybatis模板(已優(yōu)化)適合小白
- 詳解使用Mybatis-plus + velocity模板生成自定義的代碼
- idea的easyCode的 MybatisPlus模板的配置詳解
相關(guān)文章
springboot添加多數(shù)據(jù)源的方法實(shí)例教程
這篇文章主要給大家介紹了關(guān)于springboot添加多數(shù)據(jù)源方法的相關(guān)資料,在實(shí)際開發(fā)中經(jīng)??赡苡龅皆谝粋€(gè)應(yīng)用中可能要訪問多個(gè)數(shù)據(jù)庫多的情況,需要的朋友可以參考下2023-09-09spring是如何實(shí)現(xiàn)聲明式事務(wù)的
這篇文章主要介紹了spring是如何實(shí)現(xiàn)聲明式事務(wù)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04連續(xù)調(diào)用多個(gè)外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路
今天小編就為大家分享一篇關(guān)于連續(xù)調(diào)用多個(gè)外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12mybatis-plus分頁查詢的實(shí)現(xiàn)實(shí)例
頁查詢是一項(xiàng)常用的數(shù)據(jù)庫查詢方法,本文主要介紹了mybatis-plus分頁查詢的實(shí)現(xiàn)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹
Spring在3.1版本,就提供了一條基于注解的緩存策略,實(shí)際使用起來還是很絲滑的,本文將針對幾個(gè)常用的注解進(jìn)行簡單的介紹說明,有需要的小伙伴可以嘗試一下2021-07-07