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