MyBatis-架构与原理
- 架构图
- API接口层
- 数据处理层
- 基础支撑层
- 流程
- MyBatis核心类
- SqlSessionFactoryBuilder
- SqlSessionFactory对象由SqlSessionFactoryBuilder创建
- SqlSession
- Executor
- StatementHandler
- ResultHandler
架构图
API接口层
提供给外部使用的API,通过这些API来操作数据库
数据处理层
负责具体的SQL解析、查找、执行和结果映射,根据调用请求完成数据库操作。
基础支撑层
连接管理、事务管理、配置加载、缓存处理。
流程
- MyBatis的初始化从加载mybatis-config.xml文件开始,解析构造Configuration类
- 加载配置,将SQL的配置信息加载成一个个的MappedStatement对象,包括传入参数配置、执行的SQL、结果映射配置,存储在内存中
- SQL解析,当API接口接收调用参数时,会接收到传入的ID和传入对象(Map、JavaBean或基本类型),MyBatis会根据ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement解析,解析后得到最终要执行的SQL语句和参数
- SQL执行,将最终得到的SQL和参数拿到数据库进行执行,得到返回结果
- 结果映射,将操作数据库的结果映射的配置进行转化,可以转化成HashMap、Bean或基础数据类型,并返回结果。
MyBatis核心类
SqlSessionFactoryBuilder
每一个MyBatis应用的入口是SqlSessionFactoryBuilder
通过XML配置文件创建Configuration对象,然后通过build()创建SqlSessionFactory。
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
mybatis-config.xml中的配置,SqlSessionFactoryBuilder会解析xml成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例。
SqlSessionFactory对象由SqlSessionFactoryBuilder创建
SqlSessionFactory主要是为了创建SqlSession对象,和SqlSessionFactoryBuilder对应一样,创建一个全局的就可以
SqlSession
完成一次数据库访问和结果的映射,类似于数据库的Session,由于不是线程安全的,所以SqlSession对象的作用域需要限制在方法内,默认实现类是DefaultSqlSession,有两个必须的属性:Configuration和Executor,SqlSession对数据库的操作都是由Executor来完成的。
SqlSession:默认创建DefaultSqlSession并开启一级缓存,创建Executor
SqlSession的getMapper()是联系应用程序和MyBatis的纽带,应用程序访问getMapper时,MyBatis会根据参数类型和XML配置信息生成一个代理对象,这个代理对象叫做Mapper对象,应用程序获取Mapper对象之后就可以通过这个对象唉访问MyBatis的SqlSession对象。
Executor
Executor对象在创建Configuration对象时创建,并缓存在Configuration对象中,主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中。
StatementHandler
真正访问数据库的地方,调用ResultSetHandler
ResultHandler
处理查询结果