Mybatis基础(核心组件的构成及用法)

学习Mybatis框架,首要任务就是学习Mybatis基本构成,也即Mybatis核心组件。对核心组件的学习大致可分为两部分,首先是核心组件的构成及用法,其次是核心组件的生命周期,本文主要介绍组件的构成及用法。

Mybatis核心组件包括四部分,分别为:

(1)SqlSessionFactoryBuilder:构造器

(2)SqlSessionFactory:工厂接口

(3)SqlSession:回话接口

(4)SQL Mapper:映射器

它们之间的关联关系如下图:

Mybatis基础(核心组件的构成及用法)_第1张图片

SqlSessionFactoryBuilder依据XML配置文件信息或者代码的方式创建SqlSessionFactory,SqlSessionFactory用于生成SqlSession,SqlSession用于获取映射器或者与数据库进行交互。以下分别对每个介绍每个组件的用法。

(1)SqlSessionFactoryBuilder

SqlSessionFactoryBuilder的作用在于依据配置信息或者代码生成SqlSessionFactory。源码提供的方法如下图:

Mybatis基础(核心组件的构成及用法)_第2张图片

通过查看源码可知,该类有一个默认构造器和多个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,其本质是一致的。

(2)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();
	}
}

测试输入结果为:

Mybatis基础(核心组件的构成及用法)_第3张图片

例中使用文件输入流,利用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代码的方式。

(3)SqlSession

SqlSession是Mybatis非常重要的接口,主要进行持久化操作。SqlSession为我们提供的方法如下:

Mybatis基础(核心组件的构成及用法)_第4张图片

由上图可知,一方面,SqlSession提供了进行增删该查的方法,同时可进行事物提交或者回滚;另一方面,提供了获取映射器的方法。需要注意:SqlSession的实例是线程不安全的,不能将其放在类的静态字段或者实例字段中;使用完SqlSession之后,应用利用finally块来确保关闭它。

(4)SQL Mapper

SQL Mapper(映射器)的作用主要体现在定义参数类型、描述缓存、描述SQL语句以及定义查询结果和POJO的映射关系四方面。Mybatis通过映射器找到映射文件从而找到SQL语句,引入Mapper的方法分别为:使用类路径查找资源文件、使用本地文件、接口类或者包名,例如:


	
	
	
	
	
	
	
	

它由Java接口和XML文件组成,也可由Java接口和注解组成。实际开发中,推荐使用前者。

 

 

你可能感兴趣的:(mybatis)