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中单元测试框架通过单元测试可以了解我们程序的运行情况
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
在引用以后,我们打开test下java这个目录,新建包名为com.test.mybatis,test这个包保存的就是我们一个个的单元测试类
在这个包下,再创建一个名为MyBatisTestor单元测试类
该类的代码内容创建如下:
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);
运行得到结果
数据库连接已经能够正常创建,说明我们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);}
运行结果显示:
说明得到了一个有效的数据库连接