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

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

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

(1)SqlSessionFactoryBuilder:构造器

(2)SqlSessionFactory:工厂接口

(3)SqlSession:回话接口

(4)SQL Mapper:映射器

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

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

(1)SqlSessionFactoryBuilder

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

扫描二维码关注公众号,回复: 4141253 查看本文章

通过查看源码可知,该类有一个默认构造器和多个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,配置文件内容如下:

<configuration>
	<!-- 加载db.propertiies文件 -->
	<properties resource="db.properties"></properties>
	<!-- 环境 -->
	<environments default="developement">
		<environment id="developement">
			<transactionManager type="jdbc"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="${db.driver}"/>
				<property name="url" value="${db.url}"/>
				<property name="username" value="${db.username}"/>
				<property name="password" value="${db.password}"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 配置映射 -->
	<mappers>
		<mapper class="cn.don.dao.EmpDao"/>
	</mappers>
</configuration>

配置文件简要说明如下:

① 配置properties,db.properties文件保存数据库连接信息

② 配置环境内容,默认使用id为developement的环境配置,包含事务管理模式和数据库连接信息

③ 配置映射器,引入一个XML(empMapper.xml)文件,它提供了SQL和POJO的映射规则,包含映射器中的信息,内容如下:

<mapper namespace="cn.don.dao.EmpDao">
	<!-- 依据empno查询员工 -->
	<select id="queryEmpById" parameterType="int" resultType="cn.don.entity.Emp">
		SELECT * FROM EMP WHERE EMPNO=#{empno}
	</select>
	<!-- 依据job查询员工 -->
	<select id="queryEmpByJob" parameterType="String" resultType="cn.don.entity.Emp">
		SELECT EMPNO,
			ENAME,
			JOB,
			MGR,
			HIREDATE,
			SAL,
			COMM,
			DEPTNO
		FROM EMP WHERE JOB=#{job}
	</select>
</mapper>

由此可知,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<Emp> 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代码的方式。

(3)SqlSession

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

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

(4)SQL Mapper

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

<mappers>
	<!-- 使用类路径查找资源文件 -->
	<mapper resource="cn/don/mappers/testMapper.xml"/>
	<!-- 使用本地文件 -->
	<mapper url="file:///F:/test/testMapper.xml"/>
	<!-- 使用接口类 -->
	<mapper class="cn.don.dao.testDao"/>
	<!-- 使用包名 -->
	<package name="cn.don.mapper"/>
</mappers>

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

猜你喜欢

转载自blog.csdn.net/qq_37134175/article/details/83211912
今日推荐