ThreadLocal实现mybatis工具类

580 阅读1分钟

一、什么是ThreadLocal?

定义: ThreadLocal是一个可以开箱即用、无额外开销、线程安全的工具类

来源: 每个线程内部有一个自己的ThreadLocalMap的引用,每个线程从自己的threadlocalMap中获取threadlocal。 每个threadlocal变量作为key,对应线程专属的值为value。

特点

1.线程持有

一次web请求中,只会使用同一个线程。

2.线程一致

在jdbc中保证一个事务所有数据都在一个连接里。

3.线程安全

,ThreadLocal收集错误信息,在多线程处理场景下,可供后续的链路去使用这个值,保证安全。

二、使用类

1.SqlSessionFactoryBuilder

该对象主要负责读取mybatis的主配置文件(mybatis-Config.xml),用于指定数据库的连接参数和框架参数配置

2.SqlSessionFactory

每一个mybatis的应用程序都有一个SqlSessionFactory对象,该对象负责创建SqlSession

3.SqlSession

该对象包含了所有执行sql操作的方法

  • 附上mybatis工具类源码

public class MybatisUtil {
    static ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory factory;

    static {
        try {
            factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-Config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   //获取sqlSession
    public static SqlSession getSession() {
        //优先从threadLocal中获取session对象
        SqlSession session = tl.get();
        //如果session为空,则创建新的session对象,并保存到threadLocal中
        if (session == null) {
            session = factory.openSession();
            tl.set(session);
        }
        return session;
    }

    //事务提交
    public static void commit() {
        SqlSession session = tl.get();
        if (session != null) {
            session.commit();
            //关闭
            close();
        }
    }
    
   //事务回滚
    public static void rollback() {
        SqlSession session = tl.get();
        if (session != null) {
            session.rollback();
            //关闭
            close();
        }
    }
   //关闭sqlSessiojn
    public static void close() {
        SqlSession session = tl.get();
        if (session != null) {
            session.close();
            //关闭
            tl.remove();
        }
    }
}