二、Mybatis基本要素
2.1 SqlSessionFactoryBuilder
每一个mybatis的应用程序的入口是SqlSessionFactoryBuilder,它的作用是通过XML配置文件创建Configuration对象,然后通过build方法创建SqlSessionFactory对象,一般使用全局。
它有五个方法build()方法,每一种都允许你从不同的资源中创建一个SqlSession实例。
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
SqlSessionFactory build(Configuration config)
由于方法参数environment 和peoperties都可以为null,那么去除重复的,真正地重载方法其实只有如下三种:
build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)
我们会发现配置信息可以以三种形式提供给SqlSessionFactoryBuild的build()方法,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个SqlSessionFactory有两种方式:读取XML配置文件的方式和编程构造方式。我们采用读取XML配置文件的方式来构造SqlSessionFactory。
2.2 SqlSessionFactory
SqlSessionFactory简单的理解就是创建SqlSession实例的工厂。所有的Mybatis应用都是以SqlSessionFactory实例为中心,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder对象来获得。有了它之后,很容易就可以通过SqlSessionFactory提供的openSession()方法来获取SqlSession实例了。
默认的openSession()方法没有参数,它会创建有以下特性:
- 会开启一个事务(也就是不会自动提交);
- 将从由当前环境配置的DataSource实例中获取Connection对象,事务隔离级别将会使用驱动或数据源的默认设置;
- 预处理语句不会被复用,也不会批量处理更新。
注意:
openSession()方法的参数为boolean值时,若传入为true表示关闭事务控制,自动提交;false表示开启事务控制。若不传入参数,默认为true。
2.3 SqlSession
SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection。
它提供了面向数据库执行SQL命令所需的所有方法,可以通过SqlSession实例直接运行已映射的SQL语句。
执行语句的方法,这些方法被用来执行定义在 SQL 映射的 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 语句。它们都会自行解释,每一句都使用语句的 ID 属性和参数对象,参数可以是原生类型(自动装箱或包装类)、JavaBean、pojo或 Map。
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
selectOne 和 selectList 的不同仅仅是 selectOne 必须返回一个对象或 null 值。如果返回值多于一个,那么就会抛出异常。selectMap 稍微特殊一点,因为它会将返回的对象的其中一个属性作为 key 值,将对象作为 value 值,从而将多结果集转为 Map 类型值。因为并不是所有语句都需要参数,所以这些方法都重载成不需要参数的形式。
核心对象 | 最佳生命周期 | 最佳作用域 |
---|---|---|
SqlSessiionFactoryBuilder | 方法体内 | 方法体内(局部变量) |
SqlSessiionFactory | 从应用服务启动开始一直到应用服务停止-application | 整个应用内 |
SqlSessiion | 一次请求的有效期 | 一次请求的有效期内 |
提取出一个MyBatis.java工具类:
package cn.ebuy.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.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "mybatis-config.xml";
InputStream is = null;
try {
is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession createSqlSession() {
return sqlSessionFactory.openSession();
}
public static void closeeSqlSession(SqlSession sqlSession) {
if (sqlSession != null)
sqlSession.close();
}
}