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