目录

  • 一、阅读源码注意事项
  • 二、指导原则
  • 三、源码分析
  • 四、源码构建
  • 五、类加载器Classloader
  • 六、纯MyBatis代码开发步骤
  • 七、源码分析
  • 第一步:读取mybatis-config.xml配置文件
  • 第二步:构建SqlSessionFactory
  • 八、总结:


一、阅读源码注意事项

  1. 源码看第一遍基本上都会晕车的,特别是之前没有看过源码的学员;
  2. 一开始看源码晕车很正常,建议至少看3遍以上,然后可能才感觉不晕车;
  3. 看源码目的主要了解其底层实现,设计思想,拓展思维,开发时借鉴和参考;
  4. 不必把每一个细节都弄明白,当今社会追求高效,不必重复造轮子;
  5. 看源码不必有完美主义,开源代码中也有不尽人意之处;
  6. 看源码主要掌握核心底层实现及精华之处,在工作中遇到异常能快速定位;

二、指导原则

  1. 寻找入口
  2. 断点跟踪
  3. 先粗后细
  4. 精略结合
  5. 猜想验证

三、源码分析

  1. 建议先自己看一遍源码,然后再看直播或者录播视频,效果会更好;
  2. 建议看一遍第一期的Mybatis源码分析,可以把视频播放速度加到1.3-1.5-2.0倍播放,可以一天完成MyBatis所有视频的学习;
  3. 官方文档:mybatis 官方文档
  4. 源码下载:git-mybatis源码

四、源码构建

  1. 从git上clone下项目,用idea打开。
  2. 切换版本
    JDK Version: 1.8.0-321 is not in the allowed range [11,12),[17,18),[19,20),[20,21),[21,22).
  3. 编译的过程中,如果报错就把license删除。

五、类加载器Classloader

ClassLoader翻译过来就是类加载器,一般开发时其实用得不多,但对于某些框架开发来说却非常常见。具体作用就是将 class文件加载到jvm虚拟机中去,程序就可以运行了,但是jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要动态加载,如果一次性加载jar包和class,内存消耗极大;

Java语言自带有三个类加载器:

动力节点springboot md_源码分析


动力节点springboot md_源码分析_02


Java核心类库由BootstrapClassLoader加载,由于是本地C语言实现,所以为null。

六、纯MyBatis代码开发步骤

第一步:读取mybatis-config.xml配置文件;
第二步:构建SqlSessionFactory;
第三步:打开SqlSession;
第四步:获取Mapper接口对象;
第五步:调用Mapper接口对象的方法操作数据库;

创建入口。

//第一步:读取mybatis-config.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

//第二步:构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//第三步:打开SqlSession
SqlSession session = sqlSessionFactory.openSession();

//第四步:获取Mapper接口对象
UsersMapper usersMapper = session.getMapper(UsersMapper.class);

//第五步:调用Mapper接口对象的方法操作数据库;
Users user = usersMapper.selectByPrimaryKey(1L);

//第六步:业务处理
log.info("查询结果: " + user.getId() + "--" + user.getPhone());

七、源码分析

第一步:读取mybatis-config.xml配置文件

通过Resources工具类,调用ClassLoader读取classpath下的mybatis-config.xml配置文件,得到一个输入流;

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

第二步:构建SqlSessionFactory

建议一步步断点跟踪更加清晰

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. 在build中调用重载的build。重载的build方法里通过传入的流创建了一个XMLConfigBuilder对象。
  2. 动力节点springboot md_java_03

  3. 进入XMLConfigBuilder构造器,其中使用XPathParser类将流按照XMLMapperEntityResolver指定的本地dtd进行解析,获取到XPathParser对象,并放入XMLConfigBuilder类中。
  4. XMLConfigBuilder类中,进行了默认的别名和处理器注册。并实现了线程隔离的单例的错误信息记录ErrorContext
  5. 动力节点springboot md_动力节点springboot md_04

  6. 接下来,使用刚才获取到的XMLConfigBuilder对象进行解析。将解析出的配置对象设置到DefaultSqlSessionFactory中,并返回实力实例
  7. 动力节点springboot md_动力节点springboot md_05

  8. 具体使用了xpath的方式进行解析先从根标签开始,获取每一个标签的XNode对象,再解析出其中的属性和子节点。最后状装填到XMLConfigBuilder持有的configuration对象中去。
  9. 动力节点springboot md_源码分析_06

  10. 6. 在parseConfiguration中进行了许多重要的操作,如125行通过解析mappers标签,解析并装载了mapper文件。
  11. 动力节点springboot md_动力节点springboot md_07

至此sqlSessionFactory构建完毕。下一步,开启session。

八、总结:

  • MyBatis解析配置文件的本质就是为了获得Configuration对象。
  • Configuration 对象可以理解是mybatis的XML配置文件在程序中的化身。
  • MyBatis非常重要的一个对象,里面封装了MyBatis的整个配置信息。