核心接口和类
MyBatis框架的核心对象
MyBatis框架的核心对象包括核心接口和类
SqlSessionFactory实例是MyBatis框架应用程序的核心。
SqlSessionFactory实例由SqlSessionFactoryBuilder对象根据XML配置文件或Configuration类的实例进行创建。
通过SqlSessionFactory实例可获得SqlSession实例包括执行SQL操作的方法,可以同过该实例执行已映射的SQL语句。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder负责根据配置文件信息构建SqlSessionFactory实例。为此,其提供了多种builder()重载方法,
通过分析MyBatis框架的源码可以发现,核心builder()重载方法有以下三种,其他重载方法实际是三种方法的的简化调用。
- builder(Reader reader, String environment, Properties properties)
- builder(InputStream inputStream, String environment, Properties properties)
- builder(Configuration config)
通过以上重载方法可以发现,MyBatis框架的配置信息可以通过三种形式提供给builder()重载方法,分别是字节流InputStream,字符流Reader和Configuration类,因为字节流与字符流均属于读取文件的方法,所以获取构建SqlSessionFactory实例所需配信息的方式可以分为两种:读取XML配置文件方式和编程方式。
SqlSessionFactory
由SqlSessionFactoryBuilder构建的SqlSessionFactory实例是MyBatis框架应用的核心。顾名思义SqlSessionFactory是创建SqlSession实例的工厂,SqlSessionFactory提供了openSession()方法来获取SqlSession实例。
openSession()方法中boolean类型的参数用于控制是否开启自动提交。true表示开启自动提交,关闭事务控制;false表示关闭自动提交,开启事务控制。
在应用运行过程中,不建议反复销毁和创建SqlSessionFactory实例,SqlSessionFactory实例一旦创建就应该在应用的运行周期中始终存在。
因此,需要对获取SqlSessionFactory实例的代码进行优化,使SqlSessionFactory实例只被创建一次并可反复使用。
public class MyBatisUtil {
private static String CONFIG_FILE = "mybatis-config.xml";
private static SqlSessionFactory factory;
static {
try {
InputStream stream = Resources.getResourceAsStream(CONFIG_FILE);
factory = new SqlSessionFactoryBuilder().build(stream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession();
}
public static void close(SqlSession sqlSession){
if (sqlSession!=null){
sqlSession.close();
}
}
}
SqlSession
SqlSession用于执行持久化操作,它提供数据执行SQL命令的能力。可以通过SqlSession提供的方法执行已映射的SQL语句。
SqlSession表示一次数据库会话。SqlSession实例是非线程安全的,不能被共享,每个线程都应该使用自己独立的SqlSession实例,SqlSession实例的生命周期不应该是永久的。因此,SqlSession实例最佳的作用域范围是一次HTTP请求,或方法作用域内。
一个SqlSession实例并非只能执行一次SQL语句,在一次会话中完全可以执行多次SQL语句。
及时关闭SqlSession是非常重要的。
SqlSessionFactoryBuilder执行绑定的SQL语句有两种方式:
基于字符串常量
该方法有类型转换的问题
Integer result = sqlSession.selectOne("com.dao.SysUserDao.count");
System.out.println("count = " + result);
基于Mapper接口
推荐使用Mapper接口,无需进行类型转换。
SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class);
Integer count = sysUserDao.count();