当前位置: 首页 > news >正文

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

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

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

相关文章:

  • 【Java 设计模式】行为型之解释器模式
  • DAY35:贪心算法part4、860\406\452
  • 【Docker】docker安装jenkins
  • python数据生成excel文件实现
  • uniapp中mescroll的使用
  • 医院如何筛选安全合规的内外网文件交换系统?
  • uniapp如何添加多个表单数组?
  • iPhone 14支持NFC吗?如果支持,那么怎么启用
  • 华为radius认证
  • Qt 信号与槽
  • 时序数据库 Tdengine 执行命令能够查看执行的sql语句
  • Matlab plot绘图的 title 语法
  • 前端怎么监听手机键盘是否弹起
  • QGIS编译(跨平台编译)之二十七:giflib编译(Windows、Linux、MacOS环境下编译)
  • 高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • java 多线程基础, 我觉得还是有必要看看的
  • Linux中的硬链接与软链接
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • oldjun 检测网站的经验
  • Promise面试题2实现异步串行执行
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • ucore操作系统实验笔记 - 重新理解中断
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue总结
  • 闭包--闭包之tab栏切换(四)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 构建二叉树进行数值数组的去重及优化
  • 前言-如何学习区块链
  • 如何借助 NoSQL 提高 JPA 应用性能
  • Linux权限管理(week1_day5)--技术流ken
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​第20课 在Android Native开发中加入新的C++类
  • #include到底该写在哪
  • #QT(一种朴素的计算器实现方法)
  • #单片机(TB6600驱动42步进电机)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计大学生兼职系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (接口封装)
  • (十)c52学习之旅-定时器实验
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)linux文件内容查看
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)http协议
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。