工具类的封装首先要考虑的问题是,要实现所有的功能。为了以后的扩展需要工具具有容易维护的特点。同时要提高效率。
mybatis 工具类的封装要考虑三大块内容Resources、SqlSessionFactory、SqlSession。
- Resources:Resources 的作用是读取 Mybatis 核心配置文件,读取的方式是使用IO 流,这样的方式只执行一次就可以了。
- SqlSessionFactory : SqlSessionFactory 是 SqlSession的工厂。这个是重量级资源,内存占用比较大。是一个线程安全的。
- SqlSession : 作用是翻译接口的实现类代码,代替了 JDBC 中的 Connection 对象,需要控制事务。是一个线程不安全的,需要进行线程绑定 ThreadLocal 绑定。
package com.sixkery.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
// mybatis 工具类的封装
public class MybatisUtil {
private static SqlSessionFactory build = null;
private static ThreadLocal<SqlSession> t = new ThreadLocal<>();
// Resources 读取配置文件,读一次,封装静态代码块里
// SqlSessionFactory SqlSession 的工厂,线程安全,创建一次
static {
// Resources 读取 Mybatis 框架运行参数 , Mybatis
try {
InputStream is = Resources
.getResourceAsStream("mybatis-config.xml");
// 创建 SqlSessionFacoty 对象, 工厂类型资源
build = new SqlSessionFactoryBuilder().build(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("没找到文件!");
}
}
// 获取 SqlSession 对象
private static SqlSession openSession() {
// 如果线程中没有 SqlSession 对象,就创建一个
SqlSession ss = t.get();
if (ss == null) {
ss = build.openSession();
t.set(ss); // 把 SqlSession 放到线程中去
}
return ss;
}
// 获取 DAO 接口的实现类
public static Object getMapper(Class clazz) {
return openSession().getMapper(clazz);
}
// 控制事务,提交
public static void commit() {
openSession().commit();
close();
}
// 控制事务,回滚
public static void rollback() {
openSession().rollback();
close();
}
// 关闭资源
public static void close() {
openSession().close();
t.remove(); // 移除线程绑定
}
}