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 是线程不安全的,必须每次请求 / 业务操作时新建,用完及时关闭
  • 静态代码块的特性保证了工厂只会被创建一次,且在类加载时完成初始化
相关推荐
bksczm3 天前
Redis 持久化:RDB 快照与 AOF 日志
数据库·redis·mybatis
CoderYanger4 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CoderYanger7 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
真上帝的左手9 天前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
雪芽蓝域zzs9 天前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
wljt10 天前
公司二-面试题
java·开发语言·mybatis
VimorphTech10 天前
文本已经改了,旧的音频生成结果还能回写吗?
java·数据库·mybatis
麻瓜code10 天前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
郭小李11 天前
mybatis 动态 sql
java·sql·mybatis
知守观11 天前
技术考古:iBATIS 2.3.4 时代的持久层,是如何用 Map 玩转 307 个存储过程的?
java·后端·mybatis