SqlSessionFactoryBuilder是MyBatis中用于一次性构建SqlSessionFactory的工具类,仅负责读取配置并生成工厂实例,不可复用;必须确保配置文件位于classpath下(如src/main/resources),build()自动关闭输入流,SqlSessionFactory应全局唯一且线程安全。

MyBatis 中构建 SqlSessionFactory 的核心入口就是 SqlSessionFactoryBuilder,它只负责“一次性”读取配置、解析并生成工厂实例。关键不是怎么写那两行代码,而是理解它的职责边界和正确用法。
配置文件必须放在 classpath 下
MyBatis 默认通过 Resources.getResourceAsStream("mybatis-config.xml") 加载配置,这个方法依赖类路径(classpath)查找资源。常见位置是 src/main/resources/mybatis-config.xml。如果放错位置(比如放在 src/main/java 下又没加到 classpath),就会抛出 IOException: Could not find resource。
- 确保 XML 文件在编译后出现在
classes/目录下 - 文件名不强制叫
mybatis-config.xml,但路径字符串要完全匹配 - 支持相对路径,如
"config/mybatis.xml",前提是该路径也在 classpath 中
构建过程就两步:获取流 + 调用 build()
标准写法简洁明确:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这里要注意:
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
立即学习“Java免费学习笔记(深入)”;
-
SqlSessionFactoryBuilder是无状态的临时对象,每次 new 都没问题,用完即弃 -
build()内部会自动关闭输入流,无需手动close() - 不要把
SqlSessionFactoryBuilder缓存成成员变量或单例——它不是设计来复用的
必须保证 SqlSessionFactory 全局唯一
SqlSessionFactory 是线程安全的,整个应用只需一个实例。反复调用 new SqlSessionFactoryBuilder().build(...) 会创建多个独立工厂,浪费资源且可能导致配置不一致。
- 手动管理时,用
static final字段 + 双重检查锁或静态内部类实现懒加载单例 - Spring 环境下直接声明
@Bean,由容器托管生命周期 - 绝对避免在 DAO 方法里每次 new Builder、每次 build
构建失败常见原因
如果 build() 抛异常,多数不是代码写错了,而是配置环节出了问题:
-
<environments>中未指定default,或环境名与build()第二个参数不匹配 -
<mappers>引入的 Mapper XML 文件路径错误,或对应接口类未被扫描到 - XML 语法错误(比如标签未闭合)、属性名拼错(如把
driver写成dirver) - 数据库驱动 JAR 包缺失,导致
Environment初始化失败
不复杂但容易忽略:SqlSessionFactoryBuilder 就是一次性工具,重点不在它怎么用,而在于你是否只用它一次,以及用完之后是否让 SqlSessionFactory 真正稳稳地活在整个应用生命周期里。

















