目录
- 一、阅读源码注意事项
- 二、指导原则
- 三、源码分析
- 四、源码构建
- 五、类加载器Classloader
- 六、纯MyBatis代码开发步骤
- 七、源码分析
- 第一步:读取mybatis-config.xml配置文件
- 第二步:构建SqlSessionFactory
- 八、总结:
一、阅读源码注意事项
- 源码看第一遍基本上都会晕车的,特别是之前没有看过源码的学员;
- 一开始看源码晕车很正常,建议至少看3遍以上,然后可能才感觉不晕车;
- 看源码目的主要了解其底层实现,设计思想,拓展思维,开发时借鉴和参考;
- 不必把每一个细节都弄明白,当今社会追求高效,不必重复造轮子;
- 看源码不必有完美主义,开源代码中也有不尽人意之处;
- 看源码主要掌握核心底层实现及精华之处,在工作中遇到异常能快速定位;
二、指导原则
- 寻找入口
- 断点跟踪
- 先粗后细
- 精略结合
- 猜想验证
三、源码分析
- 建议先自己看一遍源码,然后再看直播或者录播视频,效果会更好;
- 建议看一遍第一期的Mybatis源码分析,可以把视频播放速度加到1.3-1.5-2.0倍播放,可以一天完成MyBatis所有视频的学习;
- 官方文档:mybatis 官方文档
- 源码下载:git-mybatis源码
四、源码构建
- 从git上clone下项目,用idea打开。
- 切换版本
JDK Version: 1.8.0-321 is not in the allowed range [11,12),[17,18),[19,20),[20,21),[21,22).
- 编译的过程中,如果报错就把license删除。
五、类加载器Classloader
ClassLoader翻译过来就是类加载器,一般开发时其实用得不多,但对于某些框架开发来说却非常常见。具体作用就是将 class文件加载到jvm虚拟机中去,程序就可以运行了,但是jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要动态加载,如果一次性加载jar包和class,内存消耗极大;
Java语言自带有三个类加载器:
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);
- 在build中调用重载的build。重载的build方法里通过传入的流创建了一个
XMLConfigBuilder
对象。 - 进入
XMLConfigBuilder
构造器,其中使用XPathParser
类将流按照XMLMapperEntityResolver
指定的本地dtd进行解析,获取到XPathParser对象,并放入XMLConfigBuilder类中。 - 在
XMLConfigBuilder
类中,进行了默认的别名和处理器注册。并实现了线程隔离的单例的错误信息记录ErrorContext
。 - 接下来,使用刚才获取到的XMLConfigBuilder对象进行解析。将解析出的配置对象设置到
DefaultSqlSessionFactory
中,并返回实力实例 - 具体使用了xpath的方式进行解析先从根标签开始,获取每一个标签的
XNode
对象,再解析出其中的属性和子节点。最后状装填到XMLConfigBuilder持有的configuration对象中去。 - 6. 在parseConfiguration中进行了许多重要的操作,如125行通过解析mappers标签,解析并装载了mapper文件。
至此sqlSessionFactory构建完毕。下一步,开启session。
八、总结:
- MyBatis解析配置文件的本质就是为了获得Configuration对象。
- Configuration 对象可以理解是mybatis的XML配置文件在程序中的化身。
- MyBatis非常重要的一个对象,里面封装了MyBatis的整个配置信息。