学习Mybatis框架,首要任务就是学习Mybatis基本构成,也即Mybatis核心组件。对核心组件的学习大致可分为两部分,首先是核心组件的构成及用法,其次是核心组件的生命周期,本文主要介绍组件的构成及用法。
Mybatis核心组件包括四部分,分别为:
(1)SqlSessionFactoryBuilder:构造器
(2)SqlSessionFactory:工厂接口
(3)SqlSession:回话接口
(4)SQL Mapper:映射器
它们之间的关联关系如下图:
SqlSessionFactoryBuilder依据XML配置文件信息或者代码的方式创建SqlSessionFactory,SqlSessionFactory用于生成SqlSession,SqlSession用于获取映射器或者与数据库进行交互。以下分别对每个介绍每个组件的用法。
SqlSessionFactoryBuilder的作用在于依据配置信息或者代码生成SqlSessionFactory。源码提供的方法如下图:
通过查看源码可知,该类有一个默认构造器和多个build()的重载方法。进一步分析便可发现,该类中主要的方法为三个:
public SqlSessionFactory build(Reader reader, String environment, Properties properties);
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties);
public SqlSessionFactory build(Configuration config)
第一个方法通过字符流读取配置文件信息;第二个方法通过字节流读取配置文件信息;第三个方法通过代码的方式创建SqlSessionFactory。通过字符流或字节流读取配置文件信息创建SqlSessionFactory,实际均是利用第三个方法,最终都会创建Configuration对象以创建SqlSessionFactory,其本质是一致的。
SqlSessionFactory用于生产SqlSession回话。由前文可知,创建SqlSessionFactory有两种方式,一种使用XML配置文件的方式,另一种使用Java代码的方式。以下举例子简要介绍两种方式创建SqlSessionFactory。
创建一个java项目,引入mybatic相关jar包(本例中使用的mybatis版本为3.3.0)。
第一、使用XML配置文件的方式,本例中的配置文件为mybatis-config.xml,配置文件内容如下:
配置文件简要说明如下:
① 配置properties,db.properties文件保存数据库连接信息
② 配置环境内容,默认使用id为developement的环境配置,包含事务管理模式和数据库连接信息
③ 配置映射器,引入一个XML(empMapper.xml)文件,它提供了SQL和POJO的映射规则,包含映射器中的信息,内容如下:
由此可知,EmpDao接口中定义了两个方法,也即queryEmpById和queryEmpByJob
接下来实现创建SqlSessionFactory,本例中使用Junit作单元测试,代码如下:
package cn.don.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.junit.Before;
import org.junit.Test;
import cn.don.dao.EmpDao;
import cn.don.entity.Emp;
public class EmpDaoTest {
private static final String CONFIGE_FILE = "mybatis-config.xml";
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
InputStream inputStream = Resources.getResourceAsStream(CONFIGE_FILE);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(sqlSessionFactory);
}
@Test
public void testQueryEmpByJob(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpDao empMapper = sqlSession.getMapper(EmpDao.class);
System.out.println(empMapper);
List empList = empMapper.queryEmpByJob("CLERK");
System.out.println(empList);
sqlSession.close();
}
}
测试输入结果为:
例中使用文件输入流,利用SqlSessionFactoryBuilder读取配置文件信息以 创建SqlSessionFactory,至此,使用XML配置文件的方式创建SqlSessionFactory完成。
第二、使用Java代码的方式,在test包下新建一个类TestCreateSqlSessionFactoryWithCode,类中的详细代码如下代码如下:
public class TestCreateSqlSessionFactoryWithCode {
private static byte[] lock = new byte[1];
private static SqlSessionFactory sqlSessionFactory = null;
public static SqlSessionFactory getSqlSessionFactory() {
synchronized (lock){
if(sqlSessionFactory == null) {
init();
}
return sqlSessionFactory;
}
}
private static void init() {
// 1、设置数据库连接信息
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
dataSource.setUsername("test");
dataSource.setPassword("test");
// 2、事务管理方式
TransactionFactory transaction = new JdbcTransactionFactory();
// 3、创建运行环境
Environment environment = new Environment("development", transaction, dataSource);
// 4、创建Configuration对象
Configuration configuration = new Configuration(environment);
// 5、添加映射器
configuration.addMapper(EmpDao.class);
// 6、构建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
}
}
至此,构建SqlSessionFactory的两种方式结束完毕,两种方式本质是一样的。实际开发中,大多数情况下,建议使用XML配置文件的方式。一般在情况下,在需要加入自己的特性时才会选择使用Java代码的方式。
SqlSession是Mybatis非常重要的接口,主要进行持久化操作。SqlSession为我们提供的方法如下:
由上图可知,一方面,SqlSession提供了进行增删该查的方法,同时可进行事物提交或者回滚;另一方面,提供了获取映射器的方法。需要注意:SqlSession的实例是线程不安全的,不能将其放在类的静态字段或者实例字段中;使用完SqlSession之后,应用利用finally块来确保关闭它。
SQL Mapper(映射器)的作用主要体现在定义参数类型、描述缓存、描述SQL语句以及定义查询结果和POJO的映射关系四方面。Mybatis通过映射器找到映射文件从而找到SQL语句,引入Mapper的方法分别为:使用类路径查找资源文件、使用本地文件、接口类或者包名,例如:
它由Java接口和XML文件组成,也可由Java接口和注解组成。实际开发中,推荐使用前者。