动态代理对象自动提交事务和关闭链接
1.自动获取SqlSession
public class MyBatisUtil {
private static SqlSessionFactory factory;
static{
try {
//1.加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.使用Builder解析流中的数据
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
//返回sqlsession
return factory.openSession();
}
}
2.利用动态代理返回自动提交事务和关闭资源的对象。
public class MapperFactory {
public static <T> T getMapper(Class<T> clazz){
//希望采用动态代理对mapper进行增强, 加上两个步骤
T proxyStudentDao = (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.获取到弱鸡对象
SqlSession sqlSesion = MyBatisUtil.getSqlSession();
T mapper= sqlSesion.getMapper(clazz);
Object invoke = null;
try
{
//先让弱鸡进行调用
invoke = method.invoke(mapper, args);
//提交事务
sqlSesion.commit();
}
//出现异常的话,数据回滚
catch (Exception e)
{
e.printStackTrace();
sqlSesion.rollback();
}
//最终关闭资源
finally
{
//判断不为空的话,关闭资源
if(sqlSesion != null)
{
sqlSesion.close();
}
}
//把弱鸡的调用结果返回。新的动态代理对象只是加了提交事务和关闭资源两个步骤而已。
return invoke;
}
});
//返回动态代理的mapper对象
return proxyStudentDao;
}
}