mybatis 启动流程分析(原理)

本文分析了MyBatis框架的启动流程,包括相比原生JDBC的改进,整体设计的接口层、数据处理层、框架支撑层和主要构件的相互关系。重点讨论了MyBatis的初始化机制,从配置文件解析到映射器解析,详细阐述了MappedStatement的生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:

从整体上了解mybaits框架,并通过debug过程分析启动过程中涉及到的一些关键节点。如果需要了解sql执行过程的整体情况,可以了解下我的另外一篇mybatis SQL执行流程分析(原理)

mybaits 相比原生jdbc 有了哪些改进

如果您不是很明白为啥不直接用jdbc 而是要用mybatis,建议您阅读这篇文章 看看原始的jdbc访问数据库方式,和使用mybatis框架访问数据库方式的差异。我们会发现框架给人带来了很大的方便。主要是下面几点

  • 连接获取和释放
  • SQL统一存取
  • 传入参数映射和动态SQL
  • 结果映射和结果缓存

MyBatis框架整体设计

在这里插入图片描述

接口层

负责和应用层之间做交互,提供api接口给到用户调用,执行常见的增删改查,我们常见的mapper接口实际就是该层的。

数据处理层

  • 通过传入参数,构建动态SQL语句;
  • SQL语句的执行以及封装查询结果集成List

框架支撑层

  • 事务管理机制
  • 连接池管理机制
  • 缓存机制
  • SQL语句的配置方式

主要构件及其相互关系

  • SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能;
  • Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护;
  • StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler:负责对用户传递的参数转换成JDBC Statement 所需要的参数;
  • ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换;
  • MappedStatement:MappedStatement维护了一条<select|update|delete|insert>节点的封装;
  • SqlSource:负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回;
  • BoundSql:表示动态生成的SQL语句以及相应的参数信息;
  • Configuration:MyBatis所有的配置信息都维持在Configuration对象之中;

在这里插入图片描述

MyBatis初始化机制

初始化入口

我们都知道使用mybatis的时候回有一个配置文件mybatis-config.xml ,mybait框架的初始化也是从这个配置文件开始的。
如果你是用的spring的话,在spring的配置文件中往往会有初始化sqlSessionFactory的过程。而在实例化sqlSessionFactory的过程中就会解析我们前面提到的配置文件(mybatis-config.xml),也是我们需要重点分析的部分。
在这里插入图片描述

核心配置文件的解析


  //解析配置
  private void parseConfiguration(XNode root) {
   
    try {
   
      //分步骤解析
      //1.properties
      propertiesElement(root.evalNode("properties"));
      //2.类型别名
      typeAliasesElement(root.evalNode("typeAliases"));
      //3.插件
      pluginElement(root.evalNode("plugins"));
      //4.对象工厂
      objectFactoryElement(root.evalNode("objectFactory"));
      //5.对象包装工厂
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      //6.设置
      settingsElement(root.evalNode("settings"));
      // read it after objectFactory and objectWrapperFactory issue #631
      //7.环境
      environmentsElement(root.evalNode("environments"));
      //8.databaseIdProvider
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      //9.类型处理器
      typeHandlerElement(root.evalNode("typeHandlers"));
      //10.映射器
      mapperElement(root.evalNode("mappers"));
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值