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

[JAVA]MyBatis框架—获取SqlSession对象

SqlSessionFactory作为MyBatis框架的核心接口有三大特性

SqlSessionFactory是MyBatis的核心对象

用于初始化MyBatis,创建SqlSession对象

保证SqlSessionFactory在应用中全局唯一


1.SqlSessionFactory是MyBatis的核心对象

假设我们要查询数据库的用户信息,在MyBatis框架中,首先需要通过SqlSessionFactory创建SqlSession,然后才能使用SqlSession获取对应的Mapper接口,进而执行查询操作

在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xml,本章我们要学习创建SqlSessionFactory读取mybatis.config.xml配置信息(数据库驱动,连接URL,用户名和密码)来建立与数据库的连接基础。它是创建SqlSession对象的工厂,而SqlSession对象是与数据库进行实际交互的关键,是用于执行SQL语句,管理事务以及获取映射器(Mapper)的核心接口

如果没有SqlSessionFactory,就无法获取SqlSession,也就不能执行诸如查询,插入,更新和删除等数据库操作

 前一章MyBatis的配置文件mybatis-config.xml配置内容为:

0bc27116664742d2aca0aa70a57c57ab.png

2.用于初始化MyBatis,创建SqlSession对象

我们在IDEA中用代码演示如何创建SqlSession对象,首先我们要打开pom.xml文件,为了测试的方便引入单元测试组件junit,junit是Java中单元测试框架通过单元测试可以了解我们程序的运行情况

 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>

在引用以后,我们打开test下java这个目录,新建包名为com.test.mybatis,test这个包保存的就是我们一个个的单元测试类

8d758f1e5e7741f889d47e4efd79759d.png

在这个包下,再创建一个名为MyBatisTestor单元测试类

04213a5c6ccf40d68d0aa2b6c49cdad2.png

该类的代码内容创建如下: 

package com.test.mybatis;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.sql.Connection;//JUNIT单元测试类
public class MybatisTestor {@Testpublic void testSqlSessionFactory() throws IOException {//利用Reader加载classpath下的mybatis—config.xml核心配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");//初始化SqlSessionFactory对象,同时解析mybatis—config.xml文件SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);System.out.println("SessionFactory加载成功");SqlSession sqlSession = null;try{//创建SqlSession对象,SqlSession是JDBC的扩展类,用于与数据库交互sqlSession = sqlSessionFactory.openSession();//创建数据库连接(测试用)Connection connection = sqlSession.getConnection();System.out.println(connection);}catch(Exception e){e.printStackTrace();}finally{//如果sqlSession不等于null,则代表创建成功if(sqlSession !=null){//如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中//如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关 闭连接sqlSession.close();}
}
}

 代码语句功能实现解析 

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

 这行语句主要实现以字符流的方式进行读取,读取mybatis-config.xml文件的代码 

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

而这段语句则是利用构造者模式SqlSessionFactoryBuilder初始化SqlSessionFactory对象,通过构造者模式的.build方法将reader对象传入,它就会通过reader对象解析和读取MyBatis的核心配置文件(mybatis-config.xml),并且返回对应的sqlSessionFactory对象 

然后需要我们利用sqlSessionFactory.openSession根据mybatis-config.xml描述的配置信息得到SqlSession对象,用于与数据库交互,SqlSession对象我们把它形象的看作是一个底层的数据库连接,在Mybatis中,利用SqlSession对数据表进行增删改查操作

//openSession()方法是SqlSessionFactory提供的用于创建SqlSession方法
SqlSession sqlSession = sqlSessionFactory.openSession();

当我们进行数据库操作的时候,我们可以利用SqlSession提供的一系列方法来完成交互, 引用.getConnection来得到数据库连接对象,之后将connection对象打印出来,演示创建数据库连接的过程,在正常开发时是由Mybatis自动帮我们完成的,我们并不需要用到这行代码,这里为了方便大家理解只做演示使用

Connection connection = sqlSession.getConnection();
System.out.println(connection);

运行得到结果

f7e079c1c18b4f75b59cf4c31002c1e5.png

数据库连接已经能够正常创建,说明我们mybatis.config.xml所描述的信息是正确的

对于数据库来说,有创建连接数据库就要有关闭数据库的操作,目前我们实现了数据库连接,那么如何对数据库进行关闭呢?我们对下面这组代码进行try-catch异常检查并实现关闭数据库操作代码

SqlSession sqlSession = null;
try{//创建SqlSession对象,SqlSession是JDBC的扩展类,用于与数据库交互sqlSession = sqlSessionFactory.openSession();//创建数据库连接(测试用)Connection connection = sqlSession.getConnection();System.out.println(connection);}catch(Exception e){e.printStackTrace();}finally{//如果sqlSession不等于null,则代表创建成功if(sqlSession !=null){//如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中//如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接sqlSession.close();}
}

3.保证SqlSessionFactory在应用中全局唯一

为什么要保证SqlSessionFactory在应用中全局唯一呢?

资源消耗:SqlSessionFactory 在创建过程中需要读取和解析 MyBatis 的配置文件(mybatis - config.xml),配置文件包含了数据库连接信息、缓存配置、映射文件位置等内容。解析这些配置文件相对复杂和消耗资源,如果频繁地创建 SqlSessionFactory 实例,就会多次重复这个解析过程,这会导致不必要的性能开销。

如何保证SqlSessionFactory全局唯一

——这里需要依赖Java中的一些开发技巧和特性,利用MyBatisUtils工具类

MyBatisUtils 是一个自定义的工具类,主要用于简化在 MyBatis 框架下与数据库交互过程中的一些常见操作。它的核心目的是提供方便的方法来获取和管理 MyBatis 中的关键对象,如 SqlSessionFactory 和 SqlSession,从而让开发人员能更高效地进行数据库访问操作。

我们通过程序代码的方式来演示如何创建初始化工具类MyBatisUtils

在上述编写MyBatisTestor代码中,我们初始化了SqlSessionFactory对象

在我们平时开发中如果按照上述创建方法,每一次创建SqlSession都要重复编写这段代码,就造成了一系列不必要的资源浪费,为了保证全局唯一,我们就需要创建MyBatisUtils工具类,下面我们用代码来实现如何创建

新建类 名为MyBatisUtils 类的内容如下:

//将SqlSessionFactory全局对象初始化为null,
private static SqlSessionFactory sqlSessionFactory=null;

添加静态块 并用try-catch对其捕捉

static{Reader reader = null;try{Reader reader = Resources.getResourceAsReader("mybatis-coonfig.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);}catch(IOException e)e.printStrackTrace();//用try—catch包裹后,将类的初始化过程中产生的异常抛出去throw new ExceptionInInitializerError(e);}
}   /***openSession 创建一个新的SqlSession对象*@return SqlSession对象*/public static SqlSession openSession(){return sqlSessionFactory.openSession();
}   /***关闭一个有效的SqlSession对象*@param session 准备关闭SqlSession对象*/public static void closeSession(SqlSession session){if(Session  !=null){session.close();}
}

1.Reader reader = Resources.getResourceAsReader("mybatis-coonfig.xml");

使用MyBatis框架提供的Resources类的getResourceAsReader方法,根据指定的文件名,从类路径下找到对应的文件,并将其转换为一个Reader对象,方便后续能够以字符流的形式读取配置文件的内容

2.sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

利用build对象构建sqlSessionFactory对象,build需要传入read字符类的输入流
再增加一段方法演示MyBatisUtils工具类如何实现

public void testMyBatisUtils(){//调用MyBatisUtils,得到SqlSession对象SqlSession sqlSession = MyBatisUtils.openSession();//调用getConnection得到对应的数据库连接Connection connection = sqlSession.getConnection();//将其打印出来System.out.println(connection);//调用closeSession对sqlSession对象进行释放MyBatisUtils.closeSession(sqlSession);}

运行结果显示:

说明得到了一个有效的数据库连接

相关文章:

[JAVA]MyBatis框架—获取SqlSession对象

SqlSessionFactory作为MyBatis框架的核心接口有三大特性 SqlSessionFactory是MyBatis的核心对象 用于初始化MyBatis&#xff0c;创建SqlSession对象 保证SqlSessionFactory在应用中全局唯一 1.SqlSessionFactory是MyBatis的核心对象 假设我们要查询数据库的用户信息&#x…...

Perl 简介

Perl 简介 Perl 是一种高级、通用、解释型、动态编程语言。由 Larry Wall 于 1987 年首次发布&#xff0c;它结合了 C、sed、awk 和 shell 脚本语言的特性。Perl 最初被设计用于文本处理&#xff0c;如报告生成和文件转换&#xff0c;但随着时间的推移&#xff0c;它已经发展成…...

spring-bean的销毁流程

1 引入 在 Spring 框架中&#xff0c;Bean 的生命周期管理是其核心功能之一&#xff0c;而 Bean 的注销&#xff08;Destruction&#xff09;是生命周期的最后一步。无论是关闭数据库连接、释放线程资源&#xff0c;还是执行缓存持久化操作&#xff0c;合适的销毁策略都至关重…...

问:Spring MVC DispatcherServlet流程步骤梳理

DispatcherServlet是Spring MVC框架中的核心组件&#xff0c;负责接收客户端请求并将其分发到相应的控制器进行处理。作为前端控制器&#xff08;Front Controller&#xff09;的实现&#xff0c;DispatcherServlet在整个请求处理流程中扮演着至关重要的角色。本文将探讨Dispat…...

用源码编译虚幻引擎,并打包到安卓平台

用源码编译虚幻引擎&#xff0c;并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目&#xff0c;简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定&#xff0c;然后加入 Epic 邀请的组织&#xff0c…...

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…...

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分&#xff0c;涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则&#xff0c;帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…...

在Vue中使用Excalidraw实现在线画板

概述 Excalidraw是一个非常好用的画图板工具&#xff0c;但是是用React写的&#xff0c;本文分享一种在Vue项目中使用的方法。 效果 实现 Excalidraw简介 这篇文章(Excalidraw 完美的绘图工具&#xff1a;https://zhuanlan.zhihu.com/p/684940131)介绍的很全面&#xff0c;…...

游戏+AI的发展历程,AI技术在游戏行业的应用有哪些?

人工智能&#xff08;AI&#xff09;与游戏的结合&#xff0c;不仅是技术进步的体现&#xff0c;更是人类智慧的延伸。从最初的简单规则到如今的复杂决策系统&#xff0c;AI在游戏领域的发展历史可谓波澜壮阔。 早在2001年&#xff0c;就有研究指出游戏人工智能领域&#xff0…...

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…...

2023AE软件、Adobe After Effects安装步骤分享教程

2023AE软件是一款由Adobe公司开发的视频编辑软件&#xff0c;也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用&#xff0c;用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式&#xff0c;具有丰富的插件和预设&#…...

【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;场景一&#xff1a;直接赋值与重新引用为什么结果不是 [3, 4, 5]&#xff1f;1. 引用与赋值的基本概念2. 图示分析 关键总结 &#x1f4af;场景二&#xff1a;引用指向的变化为什么…...

本地项目运行提示跨域问题

项目背景&#xff1a;我使用phpwebstudy在本地搭建了一个项目&#xff0c;然后前端是http://localhost:8080/ 后端我直接创建了一个本地域名&#xff0c;例如www.abc.com 然后vue.config.js配置如下&#xff0c;这个配置在我所有线上环境是没有任何问题的 devServer: {proxy…...

C++ —— string类(上)

目录 string的介绍 string类功能的使用介绍 constructor —— 构造 介绍使用&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;4&#xff09; &#xff1a;构造、拷贝构造、带参构造 介绍&#xff08;3&#xff09;&#xff1a;拷贝string类对象的一部分字符…...

React Native Mac 环境搭建

下载 Mac 版Android Studio 下载 安装 JDK 环境 Flutter 项目实战-环境变量配置一 安装 Node.js 方式一 通过Node.js 官网下载 下载完成后点击安装包进行安装 安装完成...

Python Web 开发的路径管理艺术:FastAPI 项目中的最佳实践与问题解析20241119

Python Web 开发的路径管理艺术&#xff1a;FastAPI 项目中的最佳实践与问题解析 引言&#xff1a;从路径错误到模块化管理的技术旅程 在现代 Python Web 开发中&#xff0c;路径管理是一个常常被忽视却非常重要的问题。尤其是在使用像 FastAPI 和 Tortoise ORM 这样的框架时…...

Rust derive macro(Rust #[derive])Rust派生宏

参考文章&#xff1a;附录 D&#xff1a;派生特征 trait 文章目录 Rust 中的派生宏 #[derive]基础使用示例&#xff1a;派生 Debug 派生其他常用特征示例&#xff1a;派生 Clone 和 Copy 派生宏的限制和自定义派生自定义派生宏上面代码运行时报错了&#xff0c;以下是解释 结论…...

springboot嗨玩旅游网站

摘 要 嗨玩旅游网站是一个专为旅行爱好者打造的在线平台。我们提供丰富多样的旅游目的地信息&#xff0c;包括景点信息、旅游线路、商品信息、社区信息、活动推广等&#xff0c;帮助用户轻松规划行程。嗨玩旅游网站致力于为用户提供便捷、实用的旅行服务&#xff0c;让每一次旅…...

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制&#xff0c;根据这个表格留下足够空间即可 比如需要4096字节的eep空间&#xff0c;可以把RAM的地址改成E000&#xff0c;即E000-EFFF&#xff0c;共4096bytes即可。...

从零开始的c++之旅——map_set的使用

1.序列式容器和关联式容器 序列式容器&#xff1a;逻辑结构为线性序列的数据结构&#xff0c;两个位置之间没有紧密的关系&#xff0c;比如两者交换一下还是序列式的容器&#xff0c;例如string&#xff0c;vector&#xff0c;deque&#xff0c;array等。 关联式容器&#xff1…...

Docker中的一些常用命令

find / -type f -name “文件名” 2>/dev/null 寻找所有目录中的这个文件 pwd 查看当前目录的地址 docker pull 镜像名 强制拉镜像 docker run 运行docker systemctl daemon-reload 关闭docker systemctl start docker 启动docker systemctl restart docker 重启docker /…...

自存 sql常见语句和实际应用

关于连表 查询两个表 SELECT * FROM study_article JOIN study_article_review 查询的就是两个表相乘&#xff0c;结果为两个表的笛卡尔积 相这样 这种并不是我们想要的结果 通常会添加一些查询条件 SELECT * FROM study_articleJOIN study_article_review ON study_art…...

python | argparse模块在命令行的使用中的重要作用

import argparseclass TestCases:def __init__(self, nameNone, expect_resultNone):self.name nameself.expect expect_resultself.parser argparse.ArgumentParser() # 创建命令解析器self.add_arguments() # 方法 &#xff1a; 添加命令self.args, _ self.parser.par…...

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得&#xff0c;实验需求为&#xff1a; 1.R5作为ISP&#xff1a;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c;出口公网地址需要通过PPP协议获取&#xff0c;并进行CHAP认证。&#xff08;PS&#xff1a;因PPP协议尚未学习&#…...

PW系列工控电脑复制机:效率与精度双重提升

工控电脑复制应用&#xff1a;效率与精度的双重提升 随着现代企业对大数据、数据备份、和跨平台兼容性需求的快速增长&#xff0c;工控电脑已成为数据密集型产业的核心设备。针对工控环境中大量数据复制的特殊需求&#xff0c;PW系列NVMe/SATA PCIe SSD复制机&#xff08;如PW…...

学习QT第二天

QT6示例运行 运行一个Widgets程序运行一个QT Quick示例 工作太忙了&#xff0c;难得抽空学点东西。-_-||| 博客中有错误的地方&#xff0c;请各位道友及时指正&#xff0c;感谢&#xff01; 运行一个Widgets程序 在QT Creator的欢迎界面中&#xff0c;点击左侧的示例&#xf…...

11.20作业

题目一&#xff1a; 题目&#xff1a; // 数组的行列转置 代码&#xff1a; // 数组的行列转置 #include <stdio.h> int main() {int a[2][3], i, j, b[3][2];printf("输入一个两行三列的数组a:\n");for (i 0; i < 2; i)for (j 0; j < 3; j){scanf…...

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要&#xff0c;可以通过以下步骤来实现使用 root 登录&#xff1a; 1、设置 root 密码 打开终端&#xff0c;使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…...

DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别

在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;标准中&#xff0c;VR&#xff08;Value Representation&#xff09; 表示数据元素的值的类型和格式。理解显式 VR&#xff08;Explicit VR&#xff09;与隐式 VR&#xff08;Implicit VR&#…...

做网站前台用什么软件/百度文库登录入口

第1关:柱状图 - 商品房销售价格统计图 本关任务:请编写代码绘制办公楼商品房平均销售价格柱状图。 # 请编写代码绘制住宅商品房平均销售价格柱状图import matplotlib matplotlib.use("Agg")# 请在此添加实现代码 # # ********** Begin *********# import matpl…...

搜索建站/百度手机端排名如何优化

首先声明&#xff0c;本文借鉴自&#xff1a;http://blog.csdn.net/u011314529/article/details/51505029 所以&#xff0c;可参考链接的博文。但原文有个瑕疵就是&#xff0c;cublas.lib错写成了cudlas.lib。 其次&#xff0c;我还是记下我的CUDA8.0的安装和测试过程&#xff…...

什么软件能把做的网站上传/关键词搜索挖掘爱网站

新京报讯(记者 阎侠)3月13日&#xff0c;深交所对宝莱特下发关注函。事起于3月11日&#xff0c;宝莱特在深交所互动易平台表示&#xff0c;公司陆续接到来自疫情国家的订单&#xff0c;其中意大利一个订单就超过1000台高端监护仪。近期&#xff0c;宝莱特股价涨幅较大。因此&am…...

ps做 网站教程/优化大师官方免费

实现两个N*N矩阵的乘法&#xff0c;矩阵由一维数组表示 代码如下&#xff1a; //实现两个N*N矩阵的乘法&#xff0c;矩阵由一维数组表示。 #include<iostream> using namespace std;#define size 2int *multi(int *a, int *b, int N){int i, j, k, temp;int *c (int *)…...

cdn接入wordpress出错/百度推广和优化哪个好

控制台报错 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is 意思是 cors阻止了你请求的资源&#xff08;跨域问题&#xff09;&#xff1b; 解决方法: spring项目中加入配置&#xff1a; 详细代码&#xff1a; package com.ruoyi.framewo…...

网站移动页面怎么做的/seo点击器

当前版本中加入的公会战是公会间的攻城战玩法&#xff0c;以公会为参与单位。每周周二、周六21&#xff1a;00—22&#xff1a;00开启。在游戏主界面点击【公会】&#xff0c;然后点击【领地】页签&#xff0c;选择可进入的防守或进攻战场。【宣战规则】1、领地分为三层&#x…...