Loading

MyBatis本质、底层与执行流程

MyBatis执行流程

  • 本质:反射机制实现MyBatis三大类的创建

  • 底层:使用动态代理接管dao层接口操作

  • 执行流程:MyBatis工具类 => 【MyBatisUtils】,按照【官方使用步骤】:

    1. 获取核心配置文件【mybatis-config.xml】中的配置

      try{
          // 指定配置文件路径
          String resource = "mybatis-config.xml";
          // 读取局部变量【resource】中的核心配置文件,并将其所有配置转化为input流
          // getResourceAsStream需要try...catch
          InputStream inputStream = Resources.getResourceAsStream(resource);
      }catch(Exception e){
          e.printStackTrace();
      }
      
    2. 实例化SqlSessionFactoryBuilder构造器

      // 调用SqlSessionFactoryBuilder()类的build()方法创建SqlSessionFactory对象
      /*
      	public class SqlSessionFactoryBuilder{
      		..
       		SqlSessionFactory build(InputStream inputStream) {
          return build(inputStream, null, null);
        }
      		..
      	}
      */
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      
    3. 解析【1.获取核心配置文件中的配置】中配置好的文件解析流inputStream

      // SqlSessionFactoryBuilder.build()重载
        public SqlSessionFactory build(InputStream inputStream) {
          return build(inputStream, null, null);
        }
      
      // SqlSessionFactoryBuilder.build()终会执行该build()方法:
      // XMLConfigBuilder.parse()完成对核心配置文件的解析
      public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
          try {
            XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
            return build(parser.parse());
          } catch (Exception e) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", e);
          } finally {
            ErrorContext.instance().reset();
            try {
              reader.close();
            } catch (IOException e) {
              // Intentionally ignore. Prefer previous error.
            }
          }
        }
      
    4. 实例化一个【按1.配置核心配置文件】的DefaultSqlSessionFactory

      // 使用Configuration类存放所有XML配置信息,并传递给SqlSessionFactory对象
      public SqlSessionFactory build(Configuration config) {
          return new DefaultSqlSessionFactory(config);
      }
      
      1. 创建SqlSession对象
    5. 创建executor执行器

      • delegate = (SimpleExecutor)
      • tcm = (TranscationalCacheManager)
        • transcationalCache
      • autoCommit = true | false
      • dirty = true | false
      • cursorList = null
    6. 完成CRUD操作

    7. 判断事务

      • 成功提交
      • 失败回滚executor
posted @ 2022-03-20 21:48  Cn_FallTime  阅读(62)  评论(0编辑  收藏  举报