mybatis 源码
2022-07-03 12:11:08 0 举报
AI智能生成
mybatis源码总结
作者其他创作
大纲/内容
是什么
对复杂的jdbc操作的封装,简化基于db的开发
内部必然持有jdbc等相关对象
基础功能包
提供如文件读取,反射等基础功能,与核心逻辑耦合性小,可独立使用
exception
定义异常体系,并使用工厂创建异常
静态工厂模式
封装对象的创建过程,便于创建的复用,屏蔽对象创建的具体细节
场景
对象的创建
ExceptionFactory
包装异常将其转换为PersistenceException
构造函数私有,通常用于工厂类或者工具类,避免实例化
reflection
封装反射功能,提供便捷的反射适使用
装饰器模式
在不改变原有类的基础上,添加装饰功能,方便扩展
场景
功能比较复杂时,可拆分出核心功能和装饰功能,使用装饰类实现装饰功能,核心可自由装饰,从而实现不同功能
factory
ObjectFactory
根据class获取指定类型的构造器反射创建对象
静态工厂
Invoker
封装使用反射进行属性的读写和方法的执行
对反射异常进行处理,使用更加优雅
wrapprer
ObjectWrapper
属性相关操作
封装反射的相关操作,便于对象使用
ObjectWrapperFactory
工厂模式
装饰模式,提供对象的封装,便于对象的使用
基础
这些类是对反射的层层包装,有些类设计为底层使用,有些类设计为上层使用
MetaClass
封装class
MetaObject
封装object
反射使用的上层对象,通过底层的反射工具暴露api使用
Reflector
对class的底层封装
解析class,存储相关信息
其他反射工具类,是对此类的进一步封装
ReflectorFactory
工厂模式
创建Reflector,触发对class的解析
property
属性拷贝,属性名提取
annotations和lang
提供注解式开发的注解
注解式开发,使用不多,和xml标签几乎是一一对应
type
模板模式
类似场景大量出现时,可以将共同操作提取到父类中,并预留接口让子类具体实现业务相关的操作,可有效减少重复代码
参数类型处理,结果类型处理
java类型和数据库类型不同,需要映射处理
TypeHandler
BaseTypeHandler作为模板实现
TypeHandlerRegistry
TypeHandler注册中心,支持添加自定义处理器
TypeReference
处理handler的选择
io
vfs(虚拟文件系统)
屏蔽不同文件系统的差异,提供统一api使用
门面
提供资源访问api
Resources
资源加载工具,封装ClassLoaderWrapper
ClassLoaderWrapper
使用classloader加载资源
从类路径进行资源加载
logging
适配器模式
可在无法协作的两端,充当桥梁,起到接口转换 的作用
场景
一般与老接口集成,或者与三方集成时使用
动态代理
运行时生成目标对象的代理对象,可以拦截目标对象方法调用,从而实现额外功能
LogFactory
静态工厂模式,使用反射
parsing
解析xml文件
XPathParser
基于xpath语法解析xml
配置解析包
配置的读取,解析,转换,存储等,依赖于框架特定的配置模型,初始化阶段使用
包含的类主要是解析类和解析实体类(存储配置数据)
binding
MapperMethod
mapper业务方法封装对象
SqlCommand
持有对应的sql命令
MethodSignature
反射获取方法签名信息
MapperProxy
mapper增强,拦截mapper方法调用,进行实际的sql操作
InvocationHandler
MapperProxyFactory
根据mapper类型,创建mapper代理
静态工厂方法
MapperRegistry
mapper注册中心
mapper->mapper代理工厂
builder
构建者模式
用于创建多属性的对象
解析xml文件和基于注解的开发
mapping
映射实体
MappedStatement
原始的sql节点
SqlSource
sql节点下的sql
BoundSql
参数已经绑定完成
ParameterMap
参数映射
ParamterMapping
ResultMap
结果集映射
ResultMapping
Discriminator
根据条件值的不同,进行不同的映射
Environment
环境信息
多数据库支持
根据配置的不同,选择不同数据库支持的sql
scripting
xml sql的解析
datasouce
完成与数据库的交互
数据源类型
jndi
通过指定的名称获取jndi数据源
pooled
池化的数据源
连接进行了缓存,并保证线程安全
PoolState
数据源运行时状态对象,可监控数据源,进行及时调整
unpooled
非池化的数据源
每次重新获取连接
数据源工厂
核心功能包
完成数据库操作
jdbc
提供给用户使用,mybatis内部并未使用
sql拼装
AbstractSQL
sql的执行
SqlRunner
脚本的执行
ScriptRunner
cache
缓存结果,性能优化
缓存实现包,采用装饰者模式
被装饰的类,功能应尽可能简单,多余的功能,应该由装饰器实现
基础
Cache
CacheKey
NullCacheKey
标识查询sql,若能找到cacheKey,则说明已经被缓存
装饰器
底层实现
PerpetualCache
装饰器
多个装饰器可以组合使用,从而实现不同的装饰效果
同步装饰器
SynchronizedCache
避免并发问题
日志装饰器
LoggingCache
缓存获取进行日志记录
可以根据日志推测当前缓存配置是否适当,一种运行时监控手段
清理装饰器
及时清理缓存占用的内存空间,防止缓存占用太大内存
FifoCache
使用Deque辅助记录元素添加顺序
LruCache
LinkedHashMap辅助记录最久未使用的key
WeakCache
SoftCache
软引用实现的cache
序列化装饰器
SerializedCache
jdk序列化实现的cache
通过序列化和反序列化,保证每次缓存获取的对象都是全新的对象,避免对象在多个线程之间共享修改
事务装饰器
TransactionalCache
事务提交时,缓存数据,事务回滚时,销毁缓存数据
BlockingCache
阻塞相同请求对数据库的查询,减少数据库查询次数
ScheduledCache
伪定时清理缓存
不是采用后台线程清理,而是使用时检测清理
缓存机制
一级缓存
BaseExecutor实现,归属于session级别
二级缓存
CachingExecutor实现,namespace级别
先访问二级缓存,再访问一级缓存
基于装饰器模式实现,先执行装饰器功能,再执行被装饰功能
transaction
工厂方法模式
TransactionFactory
JdbcTransactionFactory
ManagedTransactionFactory
Transaction
connection的封装
实现事务提交,回滚
类型
jdbc
使用jdbc api控制事务
managed
事务由容器控制
cursor
不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理
场景
大量数据查询时可用
executor
基础
Executor
内部使用,串连mybatis的各个组件
模板模式
BaseExecutor
SimpleExecutor
....
装饰者模式
CachingExecutor
keygen
KeyGenerator
id生成器
模式
策略模式
思想
aop
processBefore
sql执行前生成主键
processAfter
sql执行后获取主键
loader
ProxyFactory
懒加载
根据条件按需加载,减少数据的查询,性能提升
基于动态代理实现
代理工厂
模式
代理模式
工厂方法模式
CglibProxyFactory
JavassistProxyFactory
statement
StatementHandler
Statement相关处理
模式
模板模式
装饰者模式
paramter
ParameterHandler
参数处理,为PreparedStatement设置参数
result
DefaultResultContext
存放一条记录
DefaultResultHandler
结果处理器
resultset
ResultSetHandler
处理结果集
session
开放给外部使用,并将相应操作委托你给executor实现
Configuration
全局配置对象
ResultContext
结果上下文
ResultHandler
结果处理器
RowBounds
分页对象
内存中舍弃多余数据,实现分页
会查询出多余的对象,性能不友好
SqlSession
对外暴露的crud对象,事务对象
SqlSessionFactory
工厂
SqlSessionFactoryBuilder
构建者模式
plugin
可自定义插件,扩展功能,扩展点
责任链模式
场景
对象需要经过多个对象的流水化操作时,可使用,以解耦对象和处理对象
Interceptor
拦截方法执行
代理对象生成
Plugin
拦截的类型
ParameterHandler
ResultSetHandler
StatementHandler
Executor
InterceptorChain
ArrayList实现链条的构建
被拦截的对象可能被多次代理
0 条评论
下一页