一、定义二、结构三、实现四. mybatis模板模式浅探之BaseExecutor
一、定义
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
二、结构
三、实现
Game
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play() {//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}}
Cricket
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}}
FootBall
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}}
测试
public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play();}}
四. mybatis模板模式浅探之BaseExecutor
BaseExecutor 主要负责实现 MyBatis 中的 SQL 语句执行逻辑,包括缓存管理、事务管理和 SQL 语句的执行。具体来说,它的主要作用包括:
提供缓存管理功能:BaseExecutor 通过维护两级缓存,实现了对 SQL 语句执行结果的缓存。一级缓存是基于执行器的,二级缓存是基于 SqlSessionFactory 的。这样可以大大减少数据库访问次数,提高应用程序的性能。实现事务管理功能:BaseExecutor 提供了事务管理功能,可以控制事务的提交和回滚。在执行 SQL 语句的过程中,如果发生异常,BaseExecutor 会自动回滚事务,保证数据的完整性。执行 SQL 语句:BaseExecutor 通过调用 StatementHandler 对象的方法,执行 SQL 语句并返回执行结果。在执行 SQL 语句之前,BaseExecutor 会将 SQL 语句和参数传递给 StatementHandler 对象,由它来进行具体的执行操作。
根据传入的语句类型,创建不同的语句处理器,执行不同的方法。避免了多重条件判断,动态选择行为。
![](https://img-/f7f470cbc3624033a0863116f3c3a1a1.
public class BaseExecutor implements Executor{private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {List<E> list;localCache.putObject(key, EXECUTION_PLACEHOLDER);try {// 根据不同的执行器调用查询方法。list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);} finally {localCache.removeObject(key);}// 存入缓存localCache.putObject(key, list);if (ms.getStatementType() == StatementType.CALLABLE) {localOutputParameterCache.putObject(key, parameter);}return list;}}