mybatis 三大工具类的封装, 核心流程图

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了mybatis 三大工具类的封装, 核心流程图脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1. 事件代理

package com.fmg.utils;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TransactionInvocationHandle implements InvocationHandler {
    private Object target;

    public TransactionInvocationHandle(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        SqlSession sqlSession = null;
        Object obj = null;
        try {
            sqlSession = SqlSessionUtil.getSession();
            obj = method.invoke(target, args);
            sqlSession.commit();
        } catch (Exception e) {
           e.printStackTrace();
        } finally {
            SqlSessionUtil.myClose(sqlSession);
        }
        return  obj;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }
}

 

2. SqlSession 对象的创建与关闭

package com.fmg.utils;

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;

public class SqlSessionUtil {
    private static SqlSessionFactory sqlSessionFactory;

    // 线程池
    static ThreadLocal<SqlSession> t = new ThreadLocal<>();

    // 加载工厂
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    // 创建session对象
    public static SqlSession getSession() {
        SqlSession sqlSession = t.get();
        if (sqlSession == null) {
            sqlSession = sqlSessionFactory.openSession();
            t.set(sqlSession);
        }
        return sqlSession;
    }

    // 关闭对话
    public static void myClose(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
            t.remove();
        }
    }
}

3. 获取代理对象的工厂

package com.fmg.utils;

public class ServiceFactory {
    public Object getService(Object obj) {
        return new TransactionInvocationHandle(obj).getProxy();
    }
}

 

自学mybatis, 第一次听课, 这一段懵逼了, 仔细想想, 都是万变不离其宗

Dao <==> Service <==> controller   交互流程, 无非就是 Service 使用 代理(反射机制) 动态创建而已

绘制小图一张, 给自己醒醒神

mybatis 三大工具类的封装, 核心流程图

 初学, 不懂框架, 技术有限(请指教)

注意事项

1. SqlSession 中需要关闭SqlSession的类, ThreadLocal线程池是为了保证SqlSession的唯一, 否则会出一些诡异的bug

2. 代理中执行完了Dao层提供的方法后, 需要对 SqlSession 执行commit 保存, 且需要执行关闭操作

3. Dao层里面调用getSession, 不能共用一个, 应该统一从SqlSessionUtil中取, 保证SqlSession的干净

 

脚本宝典总结

以上是脚本宝典为你收集整理的mybatis 三大工具类的封装, 核心流程图全部内容,希望文章能够帮你解决mybatis 三大工具类的封装, 核心流程图所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: