Mybatis 源码(二):整体设计概览
1、Mybatis整体架构
Mybatis的整体框架分为三层,分别是基础支持层、核心处理层、和接口层。
1.1、接口层
SqlSession是接口层的核心对象,是应用程序与Mybatis交互的桥梁。SqlSession接口定义数据查询、数据新增、数据修改、数据删除等对数据库库操作的方法。也定义了获取数据库连接、事务提交/回滚、资源关闭、缓存处理等方法。
SqlSession接口方方法:
接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作。
1.2、核心处理层
核心处理层主要处理与数据库相关的操作。核心处理层功能的设计思想与JDBC笔记(二):JDBC的封装中提到原生JDBC封装思想一样,主要完成以下事情:
1、输入参数解析,映射成JDBC类型;
2、解析SQL语句,动态生成数据库可执行的SQL;
3、执行SQL;
4、输出参数解析,映射成实体对象。
1.3、基础支持层
基础支持层主要支持核心处理层的工作,将通用功能进行封装实现复用。基础支持层包含数据源、事务、缓存、日志等功能。
2、Mybatis执行核心流程
1.1、Mybatis执行代码示例
引用Mybatis 源码(一):源码编译准备中的代码示例分析Mybatis的核心执行流程
1 public static void main(String[] args) throws IOException { 2 String resource = "mybatis-config.xml"; 3 // 加载mybatis的配置文件 4 InputStream inputStream = Resources.getResourceAsStream(resource); 5 // 获取sqlSessionFactory 6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 7 // 获取sqlSession 8 SqlSession sqlSession = sqlSessionFactory.openSession(); 9 // 查询用户 10 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 11 User user02 = mapper.selectUserById("101"); 12 System.out.println("user01: " + user02); 13 } 14 }
1.2、执行示例中的核心对象
1、SqlSessionFactoryBuiler
SqlSessionFactoryBuiler是用来构建SqlSessionFactory的,SqlSessionFactory只需要一个,也就是说只要成功构建SqlSessionFactory,SqlSessionFactoryBuiler就没什么用了,SqlSessionFactoryBuiler的作用域只存在方法内部。
2、SqlSessionFactory
SqlSessionFactory是用来创建SqlSession的,每次应用程序访问数据库,都需要创建一个会话。因为一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。
创建SqlSession只需要一个实例来做这件事就行了,否则会产生很多的混乱,和浪费资源。采用采用单例模式。
3、SqlSssion
SqlSession是一个会话,线程不安全,线程之间不能共享。请求过来就创建SqlSession对象,在请求完成后关闭。作用域在一次请求中。
4、Mapper
Mapper是从SqlSession中获取的,是一个代理对象,用于发送SQL来操作数据库的数据。作用域在一个SqlSession事务方法之内。
1.3、核心执行流程
Mybatis的核心流程图如下:
1、配置解析
读取Mybtais的全局配置文件mybatis-config.xml、Mapper.xml映射文件,包含数据库连接信息,事务管理器、数据源、SQL映射文件等配置。配置解析源码分析:Mybatis 源码(三):Mybatis配置解析,核心流程图如下;
2、构建会话工厂SqlSessionFactory
配置解析完成之后,返回了一个DefaultSqlSessionFactory,持有配置类Configuration的实例。
3、创建sqlSession对象(Executor执行器)
由会话工厂创建SqlSession对象,创建sqlSession对象的核心是创建Executor执行器,Executor对象中包含了执行DML语句的所有方法。
sqlSession对象创建源码分析:Mybatis 源码(五):SqlSession对象构建。核心流程图如下:
5、SQL执行流程
SQL执行流程源码分析:Mybatis源码(七):SQL执行流程。核心流程图如下: