Mybatis之SqlSessionFactory详解

大家好,我是升仔

引言

在Mybatis中,SqlSessionFactory 是一个极其核心的组件,它负责创建 SqlSession,后者是进行数据库操作的主要接口。本文将深入探讨 SqlSessionFactory 的原理和应用。

SqlSessionFactory 概述

SqlSessionFactory 是Mybatis的一个接口,它的实现类负责创建 SqlSession 的实例。在Mybatis配置文件中定义了数据源(DataSource)、事务管理器(TransactionManager)等信息,这些信息被用来创建 SqlSessionFactory

创建SqlSessionFactory

创建 SqlSessionFactory 的一般步骤是:

  1. 读取Mybatis配置文件
    使用 Resources 工具类读取Mybatis配置文件。
  2. 构建SqlSessionFactoryBuilder
    创建 SqlSessionFactoryBuilder 实例。
  3. 创建SqlSessionFactory
    通过 SqlSessionFactoryBuilder 读取配置信息创建 SqlSessionFactory
示例代码
复制代码
javaCopy codeString resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

在这段代码中,首先读取Mybatis的配置文件,然后通过 SqlSessionFactoryBuilder 创建出 SqlSessionFactory 的实例。

SqlSessionFactory的源码分析

SqlSessionFactoryBuilderbuild() 方法中进行了核心的处理工作,它解析配置文件,创建 SqlSessionFactory 实例。

重要代码片段
复制代码
javaCopy codepublic SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
        XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
        return build(parser.parse());
    } catch (Exception e) {
        throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
        ErrorContext.instance().reset();
        try {
            reader.close();
        } catch (IOException e) {
            // 忽略关闭时的异常
        }
    }
}

在这个方法中,XMLConfigBuilder 负责解析配置文件,并将解析结果封装成 Configuration 对象,最后使用这个 Configuration 对象创建 SqlSessionFactory

实际应用场景

在实际开发中,通常会在应用初始化时创建一个 SqlSessionFactory 实例,并在整个应用中共享。

应用场景一:Spring集成Mybatis

在Spring应用中,Spring容器负责管理 SqlSessionFactory

Spring配置示例
复制代码
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>
应用场景二:Web应用

在Web应用中,可以在 ServletContextListener 中初始化 SqlSessionFactory,并存储在 ServletContext 以供全局使用。

ServletContextListener实现
复制代码
public class MyAppContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sce.getServletContext().setAttribute("SqlSessionFactory", sqlSessionFactory);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // 清理资源
    }
}
最后说一句(求关注,求赞,别白嫖)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文已收录于我的技术网站,next-java.com, 有大厂完整面经,工作技术等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注非常感激

相关推荐
小马爱打代码10 分钟前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式
柒.梧.17 小时前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
rabbit_pro20 小时前
Java使用Mybatis-Plus封装动态数据源工具类
java·python·mybatis
IT_Octopus1 天前
java 实体属性 Map 解决 mybatis-plus wrapper selectone 查mysql json类型为null 问题
java·mysql·mybatis
Dolphin_Home1 天前
MyBatis 核心属性详解笔记(由浅入深)
笔记·mybatis
一直都在5721 天前
MyBatis入门:CRUD、参数处理与防 SQL 注入
java·sql·mybatis
while(1){yan}1 天前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
memgLIFE2 天前
mybatis数据库查询
数据库·oracle·mybatis
drebander2 天前
MyBatis-Plus saveBatch 在异步线程中事务未提交问题排查与修复
数据库·mybatis
super_lzb2 天前
mybatis拦截器ResultSetHandler详解
java·spring·mybatis·springboot