java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Mybatis的核心架构

Mybatis的核心架构及源码解读

作者:抠脚的大灰狼

这篇文章主要介绍了Mybatis的核心架构及源码解读,mybatis是一款半自动化的持久层框架,它封装了JDBC操作,支持定制化SQL,高级映射,但它的数据库无关性较低,需要的朋友可以参考下

概述

mybatis是什么?

mybatis是一款半自动化的持久层框架,它封装了JDBC操作,支持定制化SQL,高级映射。但它的数据库无关性较低,2个不同的数据库,可能需要2套SQL语句

mybatis的基本使用?

架构流程

三层结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfGIOhPg-1573726013288)(C:\Users\Vergi\Desktop\3level-architech.png)]

接口层

使用SqlSession和Mapper接口,来完成对SQL语句的调用,日常开发中主要接触这一层

数据处理层

这一层是mybatis进行的工作,负责SQL语句组装,查询参数绑定,结果集映射

基础支撑层

这一层可以理解为我们全局配置里的内容。包括数据库连接信息,事务管理信息,配置缓存,编写mapper映射文件中的SQL语句等

工作流程

源码部分

全局配置文件解析过程

源码过程

SqlSessionFactoryBuilder # build 
 |- XMLConfigBuilder # parse 
   |- XMLConfigBuilder # parseConfiguration

mapper映射文件解析过程

源码过程

XMLConfigBuilder # mapperElement
 |- XMLMapperBuilder # parse
   |- XMLMapperBuilder # configurationElement

SQL加载与组装过程

SQL装载

源码过程

XMLMapperBuilder # buildStatementFromContext
 |- XMLStatementBuilder # parseStatementNode
   |- XMLLanguageDriver # createSqlSource 
     |- XMLScriptBuilder # parseScriptNode

SQL组装

源码过程

CachingExecutor # query
 |- MappedStatement # getBoundSql
  |- DynamicSqlSource # getBoundSql
   |- SqlNode # apply // 动态SQL的组装,以及将${}进行字符串拼接
   |- SqlSourceBuilder # parse //这里是将#{}替换成 ?
   //组装完成后封装成StaticSqlSource
   //并调用StaticSqlSource的getBoundSql
   //new 一个新的BoundSql,传入组装好的SQL语句,以及查询参数

执行查询过程

源码过程

DefaultSqlSession # selectList
 |- CachingExecutor # query
   |- BaseExecutor # query
     |- BaseExecutor # queryFromDatabase
       |- SimpleExecutor # doQuery
         |- Configuration # newStatementHandler
         |- SimpleExecutor # prepareStatement
         |- StatementHandler # query

缓存过程

源码过程

//二级缓存
CachingExecutor # query
 |- MappedStatement # getCache//获取该mapper下的二级缓存
 |- TransactionalCacheManager # getObject //查找缓存中是否有数据
   |- TransactionalCache # getObject //查找缓存中是否有数据
 |-TransactionalCacheManager # putObject //存入二级缓存
   |- TransactionalCache # getObject
//若二级缓存未命中,走一级缓存
BaseExecutor # query
  |- PerpetualCache # getObject //从一级缓存中取数据

延迟加载过程

源码过程

DefaultResultSetHandler # createResultObject
 |- Configuration # getProxyFactory
 |- JavassistProxyFactory # createProxy
 // 默认是使用JavassistProxyFactory

获取Mapper代理过程

源码过程

DefaultSqlSession # getMapper
 |- MapperRegistry # getMapper
  |- MapperProxyFactory # newInstance
    |- MapperProxy # 构造函数
    |- Proxy.newProxyInstance

mybatis插件过程

mybatis的插件会对以下几个类起作用

实现Interceptor接口,覆写intercept方法,在intercept方法中完成插件的拦截逻辑。

并覆写plugin方法,在plugin方法中调用Plugin.wrap来生成一个代理对象并返回,即可。

底层也是使用的JDK动态代理

源码流程

//以Executor为例
DefaultSqlSessionFactory # openSession
  |- Configuration # newExecutor
    |- InterceptorChain # pluginAll

类关系总结

配置文件解析相关

SQL组装相关

执行相关

到此这篇关于Mybatis的核心架构及源码解读的文章就介绍到这了,更多相关Mybatis的核心架构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文