7. MyBatis中的SqlSession是什么?如何管理SqlSession的生命周期?

ops/2024/9/19 19:33:38/ 标签: 数据库, mybatis

SqlSession 是 MyBatis 的核心接口之一,用于执行与数据库的交互操作。它提供了执行 SQL 语句的所有方法,包括插入、更新、删除和查询,还可以管理事务、获取映射器(Mapper)接口的实例等。

SqlSession 的主要功能包括:

  1. 执行SQL操作:如 insertupdatedeleteselect 等方法,用于执行对应的 SQL 语句。

  2. 事务管理:通过 commit()rollback() 方法进行事务的提交与回滚。

  3. 获取Mapper:通过 getMapper(Class<T> type) 方法获取映射器接口的实例,从而使用接口调用来执行 SQL。

  4. 缓存管理SqlSession 还负责管理一级缓存,它会自动缓存相同会话中的查询结果,减少对数据库的访问。

如何管理SqlSession的生命周期?

SqlSession 不是线程安全的,它的生命周期应由使用者自己管理。正确地管理 SqlSession 的生命周期对于避免资源泄漏和确保应用程序的可靠性至关重要。以下是管理 SqlSession 生命周期的常用方法:

1. 手动管理 SqlSession

当你在没有使用 Spring 的场景下,可以手动管理 SqlSession 的生命周期。通常,在执行数据库操作时,手动打开 SqlSession,执行操作后立即关闭它。

示例代码

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
​
public class MyBatisExample {
​private SqlSessionFactory sqlSessionFactory;
​public MyBatisExample(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}
​public void performDatabaseOperation() {SqlSession session = null;try {session = sqlSessionFactory.openSession(); // 打开 SqlSessionUserMapper mapper = session.getMapper(UserMapper.class); // 获取 MapperUser user = mapper.selectUserById(1); // 执行 SQL 查询System.out.println(user);
​session.commit(); // 提交事务} catch (Exception e) {if (session != null) {session.rollback(); // 发生异常时回滚事务}e.printStackTrace();} finally {if (session != null) {session.close(); // 关闭 SqlSession}}}
}

在这个例子中:

  • openSession() 方法用于打开一个 SqlSession

  • 在 try 块中执行数据库操作并调用 commit() 提交事务。

  • 如果发生异常,在 catch 块中调用 rollback() 回滚事务。

  • 最后在 finally 块中确保 SqlSession 被关闭,以释放资源。

2. 使用 Spring 管理 SqlSession 的生命周期

在 Spring 环境中,通常不需要手动管理 SqlSession 的生命周期。Spring 整合 MyBatis 后,通过 SqlSessionTemplate 来管理 SqlSession 的生命周期,开发者只需关注业务逻辑,Spring 会自动管理事务和资源的关闭。

使用 Spring 的 MyBatis 整合

  1. 配置 SqlSessionFactorySqlSessionTemplate

    在 Spring 的配置类或 XML 中配置 SqlSessionFactorySqlSessionTemplate

    @Configuration
    @MapperScan("com.example.mapper")
    public class MyBatisConfig {
    ​@Beanpublic DataSource dataSource() {// 配置数据源}
    ​@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean.getObject();}
    ​@Beanpublic SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
    }

  2. 在 Mapper 接口中使用

    在 Spring 中使用 MyBatis 时,只需定义 Mapper 接口,无需显式管理 SqlSession

    @Repository
    public interface UserMapper {User selectUserById(int id);
    }

    然后在服务类中自动注入 Mapper 接口,直接调用方法执行数据库操作:

    @Service
    public class UserService {
    ​@Autowiredprivate UserMapper userMapper;
    ​public User getUserById(int id) {return userMapper.selectUserById(id);}
    }

    在这种模式下,SqlSession 的生命周期完全由 Spring 管理,SqlSessionTemplate 会自动打开和关闭 SqlSession,并管理事务。

3. 正确的事务管理

  • 手动管理事务:在手动管理 SqlSession 时,事务控制需要通过 commit()rollback() 来完成。

  • Spring 管理事务:通过 Spring 配置事务管理器,使用 @Transactional 注解来管理事务,无需显式调用 commit()rollback(),Spring 会在方法成功执行后自动提交事务,或在发生异常时自动回滚事务。

4. 避免 SqlSession 泄漏

无论是在手动管理还是使用 Spring 管理 SqlSession,都要确保 SqlSession 在使用后能够正确关闭,以避免数据库连接泄漏。对于手动管理的情况,使用 try-finally 结构确保关闭 SqlSession。对于 Spring 管理的情况,依赖 Spring 自动处理。

总结

  • SqlSession 是 MyBatis 与数据库交互的核心接口,提供了执行 SQL 语句、事务管理和获取 Mapper 的功能。

  • 手动管理 SqlSession,必须在使用后及时关闭,以避免资源泄漏。使用 try-finally 结构是推荐的方式。

  • 在 Spring 环境中,通常通过 SqlSessionTemplate 来管理 SqlSession,开发者不需要手动处理 SqlSession 的打开和关闭,Spring 会自动管理事务和资源。

  • 正确的事务管理 是确保数据一致性和避免资源泄漏的关键,在手动管理和 Spring 管理模式下有不同的实现方式。


http://www.ppmy.cn/ops/109856.html

相关文章

ssm——整合,前端页面设计,分页

empMapper.updateEmpById(m); } //用于批量的插入数据 Test public void insertDeptByBATCH() { DeptMapper OCMsqlSession.getMapper(DeptMapper.class); for(int i0;i<10;i) { String idUUID.randomUUID().toString().substring(0, 5); OCM.insertByDept(new Dept…

牛客思维题———进制(简单)

C-小红的双好数&#xff08;easy&#xff09;_牛客周赛 Round 57 (nowcoder.com) 思路&#xff1a; 任何一个数n可以表示为n进制&#xff0c;且值为1 特判1 2 即可 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std;#define IOS i…

Vue 3 + Element Plus 封装单列控制编辑的可编辑表格组件

在Web应用开发中&#xff0c;经常需要提供表格数据的编辑功能。本文将介绍如何使用Vue 3结合Element Plus库来实现一个支持单列控制编辑功能的表格&#xff0c;并通过封装组件的形式提高代码的复用性。通过本教程&#xff0c;你将学会如何构建一个具备单列控制编辑功能的表格组…

MySQL 日期函数语法介绍和案例示范以及常见问题解决

本文将以电商交易系统为例&#xff0c;详细讲解 MySQL 日期类型及其转化&#xff0c;常用的日期函数&#xff0c;以及一些解决常见问题的方案。 一、MySQL 日期数据类型 MySQL 提供了多种日期数据类型&#xff0c;适用于不同的使用场景。常见的日期类型包括 DATE、DATETIME、…

深兰科技董事长陈海波出席《中马建交五十周年高级别经贸合作》

2024年9月3日&#xff0c;中马建交50周年高级别经贸合作交流会暨马来西亚第九任首相VIP欢迎晚宴在北京隆重举行&#xff0c;深兰科技创始人、董事长陈海波先生应邀出席。 会议期间&#xff0c;双方举行了品牌出海合作签约仪式。在马来西亚首相雅各布先生的见证下&#xff0c;深…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系&#xff0c;笔者用一个结构化的思维导图来概括其主要组成部分。见下&#xff1a; 这个思维导图旨在提供一个全面而系统的视角&#xff0c;帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入&#xff0c;可以根据个人兴趣和职业需求&#x…

软件架构风格

五大架构风格 1、数据流风格 子风格包括&#xff1a;批处理风格、管道-过滤器风格 2、调用/返回风格 子风格包括&#xff1a;主程序/子程序风格、面向对象风格、分层架构风格 3、独立构件风格 子风格包括&#xff1a;进程通信风格、事件驱动系统&#xff08;隐式调用&…

【Shiro】Shiro 的学习教程(一)之快速入门

目录 1、Shiro 简介2、Shiro 认证、授权2.1、认证2.2、授权 3、快速入门4、自定义 Realm5、加密6、实现授权 1、Shiro 简介 Shiro 官网&#xff1a;https://shiro.apache.org/ Shiro 是一个功能强大且易于使用的 Java 安全框架&#xff0c;它执行身份验证、授权、加密和会话管…

Leetcode面试经典150题-55.跳跃游戏

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean canJump(int[] nums) {/**如果就一个位置&#xff0c;你本来就在这&#xff0c;肯定可以跳到*/if(nums.length 1) {return true;}/**这个题的解题思路是遍历数组&#xff0c;如果当前位置不在之…

【自用】计算机网络湖科大教书匠笔记 第一章 概述

文章目录 因特网概述三种交换方式&#xff1a;电路交换、分组交换和报文交换计网的定义及分类计网的性能指标计算机网络体系结构 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范…

SpringBoot 读取配置文件的4种方式

文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中&#xff0c;application.yml 文件用于配置应用程序的属性&#xff0c;Spring Boot 默认会从 src/…

MyBatis 源码解析:BatchExecutor 与 SimpleExecutor 详解

摘要 在 MyBatis 中&#xff0c;Executor 是执行 SQL 语句的核心组件。SimpleExecutor 和 BatchExecutor 是 Executor 的两种重要实现方式&#xff1a;前者负责简单的 SQL 执行&#xff0c;后者支持批量 SQL 执行。本文将通过自定义实现 BatchExecutor 和 SimpleExecutor&…

如何将Windows风格的剪切和粘贴添加到Mac访达中

你可以在Mac上剪切和粘贴,但此功能在访达中的行为不同。这可能会让新手感到不适,甚至可能会让铁杆Mac用户感到困扰。幸运的是,有一个小的免费应用程序可以“修复”这种不一致。 使用Command X剪切文件和文件夹 Command X是一款免费应用程序,它为Mac上的文件和文件夹添加了…

启动spring boot项目时,第三方jar包扫描不到的问题

讲述一下遇到的问题&#xff1a; 在启动类Application上使用ComponentScan 这个注解来扫描第三方的包&#xff0c;然后就会出现报错。异常就是无法加载本地的bean&#xff0c;但是可以加载到第三方的bean&#xff1b; 了解过spring boot启动流程的都知道&#xff0c;Springboo…

实操搭建battery-historian平台

1 在D盘新建一个文件夹&#xff1a;gosrc 2git clone https://github.com/google/battery-historian.git 3 cd 到D:\gosrc\battery-historian>go mod init gosrc初始化模块名为gosrc&#xff0c;你可以自定义自己的名字 4// 执行该命令&#xff0c;更换为国内代理地址 go en…

外观模式facade

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/facade 为程序库、 框架或其他复杂类提供一个简单的接口 把要做的事全放在一个类里给他做了&#xff0c;然后要用的时候直接创建这个类的实例

享元模式flyweight

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/flyweight 通过共享多个对象所共有的相同状态&#xff0c; 让你能在有限的内存容量中载入更多对象。享元会将不同对象的相同数据进行缓存以节省内存。 factory里面treeType共用了

前端算法(持续更新)

1、最大的钻石 1楼到n楼的每层电梯口都放着一个钻石&#xff0c;钻石大小不一。你从电梯1楼到n楼&#xff0c;每层楼电梯门都会打开一次&#xff0c;只能拿一次钻石&#xff0c;问怎样才能最大的钻石&#xff1f; 解题思路&#xff1a; 这是一个经典的动态规划问题&#xff…

策略模式的小记

策略模式 策略模式支付系统【场景再现】硬编码完成不同的支付策略使用策略模式&#xff0c;对比不同&#xff08;1&#xff09;支付策略接口&#xff08;2&#xff09;具体的支付策略类&#xff08;3&#xff09;上下文&#xff08;4&#xff09;客户端&#xff08;5&#xff0…

高效物流管理从固乔快递批量查询助手开始

固乔快递批量查询助手&#xff1a;物流管理的智能化升级 固乔快递查询助手&#xff1a;批量追踪&#xff0c;物流无忧 轻松应对海量单号&#xff0c;固乔快递批量查询助手来帮忙 跨境电商新利器&#xff1a;固乔快递批量查询助手 高效物流管理从固乔快递批量查询助手开始 …