宏观上了解Mybatis整体框架分为三层,分别是基础支持层,核心处理层,接口层
接口层: SqlSession
描述:SqlSession是上层应用和Mybatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作
核心处理层: 配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件
描述:与数据库操作相关的动作都是在这一层完成的
1:把接口中传入的参数解析并且映射成JDBC类型
2:解析xml文件中的SQL语句,包括插入参数和动态生成SQL
3:执行SQL语句
4:处理结果集,并映射程Java对象
5:插件也属于核心层,这是由它的工作方式和拦截的对象决定的
基础支持层: 数据源模块、事务模块、缓存模块、Bingding模块、反射模块、类型转换模块、日志模块、资源加载、解析器模块
描述:主要是一些抽取出来的通过功能,用来支持核心处理层的功能。如数据源、缓存、日志、xml解析、反射、IO、事务等功能
主要工作流程:
Configuration、mybatis-config.xml、Mapper.xml >> SqlSessionFactory >> SqlSession >> Executor >> StatementHandler >> 映射参数的输入 AND >> 映射的输出参数 >> DB
核心对象的生命周期:SqlSessionFactoryBuiler、SqlSessionFactory、SqlSession、Mapper
SqlSessionFactoryBuilder:用来构建SqlSessionFactory,而SqlSessionFactory只需要一个,所以只要构建了一个SqlSessionFactory,它就没有存在的意义了,所以它的生命周期只存在于方法的局部
SqlSessionFactory:用来创建SqlSession的,每次应用程序访问数据库,都需要创建一个会话。因为一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。创建SqlSession只需要一个实例就可以,否则会产生混乱和资源浪费。所有采用单例模式。
SqlSession:SqlSession是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个SqlSession对象,在请求结束或者方法执行完毕时要及时关闭它(一次请求或者操作中)
Mapper: 实际上是一个代理对象,从SqlSession中获取。作用是发送SQL来操作数据库的数据。它应该在一个SqlSession事务方法之内
TestMapper mapper = sqlSession.getMapper(TestMapper.class);
流程:SqlSessionFactoryBuilder(方法局部 method) >> SqlSessionFactory(应用级别 application) >> SqlSession(请求和操作 request/method) >> Mapper(方法 method)
MyBatis核心对象
对象 相关对象 作用
Configuration MapperRegistry、TypeAliasRegistry、TypeHandlerRegistry 包含了MyBatis的所有配置信息
SqlSession SqlSessionFactory、DefaultSqlSession 对操作数据库的增删改查的API进行了封装,提供给应用层调用
Executor BaseExecutor、SimpleExecutor、BatchExecutor、ReuseExecutor MyBaits执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler BaseStatementHandlder、SImpleStatementHandler、PrepareStatementHandler、CallableStatementHandler 封装了JDBC Statement操作,负责对JDBC Statement的操作,如设置参数,将Statement结果集转换成List集合
ParmeterHandler DefaultParameterHandler 把用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler DefaultResultSetHandler 把JDBC返回的ResultSet结果集对象转换成List类型的集合
MapperProxy MapperProxyFactory 触发管理类,用于代理Mapper接口方法
MapperStatement SqlSource、BoundSql MappedStatement维护了一条<select | update | delete | insert>节点的封装,表示一条SQL包括了SQL信息、入参信息、出参信息
MyBatis整合Spring原理
MyBatis集成到Spring,是为了进一步简化MyBatis的使用,所以只是对MyBatis做了一些封装,并没有替换MyBatis的核心对象。MyBatis.jar中的SqlSessionFactory、SqlSession、MapperProxy等这些类都会用到,mybatis-spring.jar只是做了一些包装或者桥梁的工作。
MyBatis设计模式
工程模式 SqlSessionFactory、ObjectFactory、MapperProxyFactory
建造者模式 XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder
单例模式 SqlSessionFactory、Configuration、ErrorContext
代理模式 绑定:MapperProxy、延迟加载:ProxyFactory、插件:Plugin Spring集成MyBatis:SqlSessionTemplate、自带连接池:PooledConnection、 日志打印:ConnectionLgger、StatemengLogger
适配器模式 Log,对于Log4j、JDK logging这些没有直接实现slf4j接口的日志组件,需要适配器
模板方法 BaseExecutor、SimpleExecutor、BatchExecutor、ReuseExecutor
装饰器模式 LoggingCache、LruCache对PerpetualCacheCachingExecutor对其他Executor
责任链模式 Interceptor、InterceptorChain