package com.util;
import com.dao.UsersMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* 1、创建和初始化SqlSessionFactory
* 2、创建一个open方法返回一定范围内(线程)可用的SqlSession
* 3、创建一个close方法,来关闭一定范围内的SqlSession
* 4、创建commit、rollback等事务管理方法
* 5、创建一些其它的Mybatis相关方法
*/
public class MybatisUtils {
static ThreadLocal<SqlSession> THREAD_LOCAL = new ThreadLocal<>();//ThreadLocal这个类叫做线程本地存储,为每一个线程保存一个对象,这里是保存一个SqlSession对象。
static final String CONF_FILE = "mybatis-config.xml";
static SqlSessionFactory factory = null;
static{
initFactory(CONF_FILE);
}
public static void initFactory(String configFile){
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
try {
InputStream resourceAsStream =
Resources.getResourceAsStream(configFile);
factory = builder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession open(){
SqlSession session = THREAD_LOCAL.get();
if(session == null){
session = factory.openSession();
THREAD_LOCAL.set(session); //
}
return session;
}
public static void close(){
SqlSession session = THREAD_LOCAL.get();
if(session != null){
session.close();
THREAD_LOCAL.set(null);
}
}
public static void commit(){
SqlSession session = THREAD_LOCAL.get();
if(session!=null)
session.commit();
}
public static void rollback(){
SqlSession session = THREAD_LOCAL.get();
if(session!=null)
session.rollback();
}
// 获取Dao层映射对象,
public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
}
/*public static void main(String[] args) {
SqlSession s1 = open();
// 1s
SqlSession s2 = open();
// 10s
SqlSession s3 = open();
//讨论SqlSession的使用范围:
// 场景1,重定向
// s1 -> A(伊滨) 线程1 request->response open()
// s2 -> B(西工) 线程2 request->response open()
// s3 -> C(涧西) 线程3 request->response open()
// s4 -> A(伊滨) 线程4 request->response open()
//这种情况,使用不同的线程,不能确定线程之间的时间,防止占用过多的服务器资源,所
//以使用不同的线程
// 场景2,转发
// s <-> A(伊滨) -电话-> B(西工) -(电话)-> C(涧西)
// 线程1 request->response open()/open()/open()
// 这种情况是一个线程,使用同一个SqlSession
UsersMapper dao = getMapper(UsersMapper.class);
}*/
}
SSMday2——mybatis工具类
最新推荐文章于 2024-06-07 08:25:31 发布