javaweb--10

一、原始代码与问题分析

原始获取 SqlSessionFactory 代码

java

运行

复制代码
// 2.1 获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

存在的两个核心问题

  1. 代码重复:每次获取工厂都要写这三段代码,冗余且难维护
  2. 工厂重复创建SqlSessionFactory 是重量级对象,每次创建都要解析 XML 配置、构建环境,频繁创建会严重影响性能

二、优化方案:MyBatis 工具类

通过静态代码块 + 工具类,实现工厂的单例创建与全局复用:

java

运行

复制代码
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtils {
    // 1. 静态变量,保存唯一的SqlSessionFactory实例
    private static SqlSessionFactory sqlSessionFactory;

    // 2. 静态代码块:类加载时执行,仅执行一次
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException("MyBatis配置文件加载失败", e);
        }
    }

    // 3. 对外提供获取SqlSession的方法
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

    // 重载方法,支持自动提交事务
    public static SqlSession getSqlSession(boolean autoCommit) {
        return sqlSessionFactory.openSession(autoCommit);
    }
}

三、优化后的使用方式

java

运行

复制代码
// 业务代码中直接调用工具类获取SqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
sqlSession.close();

四、优化的核心优势

表格

优化点 说明
代码复用 所有业务代码统一调用工具类,无需重复编写工厂创建逻辑
性能提升 SqlSessionFactory 仅在类加载时创建一次,避免重复解析配置文件
异常统一处理 配置文件加载异常在工具类中统一抛出,业务代码无需重复处理
简化调用 直接通过工具类获取 SqlSession,代码更简洁

补充说明

  • SqlSessionFactory 本身是线程安全的,因此可以全局单例复用
  • SqlSession 是线程不安全的,必须每次请求 / 业务操作时新建,用完及时关闭
  • 静态代码块的特性保证了工厂只会被创建一次,且在类加载时完成初始化
相关推荐
MaCa .BaKa2 小时前
52-考研备考服务平台系统-考研系统
java·spring boot·mysql·考研·tomcat·maven·mybatis
计算机学姐2 小时前
基于SpringBoot的社区服务平台
java·spring boot·后端·spring·信息可视化·tomcat·mybatis
不恋水的雨19 小时前
mybatis-plus保存数据实现公共字段自动填充
mybatis
MegaDataFlowers19 小时前
基于EasyCode插件的SpringBoot和Mybatis框架快速整合以及PostMan的使用
spring boot·mybatis·postman
qingwufeiyang_5301 天前
Mybatis-plus学习笔记1
笔记·学习·mybatis
毅炼1 天前
MyBatis 常见问题总结
java·数据库·sql·mybatis
消失的旧时光-19431 天前
Spring Boot 实战(四):MySQL + MyBatis 接入,打通用户注册最小闭环
spring boot·mysql·mybatis
行走的搬运工3 天前
Spring Security_05
java·spring·mybatis
无级程序员3 天前
Mybatis中保证时间戳的一致性
mybatis