Mybatis源码中的功能模块分析
背景
- 记录mybatis3的功能模块,辅助理解mybatis是怎么工作的。
过程
-
源码模块展示
image.png
- annotations
注解,比如常用的@Select, @Insert,@Update,@Delete还有其他很多。用法就是利用反射的知识,拿到类似的信息,然后按照定义的规则,一步一步解析出来。 2. binding(非常重要的模块) 为mapper接口生成对应的mapper代理类,并能够通过statementId获取到
image.png每个mapper文件都有一个对应的mapper代理类。MapperProxyFactory生产Mapper接口文件对应的MapperProxy并当成配置信息的一部分,放到MapperRegistry中,方便后续通过statementId从容器获取,这里的statementId其实是mapper.xml文件的命名空间+id(方法名称) 其中,MapperMethod中的execute方法非常核心,所有执行sql的上层入口。 3. builder
image.png把xml文件内容进行构建。 一个一个地把xml文件中的节点读取到,并构建成java bean,方便直接哦通过get方法获取。 4. cache 缓存,mybatis缓存都是存放到map容器中,这个模块就提供缓存key的计算过程。 5. cursor 游标,指针。查询关系型数据库的一种方式。 6. datasource, 数据库源,池化的数据源和非池化的数据源。就只是包含一些基础信息,username,password,url,driver等基础信息。 7. exeception, mybatis的异常处理类。 8. executor, 非常核心的功能
sql执行器。与数据库交互的statement, 执行之前的参数准备,执行之后的结果进行处理。 9. io, 资源功能模块,读取文件 10. jdbc, 基本操作数据库的,用作测试,实际其他核心源码并没有用到这个包下面的类。
image.png11. logging, 日志模块 12. mapping, 非常核心模块
image.pngMappedStatement是非常重要的类。包含了很多元数据信息。mapper接口和mapper.xml文件会生成一个实例MappedStatement 13. parsing, XPathParser, XNode, 提供解析xml配置文件的基础类。 14. plugin, 扩展mybatis的功能。比如分页查询就是利用mybatis的插件工作原理。 15. reflection, 在jdk的基础上丰富了反射功能 16. scripting, 会处理xml文件中的,sql中的标签
image.png- session, 核心功能包。
SqlSessionFactoryBuilder构建一个个SqlSessionFactory, 然后由SqlSessionFactory实例构建一个个SqlSession实例。最后由sqlSession实例跟关系型数据库进行交互。 18. transaction, 关系型数据库事务管理。一般使用过程中都是交给spring进行事务管理的。
image.png事务操作。提交。回滚。 19. type
image.png在跟关系型数据库交互的时候,参数设置,是怎样把java type转换为jdbc type 当执行完成sql后,拿到关系型数据库的结果集的时候,又是怎样把jdbc type转换为java type
小结
- 通过阅读mybatis源码,理解其工作过程后,通过记录加深自己对mybaits的熟悉和理解。
- 通过上面记录的功能模块,就能够把mybatis的工作过程进行串联起来。
- 能够理解工作过程即可,出现问题,能够理解到究竟在哪个具体的环节出现问题,辅助快速解决问题。