0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手写一个MyBatis框架

Android编程精选 来源:Android编程精选 2023-04-20 11:29 次阅读

在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。

经过整理,大概有以下设计模式,如图1所示。

9ceab6c2-dedb-11ed-bfe3-dac502259ad0.png

图1

01

类型:创建型模式

▊工厂模式

SqlSessionFactory 的结构如图2所示。

9cfa5870-dedb-11ed-bfe3-dac502259ad0.png

图2

工厂模式:简单工厂是一种创建型模式,在父类中提供一个创建对象的方法,允许子类决定实例对象的类型。

场景介绍:SqlSessionFactory 是获取会话的工厂,每次使用MyBatis 操作数据库时,都会开启一个新的会话。在会话工厂的实现中,SqlSessionFactory 负责获取数据源环境配置信息、构建事务工厂和创建操作SQL 的执行器,最终返回会话实现类。

同类设计:SqlSessionFactory、ObjectFactory、MapperProxyFactory 和DataSourceFactory。

▊单例模式

Configuration 单例配置类的结构如图3所示。

9d23d178-dedb-11ed-bfe3-dac502259ad0.png

图3

单例模式:是一种创建型模式,能够保证一个类只有一个实例,并且提供一个访问该实例的全局节点。

场景介绍:Configuration 是一个大单例,贯穿整个会话周期,所有的配置对象(如映射、缓存、入参、出参、拦截器、注册机和对象工厂等)都在Configuration 配置项中初始化,并且随着SqlSessionFactoryBuilder 构建阶段完成实例化操作。

同类场景:ErrorContext、LogFactory 和Configuration。

▊建造者模式

ResultMap 建造者模式的结构如图4所示。

9d354aac-dedb-11ed-bfe3-dac502259ad0.png

图4

建造者模式:使用多个简单的对象一步一步地构建成一个复杂的对象,提供了一种创建对象的最佳方式。

场景介绍:建造者模式在MyBatis 中使用了大量的XxxxBuilder,将XML 文件解析到各类对象的封装中,使用建造者及建造者助手完成对象的封装。它的核心目的是不希望把过多的关于对象的属性设置写到其他业务流程中,而是用建造者方式提供最佳的边界隔离。

同类场景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XML StatementBuilder 和CacheBuilder。

02

类型:结构型模式

▊适配器模式

日志实现类的结构如图5所示。

9d3e129a-dedb-11ed-bfe3-dac502259ad0.png

图5

适配器模式:是一种结构型模式,能使接口不兼容的对象也可以相互合作。

场景介绍:正是因为有太多的日志框架,包括Log4j、Log4j2 和Slf4J 等,而这些日志框架的使用接口又各有差异,为了统一这些日志框架的接口,MyBatis 定义了一套统一的接口,为所有的其他日志框架的接口做相应的适配。

同类场景:主要集中在对Log 日志的适配上。

▊代理模式

代理模式的实现结构如图6所示。

9d476dd6-dedb-11ed-bfe3-dac502259ad0.png

图6

代理模式:是一种结构型模式,能够提供对象的替代品或占位符。代理控制元对象的访问,并且允许在将请求提交给对象前进行一些处理。

场景介绍:没有代理模式就不存在各类框架。就像MyBatis 中的MapperProxy 实现类,代理工厂实现的功能就是完成DAO 接口的具体实现类的方法,配置的任何一个DAO 接口调用的CRUD 方法,都会被MapperProxy 接管,调用到方法执行器等,并返回最终的数据库执行结果。

同类场景:DriverProxy、Plugin、Invoker 和MapperProxy。

▊组合模式

解析节点类的结构如图7所示。

9d5732e8-dedb-11ed-bfe3-dac502259ad0.png

图7

组合模式:是一种结构型模式,可以将对象组合成树形结构以表示“部分—整体” 的层次结构。

场景介绍:在MyBatis XML 动态的SQL 配置中,共提供了9 种标签(trim、where、set、foreach、if、choose、when、otherwise 和bind),使用者可以组合出各类场景的SQL 语句。而SqlNode 接口的实现就是每个组合结构中的规则节点,通过规则节点的组装,完成规则树组合模式的使用。

同类场景:主要体现在对各类SQL 标签的解析上,以实现SqlNode 接口的各个子类为主。

▊装饰器模式

二级缓存装饰器的实现结构如图8所示。

9d6d7a6c-dedb-11ed-bfe3-dac502259ad0.png

图8

装饰器模式:是一种结构型设计模式,允许将对象放入包含行为的特殊封装对象中,为元对象绑定新的行为。

场景介绍:MyBatis 的所有SQL 操作都是经过SqlSession 调用SimpleExecutor 完成的,而一级缓存的操作也是在简单执行器中处理的。这里的二级缓存因为是基于一级缓存刷新的,所以在实现上,通过创建一个缓存执行器,包装简单执行器的处理逻辑,实现二级缓存操作。这里用到的就是装饰器模式,也叫俄罗斯套娃模式。

03

类型:行为型模式

▊模板模式

SQL 执行模板模式如图9所示。

9d73dab0-dedb-11ed-bfe3-dac502259ad0.png

图9

模板模式:是一种行为型模式,在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。场景介绍:存在一系列可被标准定义的流程,并且流程的步骤大部分采用通用逻辑,只有一小部分是需要子类实现的,通常采用模板模式来定义这个标准的流程。就像MyBatis 的BaseExecutor 就是一个用于定义模板模式的抽象类,在这个类中把查询、修改的操作都定义为一套标准的流程。

同类场景:BaseExecutor、SimpleExecutor 和BaseTypeHandler。

▊策略模式

多类型处理器策略模式的结构如图10所示。

9d8151a4-dedb-11ed-bfe3-dac502259ad0.png

图10

策略模式:是一种行为型模式,能定义一系列算法,并将每种算法分别放入独立的类中,从而使算法的对象能够互相替换。

场景介绍:在MyBatis 处理JDBC 执行后返回的结果时,需要按照不同的类型获取对应的值,这样就可以避免大量的if 判断。所以,这里基于TypeHandler 接口对每个参数类型分别做了自己的策略实现。

同类场景:PooledDataSource、UnpooledDataSource、BatchExecutor、ResuseExecutor、SimpleExector、CachingExecutor、LongTypeHandler、StringTypeHandler 和DateTypeHandler。

▊迭代器模式

拆解字段解析实现的结构如图11所示。

9d997090-dedb-11ed-bfe3-dac502259ad0.png

图11

迭代器模式:是一种行为型模式,能在不暴露集合底层表现形式的情况下遍历集合中的所有元素。

场景介绍:PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下,用来解析对象关系的迭代操作。这个类在MyBatis 中使用得非常频繁,包括解析数据源配置信息并填充到数据源类上,同时参数的解析、对象的设置都会使用这个类。

同类场景:PropertyTokenizer。

04

总结

通过梳理,MyBatis大约运用了10种左右设计模式。可以说,复杂且优秀的ORM 框架源码在设计和实现的过程中都会使用大量的设计模式。

在解决复杂场景的问题时,需要采用分治、抽象的方法,运用设计模式和设计原则等相关知识,把问题合理切割为若干子问题,以便加以理解和解决。

学习源码远不是只是为了应付面试,更重要的是学习优秀框架在复杂场景下的解决方案。通过学习这些优秀的方案技术,可以提高对技术设计和实现的理解,扩展编码思维,积累落地经验。只有经过这样长期的积累,我们才更有可能成为优秀的高级工程师和架构师。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 适配器
    +关注

    关注

    8

    文章

    1824

    浏览量

    66960
  • 框架
    +关注

    关注

    0

    文章

    301

    浏览量

    17049
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28595

原文标题:手写一个MyBatis框架,太牛了

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SpringBoot配置Mybatis的2错误和修正

    【SpringBoot】配置Mybatis错误
    发表于 04-19 10:31

    mybatis的开发环境搭建

    mybatisORM(Object RelationalMapping 对象模型到关系模型的映射)框架。解决对象模型到二维表的关系模型的阻抗不匹配的问题。ORM框架在三层结构中,处
    发表于 05-27 06:19

    数据库整合Mybatis框架

    微服务 SpringBoot 20(九):整合Mybatis
    发表于 07-16 11:03

    MyBatis的整合

    SpringBoot-15-之整合MyBatis-注解篇+分页
    发表于 10-28 08:09

    Mybatis是什么

    Mybatis
    发表于 06-04 15:33

    怎样去设计基于springmvc+spring+mybatis的SSM电影购票系统

    介绍开发技术 : springmvc+spring+mybatis(ssm)框架 mysql数据库 支付宝沙箱支付 layUI 百度echarts图表 redis缓存中间件特色:支付、...
    发表于 01-03 07:58

    mybatis框架的核心组件和作用是什么

    mybatis的核心组件包括:SqlSessionFactoryBuilder(构造器)、SqlSessionFactory(工厂接口)、SqlSession(会话接口)、SQL Mapper(映射器)。
    发表于 01-28 11:08 2.5w次阅读

    mybatis配置文件详解

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis
    的头像 发表于 02-12 11:16 6209次阅读
    <b class='flag-5'>mybatis</b>配置文件详解

    mybatis是什么_MyBatis的优缺点详解_mybatis框架入门详解

    Mybatis框架是别人开发的一种半成品软件,可以用来通过定制辅助快速开发是工具。MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory
    发表于 02-24 09:16 1.9w次阅读

    mybatis和hibernate比较_区别_优缺点

    Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。本文详细的对
    的头像 发表于 02-24 10:35 3w次阅读

    easy-mybatis Mybatis的增强框架

    ./oschina_soft/gitee-easy-mybatis.zip
    发表于 06-14 09:45 1次下载
    easy-<b class='flag-5'>mybatis</b> <b class='flag-5'>Mybatis</b>的增强<b class='flag-5'>框架</b>

    MyBatis-Plus为什么不支持联表

    MyBatis Plus Join`一款专门解决MyBatis Plus 关联查询问题的扩展框架,他并不一款全新的框架,而是基于`MyBatis
    的头像 发表于 02-28 15:19 1767次阅读
    <b class='flag-5'>MyBatis</b>-Plus为什么不支持联表

    SpringBoot+Mybatis如何实现流式查询?

    使用mybatis作为持久层的框架时,通过mybatis执行查询数据的请求执行成功后,mybatis返回的结果集不是一个集合或对象,而是一个迭代器,可以通过遍历迭代器来取出结果集
    的头像 发表于 06-12 09:57 582次阅读

    mybatis和mybatisplus的区别

    MyBatisMyBatis Plus是两个非常受欢迎的Java持久层框架。这两个框架在设计和功能上有一些区别,下面我将详细介绍它们之间的差异以及各自的特点。 设计理念与目标:
    的头像 发表于 12-03 11:53 1335次阅读

    mybatis框架的主要作用

    MyBatis框架是一种流行的Java持久化框架,主要用于简化数据库操作和管理。它提供了一种简洁的方式来访问数据库,并将SQL语句从Java代码中分离出来,从而提高了代码的可维护性和可读性
    的头像 发表于 12-03 14:49 1111次阅读