一文带你掌握Mybatis设计模式之Builder

1,077 阅读3分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

Mybatis设计模式

前言

虽然设计模式有3类23种设计模式,但是⼤多停留在概念层⾯,Mybatis源码中使⽤了⼤量的设计模式,观察设计模式在其中的应⽤,能够更深⼊的理解设计模式。

Mybatis⾄少⽤到了以下的设计模式的使⽤:

模式mybatis体现
Builder模式例如SqlSessionFactoryBuilder、Environment;
⼯⼚⽅法模式例如SqlSessionFactory、TransactionFactory、LogFactory
单例模式例如 ErrorContext 和 LogFactory;
代理模式Mybatis实现的核⼼,⽐如MapperProxy、ConnectionLogger,⽤的jdk的动态代理还有executor.loader包使⽤了 cglib或者javassist达到延迟加载的效果
组合模式例如SqlNode和各个⼦类ChooseSqlNode等;
模板⽅法模式例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和所有的⼦类例如 IntegerTypeHandler;
适配器模式例如Log的Mybatis接⼝和它对jdbc、log4j等各种⽇志框架的适配实现;
装饰者模式例如Cache包中的cache.decorators⼦包中等各个装饰者的实现;
迭代器模式例如迭代器模式PropertyTokenizer;

1 Builder构建者模式

Builder模式的定义是"将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范围,就可以使⽤⼯⼚模式和Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加 复杂的对象的构建,甚⾄只会构建产品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象

例⼦:使⽤构建者设计模式来⽣产computer 主要步骤:

  • 1、将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件);
  • 2、 创建构建类;
  • 3、 依次创建部件;
  • 4、 将部件组装成⽬标对象

1. 定义computer

image.png

2. ComputerBuilder

image.png

调⽤

image.png

2. Mybatis中的体现

SqlSessionFactory 的构建过程:

Mybatis的初始化⼯作⾮常复杂,不是只⽤⼀个构造函数就能搞定的。所以使⽤了建造者模式,使⽤了⼤量的Builder,进⾏分层构造,核⼼对象Configuration使⽤了 XmlConfigBuilder来进⾏构造。

image.png

在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调⽤XMLConfigBuilder读取所有的MybatisMapConfig.xml 和所有的 *Mapper.xml ⽂件,构建 Mybatis 运⾏的核⼼对象Configuration对象,然后将该Configuration对象作为参数构建⼀个SqlSessionFactory对象。

image.png

其中 XMLConfigBuilder 在构建 Configuration 对象时,也会调⽤ XMLMapperBuilder ⽤于读取Mapper⽂件,⽽XMLMapperBuilder会使⽤XMLStatementBuilder来读取和build所有的SQL语句。

//解析<mappers />标签
mapperElement(root.evalNode("mappers"));

在这个过程中,有⼀个相似的特点,就是这些Builder会读取⽂件或者配置,然后做⼤量的XpathParser 解析、配置或语法的解析、反射⽣成对象、存⼊结果缓存等步骤,这么多的⼯作都不是⼀个构造函数所能包括的,因此⼤量采⽤了 Builder模式来解决

image.png

SqlSessionFactoryBuilder类根据不同的输⼊参数来构建SqlSessionFactory这个⼯⼚对象。因此Mybatis使用builder建造者模式就差不多啦,后续还会更新其他设计模式在mybatis的使用