MyBatis的核心组件
一、常用对象
MyBatis 中的常用对象有 SqlSessionFactiry 和 SqlSession。
- SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成 SqlSessionFactory,采用的是分步构建的 Builder 模式。
- SqlSessionFactory(工厂接口):依靠它来生成 SqlSession,使用的是工厂模式。
- SqlSession(会话):一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是 MyBatis 提供的 SQL Mapper 接口编程技术,它能提高代码的可读性和可维护性。
- SQL Mapper(映射器):MyBatis 新设计存在的组件,它由一个 Java 接口和 XML 文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果。
二、SqlSessionFactory 对象
SqlSessionFactory 是 MyBatis 的关键对象。它是单个数据库映射关系经过编译后的内存镜像。
SqlSessionFactory 对象的实例可通过 SqlSessionFactoryBuilder 通过读取配置的XML文件或一个预先定制的Configuration 的实例构建。
每一个Mybatis 的应用程序都以一个SqlSessionFactory 对象的实例为核心,其也是线程安全的。
生命周期: SqlSessionFactory 一旦被创建,应该再应用程序执行期间都存在。在应用程序运行期间不要重复创建多次,建议使用单例模式。
SqlSessionFactory 是创建 SqlSession 的工厂。其常用方法如下:
- SqlSession openSession(); 创建 SqlSession 对象。
2.1 SqlSessionFactory 的创建方式
使用 MyBatis 首先是使用配置或者代码去生产 SqlSessionFactory,而 MyBatis 提供了构造器 SqlSessionFactoryBuilder。
它提供了一个类 org.apache.ibatis.session.Configuration 作为引导,采用的是 Builder 模式。
在 MyBatis 中,既可以通过读取配置的 XML 文件的形式生成 SqlSessionFactory,也可以通过 Java 代码的形式去生成 SqlSessionFactory。
SqlSessionFactory 是一个接口,在MyBatis 中它存在两个实现类:SqlSessionManager 和 DefaultSqlSessionFactory。一般而言,具体是由 DefaultSqlSessionFactory 去实现的,而 SqlSessionManager 使用在多线程的环境中。
-
使用 XML 构建 SqlSessionFactory
首先,在 MyBatis 中的 XML 分为两类,一类是基础配置文件,通常只有一个,主要是配置一些最基本的上下文参数和运行环境;另一类是映射文件,它可以配置映射关系、SQL、参数等信息。先看一份简易的基础配置文件,我们把它命名为 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.zhang.pojo.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/ssm?characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!-- 将mapper文件加入到配置文件中 --> <mappers> <mapper resource="com/zhang/mapper/UserMapper.xml" /> </mappers> </configuration>
有了基础配置文件,就可以用一段很简短的代码来生成 SqlSessionFactory 了,如下所示。
SqlSessionFactory factory = null; String resource = "mybatis-config.xml"; try { InputStream inputStream = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); }
采用 XML 创建的形式,信息在配置文件中,有利于我们日后的维护和修改,避免了重新编译代码。
三、SqlSession 对象
SqlSession 是MyBatis 的关键对象,是执行持久操作的对象,类似于JDBC 中的 Connection。它是应用程序与持久存储层之间执行交互操作的一个 单线程对象。
SqlSession 实例可以直接执行已映射的SQL语句。
每个线程都应该拥有它自己的 SqlSession 实例,SqlSession 的实例不能被共享,也是线程不安全的。
使用完 SqlSession 之后关闭 Session 很重要,应该确保使用finally快来关闭它。
SqlSession 常用方法如下:
方法名 | 方法描述 |
---|---|
int insert(String statement) | 插入方法,参数 statement 是在配置文件中定义的< insert/>元素的 id,返回执行SQL语句所影响的行数 |
int insert(String statement,Object parameter) | 插入方法,参数 statement 是在配置文件中定义的< insert/>元素的 id,paraneter 是插入所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数 |
int update(String statement) | 更新方法,参数 statement 是在配置文件中定义的< update/>元素的 id,返回执行SQL语句所影响的行数 |
int update(String statement,Object parameter) | 更新方法,参数 statement 是在配置文件中定义的< update/>元素的 id,paraneter 是更新所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数 |
int delete(String statement) | 删除方法,参数 statement 是在配置文件中定义的< delete/>元素的 id,返回执行SQL语句所影响的行数 |
int delete(String statement,Object parameter) | 删除方法,参数 statement 是在配置文件中定义的< delete/>元素的 id,paraneter 是删除所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数 |
< T > T selectOne(String statement) | 查询方法,参数 statement 是在配置文件中定义的< select/>元素的id。返回执行SQL语句查询结果的泛型对象,通常查询结果只有一天数据时才使用。 |
< T > T selectOne(String statement,Object parameter) | 查询方法,参数 statement 是在配置文件中定义的< select/>元素的id,parameter 是查询所需的参数,通常是对象或者 Map。返回执行SQL语句查询结果的泛型对象,通常查询结果只有一天数据时才使用。 |
< E >List< E > selectList(String statement) | 查询方法,参数 statement 是在配置文件中定义的< select/>元素的id。返回执行SQL语句查询结果的泛型对象的集合 |
< E >List< E > selectList(String statement,Object parameter) | 查询方法,参数 statement 是在配置文件中定义的< select/>元素的id,parameter 是查询所需的参数,通常是对象或者 Map。返回执行SQL语句查询结果的泛型对象的集合 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
void close() | 关闭 SqlSession 对象 |
Connection getConnection() | 获得JDBC的数据库连接对象 |
3.1 SqlSession 的创建过程
在 MyBatis 中,SqlSession 是其核心接口。在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager。
DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程环境下使用。SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。具体而言,它的作用有 3 个:
- 获取 Mapper 接口。
- 发送 SQL 给数据库。
- 控制数据库事务。
先来掌握它的创建方法,有了 SqlSessionFactory 创建的 SqlSession 就十分简单了,如下所示。
SqlSession sqlSession = SqlSessionFactory.openSession();
SqlSession 控制数据库事务的方法,如下所示。
//定义 SqlSession
SqlSession sqlSession = null;
try {
// 打开 SqlSession 会话
sqlSession = SqlSessionFactory.openSession();
// some code...
sqlSession.commit(); // 提交事务
} catch (IOException e) {
sqlSession.rollback(); // 回滚事务
}finally{
// 在 finally 语句中确保资源被顺利关闭
if(sqlSession != null){
sqlSession.close();
}
}
这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。因为它代表着一个数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用 finally 语句保证其顺利关闭。
参考文章:
- 《Spring + MyBatis 企业应用实战》
- 《C语言中文网》