MyBatis源码通~SQL语句执行

SQL语句执行

SQL执行过程包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延迟加载等。

1、涉及技术点

  • 为 Mapper 接口生成实现类(其实对应的就是代理类)
  • 根据配置信息生成 SQL,并将运行时参数设置到 SQL 中
  • 一二级缓存的实现
  • 插件机制
  • 数据库连接的获取与管理
  • 查询结果的处理,以及延迟加载等

2、主要涉及类或接口

在这里插入图片描述

  • Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。
  • StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过 java.sql.Statement 对象执行 SQL 语句并得到结果集。
  • 最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。

3、SQL执行之旅

从解析Config文件和Mapper文件到构建超级大对象Configuration,再到构建DefaultSqlSessionFactory,通过DefaultSqlSessionFactory创建DefaultSqlSession,再通过DefaultSqlSession类中的getMapper方法开启SQL执行之旅。

  • **执行流程图1:**获取代理类到开始调用SqlSession对应的执行Sql的方法

在这里插入图片描述

  • 执行流程图2:从SqlSession到JDBC
    在这里插入图片描述

3.1、获取Mapper接口代理类

创建路径:DefaultSessoin => Configuration => MapperRegistry => MapperProxyFactory => MapperProxy

// -☆- DefaultSqlSession
public <T> T getMapper(Class<T> type) {
   
    return configuration.getMapper(type, this);
}

// -☆- Configuration
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
   
    return mapperRegistry.getMapper(type, sqlSession);
}

// -☆- MapperRegistry
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
   
    //NOTE: 从绑定集合中获取对应Mapper接口的MapperProxyFactory
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
   
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
   
      //NOTE: 创建代理对象
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
   
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
}
  • 获取到MapperProxyFactory后,调用工厂方法newInstance创建真正的代理类MapperProxy
  • MapperProxy对象实现了接口InvocationHandler。在MapperProxyFactory中,将对象作为参数传给重载方法,并在重载方法newInstance中调用 JDK 动态代理接口为 Mapper 生成代理对象。
protected T newInstance(MapperProxy<T> mapperProxy) {
   
    // 通过 JDK 动态代理创建代理对象
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] {
    mapperInterface 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只打杂的码农

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值