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, 有大厂完整面经,工作技术等经验分享

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

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

相关推荐
椰椰椰耶7 小时前
【MyBatis】XML实现,配置方法和增、删、改、查
xml·oracle·mybatis
GJCTYU10 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
DuelCode21 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
荔枝吻1 天前
【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
java·intellij-idea·mybatis
JAVA学习通1 天前
Mybatis--动态SQL
sql·tomcat·mybatis
新world1 天前
mybatis-plus从入门到入土(二):单元测试
单元测试·log4j·mybatis
RainbowSea1 天前
问题 1:MyBatis-plus-3.5.9 的分页功能修复
java·spring boot·mybatis
JAVA学习通2 天前
Mybatis----留言板
mybatis
双力臂4042 天前
MyBatis动态SQL进阶:复杂查询与性能优化实战
java·sql·性能优化·mybatis
慕y2742 天前
Java学习第十五部分——MyBatis
java·学习·mybatis