Mybatis源码分析

mybatis简介

mybatis是一款优秀的半自动化持久层框架,它支持定制化SQL,存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数获取结果集。Mybatis可以使用简单的XML或者注解来配置和映射原生信息,将java的pojo映射成数据库中的记录。

优点:SQL统一维护配置文件中,方便管理维护,半自动化,插件支持,简单易学

github地址:https://github.com/mybatis/mybatis-3

基础架构简介
Mybatis源码分析_第1张图片
基础架构层大体一共可以分为三层,分别是基础支撑层,数据处理层,接口层。
基础支撑层:
负责最基本的基础功能支撑,包括连接管理,失误管理,配置加载,缓存处理。这些都是共用的东西,将他们抽取出来最为最基础的组件,为上层数据处理层提供最基础的支撑。
数据处理层
负责具体的SQL查找,SQL解析,SQL执行,和执行结果的映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库,接口层一接收到请求就会调用数据处理层来完成具体的数据处理。

执行流程简介
Mybatis源码分析_第2张图片
具体可以分为以下几步:
1、加载配置文件到Configuration
2、构建SQlSessionFactory
3、打开SqlSession会话
4、Executor开始处理请求
5、SqlSource解析Sql
6、StatementHandler执行sql
7、parameterHandler设置参数
8、StatementHandler执行Sql
9、ResultSetHandler处理结果集

Executor:是跟SqlSession绑定在一起的,每一个SqlSession都拥有一个新的Executor对象,由Configuration创建


        
        

SIMPLE(默认), 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
REUSE, 以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用
BATCH,执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理的;BatchExecutor相当于维护了多个桶,每个桶里都装了很多属于自己的SQL,就像苹果蓝里装了很多苹果,番茄蓝里装了很多番茄,最后,再统一倒进仓库
cacheEnabled 如果为true,会创建CachingExecutor,先从缓存中获取查询结果,存在就返回,不存在,再委托给Executor delegate去数据库取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor

Statement: