MyBatis基本要素——核心对象及其生命周期


MyBatis的三个基本要素:
·核心接口和类
·MyBatis核心配置文件(mybatis-config.xml)
·SQL映射文件(mapper.xml)

MyBatis的核心接口和类

在这里插入图片描述

  1. 每个MyBatis的应用程序都以SqlSessionFactory对象的实例为核心。
  2. 首先获取SqlSessionFactoryBuilder对象,可以根据XML配置文件或Configuration类的实例构建该对象。
  3. 然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。
  4. 有了SqlSessionFactory对象之后,就可以进而获取SqlSession实例,SqlSession对象中完全包含以数据库为背景的所有执行SQL操作的方法。可以用该实例来直接执行已映射的SQL语句。

SqlSessionFactoryBuilder

1、SqlSessionFactoryBuilder的作用
SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供了多个build()方法的重载。
在这里插入图片描述
通过源码分析,可以发现都是在调用同一签名方法:

build(InputStream inputStream, String environment, Properties properties)

由于方法参数environment和properties都可以为null,那么去除重复的,真正的重载方法只有如下三种:

① build(Reader reader, String environment, Properties properties)
② build(InputStream inputStream, String environment, Properties properties)
③ build(Configuration config)

通过上述分析,发现配置信息可以以三种形式提供给SqlSessionFactoryBuilder的build()方法,分别是InputStream(字节流)、Reader(字符流)、Configuration (类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个SqlSessionFactory有两种方法:读取XML配置文件构造方法和编程构造方式。

2、SqlSessionFactoryBuilder的生命周期和作用域
SqlSessionFactoryBuilder 的最大特点是:用过即丢。 一旦创建了SqlSessionFactory 对象之后,这个类就不再需要存在啦,因此SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。


SqlSessionFactory (存在于整个应用程序中,并只有一个实例—单例)

1、SqlSessionFactory的作用

SqlSessionFactory 简单地理解就是创建SqlSession 实例的工厂。所有的MyBatis 应用都是以 SqlSessionFactory 实例为中心,SqlSessionFactory 的实例可以通过SqlSessionFactory 对象来获得。
顾名思义,可以通过SqlSessionFactory 提供的 openSession() 方法来获取SqlSession 实例。
!! ! openSession()方法的参数为boolean值时,若传入true表示关闭事务控制,自动提交;false表示开启事务控制。若不传入参数,默认为true。

openSession()方法

默认没有加参数的openSession()方法:
1、 会开启一个事务(也就是不自动提交)
2、 连接对象从配置文件的数据源中拿到
3、 事务隔离级别会使用数据源默认的配置
4、 预处理语句不会被复用,也不会批量更新

openSession(boolean autoCommit)设置为true 会生成一个自动提交事务事务
SqlSession openSession(Connection connection)提供自定义的连接对象
openSession(TransactionIsolationLevel level) 设置事务的隔离级别
openSession(ExecutorType execType)设置执行器
- - SIMPLE,为每一个语句执行创建一个新的预处理语句
- - REUSE,执行器会复用预处理语句
- - BATCH,执行器会批量执行所有的更新语句


2、SqlSessionFactory的生命周期和作用域

SqlSessionFactory对象一旦创建,就会在整个应用程序运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建SqlSessionFactory。因此SqlSessionFactory 的最佳作用域是Application,即随着应用的生命周期一同存在。

把获取SqlSessionFactory的代码进行优化,最简单的实现方式就是放在静态代码块下,以保证SqlSessionFactory对象只被创建一次,实现如下:

创建工具类MyBatisUtils.java ,在静态代码块中创建SqlSessionFactory对象。

package com.xyj.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtils {
	
	
	private static SqlSessionFactory sessionFacory;
	
	static {//在静态块下,SqlSessionFactory只被创建一次
		try {
			//加载Mybatis配置文件
			InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
			//创建SqlSessionFactory对象
			sessionFacory=new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//获取SqlSession对象
	public static SqlSession getSqlSession() {
		return sessionFacory.openSession();
	}
	
	//关闭SqlSession对象
	public static void closeSqlSession(SqlSession sqlSession) {
		if(sqlSession!=null) {
			sqlSession.close();
		}
	}
	
}



SqlSession

1、SqlSession的作用
SqlSession是用来执行持久化操作的对象,类似于JDBC中的Connection。它提供了面向数据库执行SQL命令所需的所有方法。可以通过SqlSession实例直接运行已映射的SQL语句。

2、SqlSession的生命周期的作用域
正如其名,SqlSession对应着一次数据库会话。由于数据库会话不是永久的,因此SqlSession的生命周期也不应该是永久的。 相反,在每次访问数据库时都需要创建它(注意:并不是说在SqlSession里执行一次SQL语句,是完全可以执行多次的,但是若关闭了SqlSession,那么久需要重新创建它)。

需要注意的是:每个线程都有自己的SqlSession实例,SqlSession实例不能被共享,也不是线程安全的,因此最佳的作用域范围是request作用域或者方法体作用域内。
关闭SqlSession是非常重要的。必须要确保SqlSession在finally语句块中正常关闭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值