MyBatis SqlSessionFactory和SqlSession

【摘要】 MyBatis SqlSessionFactory和SqlSession
一,SqlSessionFactory
Mybatis提供了构造器SqlSessionFactoryBuilder来生成SqlSessionFactory。
在 MyBatis 中,既可以通过读取配置的 XML 文件的形式生成 SqlSessionFactory,也可以通过Java代码生成 …

MyBatis SqlSessionFactory和SqlSession

一,SqlSessionFactory

Mybatis提供了构造器SqlSessionFactoryBuilder来生成SqlSessionFactory。

在 MyBatis 中,既可以通过读取配置的 XML 文件的形式生成 SqlSessionFactory,也可以通过Java代码生成 SqlSessionFactory。

推荐采用 XML 的形式,因为代码的方式在需要修改的时候会比较麻烦。

当配置了 XML 或者提供代码后,MyBatis 会读取配置文件,通过 Configuration 类对象构建整个 MyBatis 的上下文。

注意:SqlSessionFactory是一个接口,在Mybatis中它存在两个实现类:SqlSessionManager和DefaultSqlSessionFactory。

一般来说,具体是由DefaultSqlSessionFactory去实现的。而SqlSessionManager使用在多线程环境中,它的具体实现依靠DefaultSqlSessionFactory,它们之间的关系如下图所示:

在这里插入图片描述

每个基于Mybatis的应用都是基于一个SqlSessionFactory的实例为中心的,实例一旦创建,就会在整个应用过程中始终存在,而SqlSessionFactory唯一的作用就是生产Mybatis的核心接口对象SqlSession。我们往往会采用单例模式来处理SqlSessionFactory(多次创建耗时且没有必要),下面介绍两种生成SqlSessionFactory的方法。

1,使用XML构建SqlSessionFactory

Mybatis中的XML文件分为两类,一类是基础配置文件,通常只有一个,主要是配置一些最基本的上下文参数和运行环境;另一类是映射文件,它可以配置映射关系,SQL,参数等信息。

创建一份基础配置XML文件,命名为mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration> <typeAliases><!--别名--> <typeAliases alias="user" type="com.ljt.mybatis.User"/> </typeAliases> <!-- 数据库环境 --> <environments default="development"> <environment id="development"> <!-- 使用JDBC的事务管理 --> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <!-- MySQL数据库驱动 --> <property name="driver" value="com.mysql.jdbc.Driver" /> <!-- 连接数据库的URL --> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="" /> </dataSource> </environment> </environments> <!-- 将mapper文件加入到配置文件中 --> <mappers> <mapper resource="com/ljt/mybatis/mapper/UserMapper.xml" /> </mappers>
</configuration>

  
 

typeAlias元素声明了com.ljt.mybatis.User类的一个别名user,这样定以后,在Mybatis上下文中就可以使用别名去替代全类名了。

environment元素中,描述的是数据库。其中transactionManager元素是配置事务管理器,这里采用的是Mybatis的JDBC管理器方式。

dataSource元素配置数据库,起重工type = “POOLED”代表采用Mybatis内部提供的连接池方式,最后定义一些关于JDBC的属性信息。

mapper元素代表引入的映射器(xml映射文件)。

有了基础配置文件,就可以用一段很简短的Java代码来生成 SqlSessionFactory 了

SqlSessionFactory factory = null;
String resource = "mybatis-config.xml";
InputStream is;
try { InputStream is = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) { e.printStackTrace();
}

  
 

首先读取 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 的 Builder 方法去创建 SqlSessionFactory。整个过程比较简单,而里面的步骤还是比较烦琐的,只是 MyBatis 采用了 Builder 模式为开发者隐藏了这些细节。这样一个 SqlSessionFactory 就被创建出来了。

采用 XML 创建的形式,信息在配置文件中,有利于我们日后的维护和修改,避免了重新编译代码,因此推荐这种方式。

2,使用代码创建SqlSessionFactory

通过代码来实现与使用 XML 构建 SqlSessionFactory 一样的功能——创建 SqlSessionFactory,代码如下所示。

// 数据库连接池信息
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword ("");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setDefeultAutoCommit(false);
// 采用 MyBatis 的 JDBC 事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment ("development", transactionFactory, dataSource);
// 创建 Configuration 对象
Configuration configuration = new Configuration(environment);
// 注册一个 MyBatis 上下文别名
configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
// 加入一个映射器
configuration.addMapper(RoleMapper.class);
//使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory
SqlSessionFactory SqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
return SqlSessionFactory;

  
 

它和 XML 方式实现的功能是一致的,只是方式不太一样而已。但是代码冗长,如果发生系统修改,那么有可能需要重新编译代码才能继续,所以这不是一个很好的方式,一般来说,不推荐这样使用。

二,SqlSession

在Mybatis中,SqlSession是其核心接口。在Mybatis中其有两个实现类。DefaultSqlSession和SqlSessionManager。

DefaultSqlSession是单线程使用的,而SqlSessionManager在多线程环境下使用。SqlSession的作用类似于一个JDBC中Connection对象,代表着一个连接通道的启用。具体的来说,它的作用有三个:

  • 获取 Mapper 接口。
  • 发送 SQL 给数据库。
  • 控制数据库事务。

SqlSession由SqlSessionFactory来创建

SqlSession sqlSession = SqlSessionFactory.openSession();

  
 

在 MyBatis 中,SqlSession 只是一个门面接口,它有很多方法,可以直接发送 SQL,真正干活的是 Executor,我们会在底层看到它。

SqlSession 控制数据库事务的方法,如下所示:

//定义 SqlSession
SqlSession sqlSession = null;
try { // 打开 SqlSession 会话 sqlSession = SqlSessionFactory.openSession(); // 执行一些增删查改的代码 sqlSession.commit(); // 提交事务
} catch (IOException e) { sqlSession.rollback();  // 回滚事务
}finally{ // 在 finally 语句中确保资源被顺利关闭 if(sqlSession != null){ sqlSession.close(); }
}

  
 

这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。

SqlSession代表着一个数据库的连接资源,使用后要及时关闭它,所以用 finally 语句保证其顺利关闭。

文章来源: blog.csdn.net,作者:寒山月初°C,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_51372098/article/details/116798693

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享