[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配置内容为:

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这个包保存的就是我们一个个的单元测试类

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

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

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 {
    @Test
    public 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);

运行得到结果

数据库连接已经能够正常创建,说明我们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);

}

运行结果显示:

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

相关推荐
Wh1teR0se14 分钟前
[极客大挑战 2019]Secret File--详细解析
前端·web安全·网络安全
ZhaiMou1 小时前
HTML5拖拽API学习 托拽排序和可托拽课程表
前端·javascript·学习·html5
·云扬·2 小时前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
求积分不加C2 小时前
Spring Boot中使用AOP和反射机制设计一个的幂等注解(两种持久化模式),简单易懂教程
java·spring boot·后端
枫叶_v3 小时前
【SpringBoot】26 实体映射工具(MapStruct)
java·spring boot·后端
东方巴黎~Sunsiny3 小时前
java-图算法
java·开发语言·算法
2401_857617624 小时前
汽车资讯新趋势:Spring Boot技术解读
java·spring boot·后端
code_shenbing4 小时前
跨平台WPF框架Avalonia教程 三
前端·microsoft·ui·c#·wpf·跨平台·界面设计
小林学习编程4 小时前
从零开始理解Spring Security的认证与授权
java·后端·spring
写bug的羊羊4 小时前
Spring Boot整合Nacos启动时 Failed to rename context [nacos] as [xxx]
java·spring boot·后端