近期准备做一下Mybatis的源码解读,整个系列大概会有6-7篇文章。
先释放一下目录:
1.Mybatis框架组件设计&顶层接口
2.Mybatis框架启动流程分析
3.Mybatis框架源码Configuration分析
4.Mybatis框架一条插入语句的执行流程
5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全?
6.Mybatis框架一条查询语句的执行流程
7.Mybatis的日志&异常体系
8.Mybatis与Spring集成过程
9.Mybatis的CRUD代码生成
一、Mybatis的包结构
mybatisComponet.png二、Mybatis的接口设计(1)
MybatisMainClass.png1.Executor设计
Executor.pngExecutor(执行器)对常用的增删改查等操作做了一层抽象,并通过不同的实现来适配不同的场景,每个实现都会选择性的重写父类的方法实现自己的特性。具体每个子类可以自己分析其特点。Executor(执行器)执行器的定位就是作为SqlSession的底层依赖,由SqlSession发起调用,Executor(执行器)的底层就是StatmentHandler,已经接近于JDBC的statment和PreparedStatement了。
2.SqlSource设计
SqlSource.pngSqlSource一般很少被面试官问到,因为不是主要设计内容,但是SqlSource也封装了Sql拼装的一些过程,便于在查询的时候解耦SQL拼装的过程。
3.SqlSessionFactory(SqlSession工厂)设计
SqlSessionManager.pngSqlSessionFactory一方面使用了设计模式中的工厂模式,另一方面将常用的增删改查暴露给上层XXXMapper,XXXDAO接口调用。
4.Cache(缓存设计)设计
Cache.pngMybatis抽象了一组关于缓存的接口,同时实现了不同的缓存策略,也基于不同场景和技术分别做了实现,这种实现方式有两种优势。1.缓存策略可动态替换。2.基于接口实现与其他模块解耦,同时代码设计上比较清晰。
三、Mybatis的接口设计(2)
MybatisMainClass2.png1.ProxyFactory(代理工厂)
ProxyFactory.png这个代理工厂其实有点讲究,一方面使用了工厂模式创建接口代理,一方面使用了代理模式去代理我们自己编写的XXMapper,XXDAO,Mybatis内部集成了Gglib代理和JAVASSIST代理。
2.BaseBuilder(创建器)
BaseBuilder.pngBaseBuilder提供了一些通用的处理方法,在构建SqlSource,解析Xml生成statement等场景会利用一些父类的方法。因此,BaseBuilder作为抽象类会更合适点
3.StatementHandler(statement处理器)
StatementHandler.pngstatement处理器提供了一些基本的Sql操作接口,部分场景与Executor接口适配,因此Executor会依赖statement处理器间接调用Jdbc的增删改查接口。
4.TypeHandler(类型处理器)
TypeHandler.png类型处理器提供了一组设置参数和进行结果集构建的接口,针对不同数据类型分别创建处理器,这种方式虽然有点啰嗦或者不够抽象通用,但是针对不同的数据类型使用不同的处理类会显得更加灵活,fix问题也很简单。
5.Invoker(反射调用处理器)
Invoker.png反射调用处理器针对于method invoke场景,get,set方法等做了一层抽象,这种设计为Mybatis的反射模块提供可重用的接口和方法,避免在使用反射调用的时候反射代码散落在各处,是一种比较好的代码设计案例。
通过以上的代码和接口设计分析我们基本可以看到Mybatis的精华了,里面有很多比较好的设计理念,很熟练的运用了常见的设计模式。针对ORM,CRUD等细节性的操作和处理做了适当的封装和抽象,仔细看上去代码架构上也比较清晰,代码也不是特别复杂,比较适合阅读,学习其中的设计思想,代码风格。下面用一张架构图来结束本文。如有不正确或者不全的地方欢迎评论留言讨论哈。
Mybatis整体架构.png
网友评论