执行sql语句源码分析

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。

目录

概述

根据Demo的内容可以知道,数据源和配置类信息都配置在mybatis-config.xml文件中,在测试类TestMyBatis 中,先是将配置文件解析成InputStream流,放到SqlSessionFactoryBuilder的build(inputStream)方法中,然后获取到SqlSessionFactory对象,所以现在就来看一下build()方法源码里面执行了哪些内容吧。 即解析下面这条语句的源码

public class SqlSessionFactoryBuilder {
  
 /**
 * build方法的入口,调用下面的build方法
 **/
 public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }
  /**
  * 在这里真正的对mybatis-config.xml文件进行解析
  **/
  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
      //这一步中主要的操作是将mybatis-config.xml文件加载进parser对象,然后初始化Configuration类
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      //先调用parser.parse()方法获取mybatis-config.xml文件配置信息,然后将里面的信息赋值给Configuration类
      //然后调用下面的build方法,将已经赋值的Configuration类作为参数传递进DefaultSqlSessionFactory类中
      //这一步中Configuration类已经完全获取mybatis-config.xml文件配置信息
      return build(parser.parse());
   }
  /**
  *最后调用的返回方法
  **/
  public SqlSessionFactory build(Configuration config) {
    //将已经初始化的Configuration类作为参数传递进DefaultSqlSessionFactory类,并返回
    return new DefaultSqlSessionFactory(config);
  }
}

在这里插入代码片

从名字就可以看出来,这个类的初始化应该是去加载mybatis-config.xml文件,但是还没有真正的去解析,下面看一下这个XMLConfigBuilder类的这个构造函数:

parser对象存储的是mybatis-config.xml配置文件
environment对象目前是空,但是执行完之后,它里面保存的是事务管理器和数据源
configuration对象存储的是MyBatis默认的初始化配置,执行完之后,配置文件的内容会覆盖默认配置
typeAliasRegistry存储的是JAVA类型别名对象
typeHandlerRegistry存储的是JDBC类型处理器对象

3.3、构建SQL语句
接下来看mapperElement() 方法里面是如何获取SQL语句的,即获取StateMent对象,这个过程有点复杂,因为mapper文件中的sql一般如下所示:
个StateMent对象其实就是一个完整的SQL语句,要拼接完整的StateMent内容,需要先获取<select | insert | update | delete >这些标签,然后再获取标签里面的参数,比如SQL语句的入参是什么、结果参数是什么、是否要二级缓存等等,这个解析过程导致整个StateMent的拼接有点繁琐,下面就来看一下mapperElement()方法的源码吧。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

sqlSessionFactory 的mappedStatements对象内容如下,从下图中可以知道,此时已获取到Statement对象了,即具体的SQL语句。

问题

实现思路分析

相关工具如下:

分析:

小结:

主要讲述了注解配置方式的Mybatis数据库源源码分析原理剖析, 里面有许多不足,请大家指正~

参考资料和推荐阅读

1.链接: 参考资料.
2.链接: 参考资料.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

执于代码

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值