【MyBatis06】封装工具类

在执行了Mybatis的一系列操作以后,需要创建一个工具类来封装经常重复使用的API来简化使用过程,经常重复使用的API包括:

1 加载配置并构建sqlsession工厂

配置文件只需要加载一次不需要反复加载,所以可以将其放在静态代码块中:

	private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2 创建SqlSession

按照如下简单写法即可完成创建Session的需求:

    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }

 但是在MyBatis中,SqlSession是一个比较特殊的资源,类似于JDBC中的Connection,可以控制事务。需要保证线程(请求)唯一但全局不唯一,即线程私有不被多线程共享,所以需要用到ThreadLocal绑定当前线程中的SqlSession对象。

    public static SqlSession openSession() {
        SqlSession sqlSession = tl.get();
        if (sqlSession == null) {
            sqlSession = sqlSessionFactory.openSession();
            tl.set(sqlSession);
        }
        return sqlSession;
    }

3 释放资源

    public static void close(){
        SqlSession sqlSession = openSession();
        sqlSession.close();
    }

4 封装事务操作

  • commit:
    public static void commit(){
        SqlSession sqlSession = openSession();
        sqlSession.commit();
    }
  • rollback
    public static void rollback(){
        SqlSession sqlSession = openSession();
        sqlSession.rollback();
    }

注意:一定要使用2中的openSession方法,使得我们的SqlSession是当前线程绑定的SqlSession

 

5 获取Mapper

    public static <T> T getMapper(Class<T> mapper){
        SqlSession sqlSession = openSession();
        return sqlSession.getMapper(mapper);
    }

6 工具类测试

测试方法:

        StudentDao studentMapper = MyBatisUtil.getMapper(StudentDao.class);
        Student testUtil = new Student(null, "testUtil", true);
        studentMapper.addStudent(testUtil);
        MyBatisUtil.commit();

测试结果:

7 完整工具类

package com.qianglj.test1.util;

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 java.io.IOException;
import java.io.InputStream;

/**
 * @author qiang
 * @create 2022-06-13 22:43
 * @Description:
 */
public class MyBatisUtil {
    //获取SqlSession工厂
    private static SqlSessionFactory sqlSessionFactory;
    //创建ThreadLocal绑定当前线程中的SqlSession对象
    private static final ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();

    static {
        try {
            //加载配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //构建session工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //创建SqlSession(获得连接)
    public static SqlSession openSession() {
        //从tl获得当前线程的SqlSession
        SqlSession sqlSession = tl.get();
        if (sqlSession == null) {
            sqlSession = sqlSessionFactory.openSession();
            tl.set(sqlSession);
        }
        return sqlSession;
    }

    //释放连接
    public static void close() {
        SqlSession sqlSession = openSession();
        sqlSession.close();//释放的是当前线程中的SqlSession
    }

    //提交事务
    public static void commit() {
        SqlSession sqlSession = openSession();
        sqlSession.commit();//提交的是当前线程中的SqlSession所管理的事务
        close();
    }

    //回滚事务
    public static void rollback() {
        SqlSession sqlSession = openSession();
        sqlSession.rollback();//回滚的是当前线程中的SqlSession所管理的事务
        close();
    }

    //获得接口实现类对象
    public static <T> T getMapper(Class<T> mapper) {
        SqlSession sqlSession = openSession();
        return sqlSession.getMapper(mapper);
    }
}

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/framework/mybatis/1928/tool_class/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录