前言
从上一篇文章mybatis源码阅读系列(二),我们大概可以了解到mybatis执行SQL用到的三个重要是的对象实例,包括:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,下面让我们深入了解下每个对象内部的实现。
XMLConfigBuilder(xml解析器)
从上面图片可以看到实例化XMLConfigBuilder后,就调用了parse方法去解析xml的文件。
1 public Configuration parse() {
2 // 限定每个 XMLConfigBuilder 只能使用一次。
3 // 一旦XMLConfigBuilder用于构建配置,就不应再用于解析另一个配置文件或重新构建配置。
4 if (parsed) {
5 throw new BuilderException("Each XMLConfigBuilder can only be used once.");
6 }
7 parsed = true;
8 // 从根节点configuration节点开始解析
9 parseConfiguration(parser.evalNode("/configuration"));
10 // 最终返回会话的配置信息
11 return configuration;
12 }
1 private void parseConfiguration(XNode root) {
2 try {
3 // 解析节点properties,把定义的常量设置到配置文件里面,
4 // 例如:用户名,密码,驱动,数据库连接
5 propertiesElement(root.evalNode("properties"));
6 // 解析settings节点,把key-value封装成对象实例Properties
7 Properties settings = settingsAsProperties(root.evalNode("settings"));
8 // 加载自定义虚拟文件系统vfs,mybatis有两个默认实现,也可以自己实现
9 loadCustomVfs(settings);
10 // 加载自定义日志
11 loadCustomLogImpl(settings);
12 // 自定义类的别名
13 typeAliasesElement(root.evalNode("typeAliases"));
14 // 加载自定义插件
15 pluginElement(root.evalNode("plugins"));
16 // 自定义对象工厂,创建对象
17 objectFactoryElement(root.evalNode("objectFactory"));
18 // 自定义对家加工工厂
19 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
20 // 自定义反射工厂
21 reflectorFactoryElement(root.evalNode("reflectorFactory"));
22 // 加载默认配置参数
23 settingsElement(settings);
24 // 加载数据源和事务管理器
25 environmentsElement(root.evalNode("environments"));
26 // 加载数据库厂商标识,主要用于实现数据库兼容性
27 databaseIdProviderElement(root.evalNode("databaseIdProvider"));
28 // 加载类型处理器
29 typeHandlerElement(root.evalNode("typeHandlers"));
30 // 加载映射处理器
31 mapperElement(root.evalNode("mappers"));
32 } catch (Exception e) {
33 throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
34 }
35 }
执行处理器
当开启会话时,默认走的是简单类型的执行器
SqlSession sqlSession = sqlSessionFactory.openSession()
从上面可以看出执行器分为三种:
SIMPLE:这是默认的执行器类型。它简单地对每个语句进行操作,每次执行 SQL 语句时,都会打开和关闭一个新的事务。如果调用者没有开启事务,那么这个执行器会自动管理事务。对于简单的操作,这是最合适的执行器。REUSE:这个执行器重用预处理语句(PreparedStatement)。在相同的 SQL 语句和参数下,它会重用预处理语句,从而减少数据库的准备语句开销。这对于频繁执行相同 SQL 语句的场景很有用。BATCH:批量执行器会将多个 SQL 语句打包在一起执行。这对于执行大量插入、更新和删除操作时非常有效,因为它减少了数据库的往返次数,提高了性能。使用批量执行器时,你需要手动提交或回滚事务。