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

embedded/2024/11/21 21:03:35/

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中单元测试框架通过单元测试可以了解我们程序的运行情况

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

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

8d758f1e5e7741f889d47e4efd79759d.png

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

04213a5c6ccf40d68d0aa2b6c49cdad2.png

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

java">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();}
}
}

 代码语句功能实现解析 

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

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

java">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对数据表进行增删改查操作

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

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

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

运行得到结果

f7e079c1c18b4f75b59cf4c31002c1e5.png

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

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

java">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 类的内容如下:

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

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

java">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工具类如何实现

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

运行结果显示:

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


http://www.ppmy.cn/embedded/139429.html

相关文章

PHP Date 函数:日期和时间处理的全指南

PHP Date 函数:日期和时间处理的全指南 PHP Date 函数是 PHP 编程语言中用于处理日期和时间的核心函数之一。它提供了强大的功能,允许开发者轻松地格式化、计算和操作日期和时间值。本文将详细介绍 PHP Date 函数的用法,包括基本格式化、时间戳处理、时区设置以及一些高级特…

Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好

目的 为了将ubuntu服务器IP固定, 方便ssh连接人在服务器前使用图形化界面设置 设置 找到自己的网卡名称, 我的是 eno1, 并进入设置界面 查看当前的IP, 网关, 掩码和DNS (注意对应eno1) nmcli dev show掩码可以通过以下命令查看完整的 (注意对应eno1) , 我这里是255.255.255.…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

【Node.js】深入理解 V8 JavaScript 引擎

V8 是 Google 开发的高性能 JavaScript 和 WebAssembly 引擎&#xff0c;是 Node.js 和 Google Chrome 的核心组件之一。它的强大性能和高效设计&#xff0c;使其成为现代 JavaScript 应用的基石。在本文中&#xff0c;我们将全面解析 V8 引擎的架构、运行原理及其在 Node.js 中…

删除了mysql的binlog日志导致服务无法启动怎么办

假如我们不小心把mysql的binlog文件删除了&#xff0c;mysql启不来了&#xff0c;怎么办&#xff0c;不要惊慌&#xff0c;我们可以查看MySQL日志&#xff0c;日志提示./mysql-bin.0000xx文件找不到&#xff0c;我们可以在当前目录下找到mysql-bin.index这个文件&#xff0c;编…

Spring视图解析(ViewResolver)

在 Spring MVC 框架中&#xff0c;视图解析&#xff08;ViewResolver&#xff09;是一个重要的组件&#xff0c;负责将逻辑视图名称解析为具体的视图技术&#xff08;如 JSP、Thymeleaf、Freemarker 等&#xff09;。视图解析器使得控制器可以返回一个逻辑视图名称&#xff0c;…

2024-11-16----Android 11(全志H713)-----拉高LED灯

需求 屏背光亮起来的时候&#xff0c;LED灯 黄灯灭 绿灯亮 找到屏操作背光的驱动文件&#xff1a; longan/brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/fastlogo/fastlogo.c写下操作LED灯的方法&#xff0c;在合适的地方调用 #define setbit(x,y) x|(1<<y) …

1+X应急响应(网络)威胁情报分析:

威胁情报分析&#xff1a; 背景-网络安全事件&#xff1a; 高级威胁一直持续&#xff1a; 现状与问题-面临的挑战&#xff1a; 威胁情报在安全建设中的定位&#xff1a; 引入威胁情报的必要性&#xff1a; 政策驱动-新等保已实施&#xff1a; 威胁情报的概念&#xff1a; 威胁…