[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);

}

运行结果显示:

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

相关推荐
五行星辰5 分钟前
用 Java 发送 HTML 内容并带附件的电子邮件
java·html
DaphneOdera179 分钟前
Git Bash 配置 zsh
开发语言·git·bash
Code侠客行16 分钟前
Scala语言的编程范式
开发语言·后端·golang
yqcoder18 分钟前
NPM 包管理问题汇总
前端·npm·node.js
程序菜鸟营25 分钟前
nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)
前端·npm·node.js
BestandW1shEs26 分钟前
快速入门Flink
java·大数据·flink
奈葵33 分钟前
Spring Boot/MVC
java·数据库·spring boot
lozhyf36 分钟前
Go语言-学习一
开发语言·学习·golang
bsr198336 分钟前
前端路由的hash模式和history模式
前端·history·hash·路由模式
小小小小关同学40 分钟前
【JVM】垃圾收集器详解
java·jvm·算法