Mybatis3源码分析(22)-总结
来源:互联网 发布:股票k线数据如何获得? 编辑:程序博客网 时间:2024/04/30 05:40
Configuration加载过程
Configuration组成
- 基本属性。在mybatis-config.xml加载的属性这里定义为基本属性。如cacheEnabled/variables/objectFactory等等,这些的加载都比较简单。
- cache缓存。这个是从mapper配置文件加载的。一个命名空间对应一个缓存。
- resultMap。结果集映射,从mapper配置文件中的resultMap节点加载。
- mappedStatement。Sql语句的定义。从mapper配置文件中的select/update/insert/delete节点加载。
Configuration加载
- XMLConfigBuilder读取mybatis-config.xml文件,解析内容并加载到configuration中基本属性中。
- XMLMapperBuilder读取Mapper配置文件,解析得到配置内容。如果是加载Mapper接口的话由MapperAnnotationBuilder从注解里解析配置内容。
- MapperBuilderAssistant利用XMLMapperBulider/XMLAnnotationBuilder解析到的配置构建Cache/ResultMap/MappedStatement对象并加载到Configuration中。
SQL执行过程
主要对象
- Mybatis在SqlSession接口中提供了访问数据库的基本操作。如select/update/insert/delete/commit/rollback/close。SqlSession有一个默认的实现DefaultSqlSession
- 在DefaultSqlSession中有一个Executor对象,对象数据的操作都是由这个Executor来完成。Executor中有三个对象来帮助他完成MappedStatement的执行工作。
- StatementHandler负责从连接中获取一个Statement对象
- ParameterHandler负责对Statement设置参数
- ResultHandler负责生成查询语句的结果集
主要过程
- DefaultSqlSession根据id在configuration中找到MappedStatement对象(要执行的语句)
- Executor调用MappedStatement对象的getBoundSql得到可执行的sql和参数列表
- StatementHandler根据Sql生成一个Statement
- ParameterHandler为Statement设置相应的参数
- Executor中执行sql语句
- 如果是更新(update/insert/delete)语句,sql的执行工作得此结束
- 如果是查询语句,ResultSetHandler再根据执行结果生成ResultMap相应的对象返回。
Mybatis使用到的主要的设计模式
- 装饰模式。在实现Executor、Cache等接口时,Mybatis都使用了装饰模式。
- 模板模式。在看过很多框架的源都使用了这种模式。模板模式将面向对象的特性发挥到了极致。
- 外观模式。外观模式提供了统一的接口给客户端使用。为以后的系统或功能扩展提供了便利性。
其他
- Mybatis用jdk的动态代理实现了拦截器和Mapper接口。这种动态代理和注解的运用也是非常值得学习的。
- SqlSession在一个生命周期中会产生大量的临时对象,如:Executor、Transaction、Cache、MetaObject、StatementHandler、ParameterHandler、ResultSetHandler等待。但是SqlSession的生命周期是非常短的。这样造成大量对象的产生,给JVM的GC工作带来了很多的消耗,这个应该是Mybatis比较大的缺点了。
0 0
- Mybatis3源码分析(22)-总结
- Mybatis3源码分析(四):总结
- Mybatis3源码分析(07)-加载Configuration-总结
- Mybatis3源码分析(01)-前期准备
- Mybatis3源码分析(02)-加载Configuration-XMLConfigBuilder
- Mybatis3源码分析(一):从sqlSession说起
- Mybatis3源码分析(三):解析mapper的xml配置文件
- Mybatis3源码分析(三):解析mapper的xml配置文件
- Mybatis3源码分析(03)-加载Configuration-ResultMap说明
- Mybatis3源码分析(04)-加载Configuration-XMLMapperBuilder加载ResultMap
- Mybatis3源码分析(05)-加载Configuration-加载MappedStatement
- Mybatis3源码分析(06)-加载Configuration-缓存配置加载
- Mybatis3源码分析(09)-SqlSession创建及简要说明
- Mybatis3源码分析(10)-Executor接口实现方式
- Mybatis3源码分析(12)-Sql解析执行-MetaObject
- Mybatis3源码分析(14)-Sql解析执行-StatementHandler
- Mybatis3源码分析(17)-Sql解析执行-缓存的实现
- Mybatis3源码分析(18)-插件(plugins)拦截器
- java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
- Jquery-获取兄弟元素
- 利用vnet在wifi局域网中模拟一个能返回json的服务器
- JS跨域调用之JSONP--动态Script标签方式实现跨域
- actionInvocation.invoke()是什么意思
- Mybatis3源码分析(22)-总结
- js 数组的操作
- 转战Android Studio 三
- LeetCode之Backtracing题目汇总
- ajax
- 算法的时间复杂度和空间复杂度合称为算法的复杂度。
- 使UITextView不换行
- java 集合(2) 遍历collection集合方法 iterator / 加强型for循环
- #总结 2015.12.29