【Mybatis】| 如何创建MyBatis的工具类

news2025/1/24 10:49:50

目录

  • 🌟更多专栏请点击👇
  • 一、前言
  • 二、实现过程
    • 1. 创建一个ThreadLocal对象
    • 2. 初始化SqlSessionFactory
    • 3. 获取并存储sqlSession对象
    • 4. 关闭sqlSession对象
  • 三、 总代码

🌟更多专栏请点击👇

专栏名字
🔥Elasticsearch专栏es
🔥spring专栏spring开发
redis专栏redis学习笔记
🔥项目专栏项目集锦
修bug专栏bug修理厂

一、前言

使用MyBatis框架在持久层操作中,如果多个DML操作都属于一个事务,因为commit()和rollback()都是SqlSession完成的,所以必须保证只使用一个SqlSession,但是不同的DML操作可能在不同类的不同方法中,每个方法都需要获取SqlSession,所以应该如何在多个DML操作中保证使用同一个SqlSession呢?
在这里插入图片描述

二、实现过程

1. 创建一个ThreadLocal对象

下面给大家带来了一个工具类:ThreadLocal,它可以储存SqlSession对象,并且保证一个线程只使用一个SqlSession。现在来学习一下如何创建MyBatis这个工具类

首先需要new一个ThreadLocal对象,以便存储SqlSession:

 private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();

2. 初始化SqlSessionFactory

在一个静态代码块中初始化SqlSessionFactory:

 static {
        //创建SqlSessionFactory
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-cfg.xml");

        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

    }

3. 获取并存储sqlSession对象

接下来就是从ThreadLocal中获取sqlSession对象,并且使用ThreadLocal存储该对象:

tips:存储SqlSession的时候要判断该对象是否为空,要是为空就要获取一个,然后再存到ThreadLocal,返回一个SqlSession。

//获取SqlSession
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get(); 
        
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();     
            threadLocal.set(sqlSession);                        
        }

        return sqlSession;
    }

4. 关闭sqlSession对象

接下来也可以在该工具类写关闭sqlSession方法

  //关闭sqlSession
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if (sqlSession != null){           
            sqlSession.close();
            threadLocal.set(null);
        }
    }

三、 总代码

public class MyBatisUtils {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
    private static SqlSessionFactory    sqlSessionFactory = null;
    static {
        //创建SqlSessionFactory
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-cfg.xml");

        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

    }
    //获取SqlSession
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get();        
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();       
            threadLocal.set(sqlSession);                       
        }
        return sqlSession;
    }

    //关闭sqlSession
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if (sqlSession != null){            
            sqlSession.close();
            threadLocal.set(null);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

向2022年度商界木兰上榜女性致敬!

目录 信息来源&#xff1a; 2022年度商界木兰名单 简介 评选标准 动态 榜单 为你心中的2023商界女神投上一票 信息来源&#xff1a; 2022年度商界木兰榜公布 华为孟晚舟获商界木兰最高分 - 脉脉 【最具影响力女性】历届商界木兰榜单 中国最具影响力的30位商界女性名单…

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

本文是专栏《手把手带你做一套毕业设计毕业设计》的实战第一篇&#xff0c;将从Vue脚手架安装开始&#xff0c;逐步带你搭建起一套管理系统所需的架构。当然&#xff0c;在默认安装完成之后&#xff0c;会对文件目录进行初步的细化拆分&#xff0c;以便后续功能迭代和维护所用。…

经典100道mysql的面试题

100道mysql的面试题 目录100道mysql的面试题1. MySQL 索引使用有哪些注意事项呢&#xff1f;索引哪些情况会失效索引不适合哪些场景索引的一些潜规则2. MySQL 遇到过死锁问题吗&#xff0c;你是如何解决的&#xff1f;3. 日常工作中你是怎么优化SQL的&#xff1f;4. 说说分库与…

字体反爬慢慢总结破解方式

什么是字体反爬 网页开发者自己创造一种字体&#xff0c;因为在字体中每个汉字都有其代号&#xff0c;那么以后再网页中不会直接显示这个文字的效果。而是显示其代号&#xff0c;因此即使获取了网页的文本内容。也只是获取到文字的代号&#xff0c;而不是文字本身。 简单来说&…

逻辑优化基础-shannon decomposition

1. 简介 在逻辑综合中&#xff0c;香农分解&#xff08;Shannon decomposition&#xff09;是一种常用的布尔函数分解方法。它将一个布尔函数分解为两个子函数的和&#xff0c;其中每个子函数包含一个布尔变量的取反和非取反的部分。 具体来说&#xff0c;假设对于一个布尔函…

Mysql 索引特点

承接上文Mysql Server原理简介聚簇索引、二级索引、联合索引分别具备什么样的特点&#xff1f;聚簇索引数据跟索引放在一起的叫聚簇索引&#xff1b;数据和索引分开存储的叫非聚簇索引&#xff1b;innodb存储引擎&#xff0c;数据和文件都放在ibd文件中&#xff0c;实际的数据是…

在教学中常被问到的几个vue3.x与typescript的问题,统一解答

在教学当中&#xff0c;学生在学习vue3.x时&#xff0c;常常会问到typescript和vue3.x之间的关系&#xff0c;感觉这两个技术总是绑在一起的&#xff0c;下面老赵来统一解答一下&#xff1a; 那学vue3.x&#xff0c;为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…

「ML 实践篇」机器学习项目落地

文章目录1. 项目分析1. 框架问题2. 性能指标2. 获取数据1. 准备工作区2. 下载数据3. 查看数据4. 创建测试集3. 数据探索1. 地理位置可视化2. 寻找相关性3. 组合属性4. 数据准备1. 数据清理2. Scikit-Learn 的设计3. 处理文本、分类属性4. 自定义转换器5. 特征缩放6. 流水线5. 选…

Linux入门介绍及Linux文件与目录结构

前言 本文小新为大家带来 Linux 入门介绍及Linux 文件与目录结构 相关知识&#xff0c;具体内容包括Linux入门介绍&#xff08;包括&#xff1a;Linux概述&#xff0c;Linux与Windows区别&#xff0c;CentOS 下载地址&#xff09;&#xff0c;Linux文件与目录结构等进行详尽介绍…

实验7 图像水印

本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯&#xff08;MATLAB版&#xff09;&#xff0c;仅作个人学习笔记使用&#xff0c;禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 数字图像水印技术2. 可见水印的嵌入3. 不可见脆弱水印4. 不可见鲁棒水印一、…

自指(Self-reference)

文章目录1. 在逻辑、数学和计算方面2. 在生物学中3. 在艺术4. 在语言中5. 在流行文化中6. 在法律中自我参照&#xff08;Self-reference&#xff09;是一个涉及指代自己或自己的属性、特征或行为的概念。它可以发生在语言、逻辑、数学、哲学和其他领域。 在自然语言或形式语言…

JVM调优面试题——垃圾回收专题

文章目录1、如何确定一个对象是垃圾&#xff1f;1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗&#xff1f;3、都有哪些垃圾收集算法&#xff1f;3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…

车载技术【USB接口】—Android配件协议AOA【AOA连接】

简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能&#xff0c;为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式&#xff0c;并给出了USB配件…

Linux操作系统安装——服务控制

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

yocto 如何添加python module

yocto 如何添加python module 最近在使用阿里云的图像识别SDK&#xff0c;在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了&#xff0c;于是打算将SDK移植到嵌入式板子上面&#xff0c;然后在板子上跑一下demo。但是发现…

AcWing数据结构 - 数据结构在算法比赛中的应用(下)

目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路&#xff1a; 设 idx索引用于构建树&#xff0c; 结点son[节点位置][节点分支指针]&#xff0c;cnt[]记录单…

TypeScript深度剖析: typescript 的数据类型有哪些?

一、是什么 typescript 和 javascript几乎一样&#xff0c;拥有相同的数据类型&#xff0c;另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段&#xff0c;可以为明确的变量定义为某种类型&#xff0c;这样typescript就能在编译阶段进行类型检查&#xff0c;…

06-Oracle表空间与用户管理

本讲主要内容&#xff1a; 1.表空间管理&#xff1a;表空间的作用&#xff0c;创建&#xff0c;修改&#xff0c;删除及管理&#xff1b; 2.用户管理&#xff1a;创建用户&#xff0c;修改用户&#xff0c;删除用户&#xff0c;修改密码&#xff0c;解锁&#xff1b; 3.用户…

【LeetCode】13. 罗马数字转整数

题目链接&#xff1a;https://leetcode.cn/problems/roman-to-integer/ &#x1f4d5;题目要求&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即…

微电影广告发展的痛点

微电影广告以不可阻挡之势进入大众生活中&#xff0c;企业利用微电影广告来进行企业形象塑造的例子比比皆是。于是乎&#xff0c;微电影广告在为企业塑造品牌形象方面上取得了可喜的效果&#xff0c;但也不可忽视&#xff0c;在这个发展过程中&#xff0c;微电影广告所面临的问…