package 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
* @version 1.0
* @date 2022/1/10 21:31
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
/**
* 获取连接
*
* @return
*/
public static SqlSession getSession() {
//那到sqlSession对象
SqlSession session = threadLocal.get();
if (session == null) {
//如果没有则创建
session = sqlSessionFactory.openSession();
//向线程池中放一个session对象
threadLocal.set(session);
}
return session;
}
/**
* 关闭连接
*/
public static void close(SqlSession session) {
if (session != null) {
//关闭
session.close();
//必须要写 这一步 刷新线程池的sqlsession状态
threadLocal.remove();
}
}
}
代理对象 用来处理事务
package util;
import org.apache.ibatis.session.SqlSession;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author
* @version 1.0
* @date 2022/1/10 22:09
*/
public class TransactionProxy implements InvocationHandler {
//真实对象
Object object;
//有参构造
public TransactionProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法的返回值类型
Object obj = null;
SqlSession session = null;
try {
//获取SQLsession对象
session = SqlSessionUtil.getSession();
obj = method.invoke(object, args);
session.commit();
} catch (Exception e) {
//session不为null则回滚
assert session != null;
session.rollback();
e.printStackTrace();
} finally {
//关闭流
SqlSessionUtil.close(session);
}
return obj;
}
/**
* 获取代理类对象
*
* @return
*/
public Object getProxy() {
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
}