第四篇 封装SqlSessionFactory

由于我们每写一个操作语句都要新建SqlSessionFactory,大大增加了内存的消耗,长此以往,以后项目中的sql语句越来越多的时候,就会影响性能,且代码十分冗余,这就有悖于Mybatis的初衷,因此,进行第一次优化-------封装SqlSessionFactory,将他封装成一个工具类,想使用的时候直接调用

java 复制代码
public class MybatisUtils {
    static SqlSessionFactory build=null;
    public static SqlSession createSqlSession(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        if (build==null){
            SqlSession sqlSession = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            build= sqlSessionFactoryBuilder.build(inputStream);
        }
        SqlSession sqlSession = build.openSession(true);
        return sqlSession;
    }
}

但是,这只是解决了代码的冗余并没有减少他的创建次数,依旧是有多少条语句就创建多少个sqlsession对象,还是很浪费资源,这时就可以联想到前面说过的static关键字以及单例模式,无论创建多少个对象,在底层依然还是同一个,现在进行第二次改进:

java 复制代码
public class MybatisUtils {
    static SqlSessionFactory sqlSessionFactory;

    //静态代码块:给静态成员变量赋值,加载类执行,只执行一次
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public static SqlSession createSqlSession() {
        try {
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            return sqlSession;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
相关推荐
二哈赛车手8 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~9 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8299 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
星星也在雾里9 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
未若君雅裁10 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记11 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI11 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202411 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有11 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql