Mybatis运行原理(带你三步走)

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缓存机制等还未整理,后期会补上这块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值