掌握MyBatis的核心对象
一、获取SqlSessionFactoryBuilder对象
1、SqlSessionFactoryBuilder的作用
所有的MyBatis应用都是以SqlSessionFactory实例为中心。SqlSessionFactoryBuilder就是SqlSessionFactory的构造者,通过build()方法负责构建SqlSessionFactory。

通过源码分析,可以发现都是在调用同一个签名方法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配置文件构造方式和编程构造方式。我们以读取XML配置文件的方式来构造SqlSessionFactory。
2、SqlSessionFactoryBuilder的生命周期和作用域
SqlSessionFactoryBuilder的最大特点是用过即丢。一旦创建了SqlSessionFactory对象,这个类就不需要存在了,因此SqlSessionFactoryBuilder的最佳作用范围就是存在于方法体内,也就是局部变量。
二、获取SqlSessionFactory对象
1、SqlSessionFactory的作用
SqlSessionFactory就是创建SqlSession实例的工厂。通过SqlSessionFactory提供的openSession()方法来获取SqlSession实例。

openSession()方法的参数为boolean值时,若传入true表示关闭事务控制,自动提交;若传入false表示开启事务控制。若不传入参数,默认为true。
2、SqlSessionFactory的生命周期和作用域
SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建SqlSessionFactory。因此SqlSessionFactory的最佳作用域是Application,即随着应用的生命周期一同存在。那么这种“存在于整个应用运行期间,并且同时只存在一个对象实例”的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。
获取SqlSessionFactory,最简单的方式就是放在静态代码块下,以保证SqlSessionFactory对象只被创建一次,如下
package edu.cn.dao.util; 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 java.io.IOException;
import java.io.InputStream; public class MyBatisUtil {
private static SqlSessionFactory factory; static {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
} public static SqlSession createSqlSession(){
return factory.openSession(false);
} public static void closeSqlSession(SqlSession sqlSession){
if (null != sqlSession){
sqlSession.close();
}
}
}
三、获取SqlSession对象
1、SqlSession的作用
SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection。它提供了面向数据库执行SQL命令所需的所有方法,可以通过SqlSession实例直接运行已映射的SQL语句。

2、SqlSession的声明周期和作用域
SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此SqlSession的生命周期也不是永久的。相反,在每次访问数据库时都需要创建它(并不是说在SqlSession里只能执行一次SQL,它是完全可以执行多次的,但是若关闭了SqlSession,那么就需要重新创建它)。另外,关闭SqlSession是非常重要的,必须确保SqlSession在finally语句块中正常关闭。
每个线程都有自己的SqlSession实例,SqlSession实例不能被共享,也不是线程安全的。因此最佳的作用域范围是request作用域或者方法体作用域。
3、SqlSession的两种使用方式
(1)通过SqlSession实例来直接执行已映射的SQL语句
<select id="getUserList" resultType="edu.cn.pojo.User">
select * from smbms_user
</select>
package edu.cn.dao; import edu.cn.dao.util.MyBatisUtil;
import edu.cn.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.ArrayList;
import java.util.List; import static org.junit.Assert.*; public class UserMapperTest {
private static final Logger logger = LoggerFactory.getLogger(UserMapperTest.class); @Test
public void testGetUserList(){
SqlSession sqlSession = null;
List<User> userList = new ArrayList<>();
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserList");
} catch (Exception e){
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user:userList){
logger.debug("testGetUserList userCode:" + user.getUserCode()
+ " and userName:" + user.getUserName());
}
} }
(2)基于mapper接口方式操作数据
创建绑定映射语句的接口,并提供接口方法,该接口称为映射器
public interface UserMapper {
public List<User> getUserList();
}
修改测试类中的关键语句如下
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserList();
}
第一种方式是旧版本的MyBatis提供的操作方式,现在也可以正常工作;第二种方式是Mybatis官方推荐使用的,其表达方式也更加直白,代码更加清晰,类型更加安全,也不用担心易错的字符串字面值以及强类型转。
掌握MyBatis的核心对象的更多相关文章
- mybatis的核心对象图解
- Mybatis的基本要素--核心对象
大家好啊,今天呢来说下Mybatis的核心对象,也就是说基本三要素. >核心接口和类. >Mybatis核心配置文件(mybatis-config.xml) >SQL映射文件 一.下 ...
- 【MyBatis系列5】MyBatis4大核心对象SqlSessionFactoryBuiler,SqlSessionFactory,SqlSession,Mapper
前言 前几篇篇我们简单讲解了MyBatis的简单用法,以及一对一和一对多以及多对多的相关动态sql查询标签的使用,也提到了嵌套查询引发了N+1问题,以及延迟加载相关功能,本篇文章将会从MyBatis底 ...
- MyBatis的核心配置、动态sql、关联映射(快速总结)
MyBatis的核心对象和配置 #1. SqlSessionFactory对象: 单个数据库映射关系经过编译的内存镜像: 作用:创建SQLSession对象. //读取配置文件 InputSteam ...
- Mybatis的核心配置
之前了解了Mybatis的基本用法,现在学习一下Mybatis框架中的核心对象以及映射文件和配置文件,来深入的了解这个框架. 1.Mybatis的核心对象 使用MyBatis框架时,主要涉及两个核心对 ...
- mybatis的两个核心对象SqlSessionFactory和SqlSession对象
mybatis的两个核心对象SqlSessionFactory和SqlSession对象 参见:https://www.cnblogs.com/wxdestiny/p/9743686.html
- MyBatis核心对象之StatementHandler
MyBatis核心对象之StatementHandler StatementHandler ResultHandler ParameterHandler Executor org.apache.iba ...
- MyBatis核心对象
MyBatis 有三个基本要素: 核心接口和类 MyBatis核心配置文件(mybatis-config.xml) SQL映射文件(mapper.xml) 下面首先介绍 MyBatis 的核心接口和类 ...
- 掌握Mybatis的核心配置文件
一.配置文件结构 MyBatis的核心配置文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性. 该配置文件的元素 ...
随机推荐
- Qbxt 模拟题 day2(am) T2 jian
[问题描述] 有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[L,R]中则你比较厉害.求你比较厉害的概率. [输入格式] 第一行有三个数N, l, r,含义如上描述. 接下来一行有N个数代 ...
- 138企业邮箱pop/imap和smtp服务器地址
如果客户端设置的是pop模式:接收邮件服务器(pop):pop.138mail.net ,端口号是110 (如果勾选了SSL,端口号则变为995)发送邮件服务器(smtp):smtp.138mail. ...
- 分布式锁与实现--基于ZooKeeper实现
引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- LeetCode 145. 二叉树的后序遍历(Binary Tree Postorder Traversal)
题目描述 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 后 ...
- thinkpad T480安装WIN7
本文转载自http://www.dnxtc.net/zixun/zhuangjijiaocheng/2018-12-01/3256.html 防止忘记 特别把资源集中一下 新买的笔记本预装的WIN10 ...
- fmri格式相关简介————转自网络
转自莫毕业 目前,脑成像数据主要有DTI.fmri.3D三种模态.这些数据在分析前都要进行格式转换,不同公司的扫描仪存储格式也不尽相同.脑成像处理软件也很多,不同软件使用的格式也不一样,所以数据转换是 ...
- [svc]linux中的文件描述符(file descriptor)和文件
linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...
- nginx的root 指令
好长时间都没搞清nginx的root路径: location /img/ { alias /var/www/image/; } #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动 ...
- 五十二:WTForms表单验证之基本使用
作用:1.做表单验证,把用户提交的数据验证是否合法2.做模板渲染 安装:pip install wtforms 表单验证1.自定义一个表单类,继承wtforms.Form2.定义好需要验证的字段,字段 ...
- SQLSERVER去除某一列的重复值并显示所有数据\DISTINCT去重\ISNULL()求SUM()\NOT EXISTS的使用
进入正题,准备我们的测试数据 1.我们要筛选的数据为去除 GX 列的重复项 并将所有数据展示出来,如图所示: ' 2.这种情况下我们是不可以使用DISTINCT来去重的,我们可以来尝试一下: 首先,单 ...