Mybatis运行原理(带你三步走)
官网地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html
第一步:初始化阶段,解析并加载到Configuration实例中。
- 读取xml配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化工作。
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
源码解读入口:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
其中:
XMLConfigBuilder:解析mybatis-config.xml文件。
XMLMapperBuilder:解析所有的*mapper.xml文件。
XMLStatementBuilder:解析SQL语句(select|insert|update|delete)。
以上解析的文件均加载到Configuration实例中。
第二步:代理阶段
使用jdk动态代理,封装IBatis编程模型,找到访问数据库时对应的方法及传参
- 创建SqlSession响应请求
- 动态代理封装iBatis的编程模型
- 使用mapper接口访问数据库
源码解析入口:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
翻译过程:
找到session中对应的方法执行 <<<----- MapperMethod.SqlCommand.type + MapperMethod.MethodSignature.returnType
找到命名空间和方法名 <<<----- MapperMethod.SqlCommand.name
传递参数 <<<----- MapperMethod.MethodSignature.convertArgsToSqlCommandParam
第三步:数据读写阶段
遵循jdbc规范,通过SqlSession完成SQL的解析,参数的映射,SQL的执行、结果的解析过程。
Mybatis的四大对象:
Executor:通过对SimpleExecutor doQuery()方法的解读发现,Executor是调度器。
StatementHandler:它的作用是使用数据库的Statement或PrepareStatement执行操作,起承上启下作用。
ParameterHandler:对预编译的SQL语句进行参数设置。
ResultSetHandler:对数据库返回的结果集(ResultSet)进行封装,返回用户指定的实体类型。
TransactionalCache:二级缓存
PerpetualCache:一级缓存
注:数据查询时,先从二级缓存取数据,若取不到则再从一级缓存中取数据(这是MySQL规定),若一级缓存中再获取不到,则从数据库中取数据。
Executor内部运作过程:
以上只是梳理Mybatis大致处理流程,像Mybatis缓存机制等还未整理,后期会补上这块。