MyBatis原理解读

我们项目中多用MyBatis进行数据库的读写,开源的MyBatis-Plus框架对其进行了增强,使用上更加简单,我们之前的很多项目也是直接用的MyBatis-Plus。

数据库操作的时候,简单的单表读写,我们可以直接在方法里链式组装SQL,复杂的SQL或涉及多表联合join的,需要在xml手写SQL语句。

MyBatis是对JDBC的封装,所以执行流程跟原生JDBC操作数据库一样,都有获取数据库连接、组装SQL、执行这些步骤。一个SQL执行就是一次SqlSession,在实现上,由SqlSessionFactoryBuilder通过建造者模式去创建SqlSessionFactory工厂,在SqlSessionManager管理器可以看到通过JDK动态代理去创建SqlSession,每个线程当前的SqlSession维护在ThreadLocal。
MyBatis原理解读_第1张图片
SqlSessionInterceptor本身实现了InvocationHandler,也是代理模式去执行SQL,根据执行中的异常情况,判断是提交或回滚。

    private class SqlSessionInterceptor implements InvocationHandler {
   
        public SqlSessionInterceptor() {
   
        }

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
            SqlSession sqlSession = (SqlSession)SqlSessionManager.this.localSqlSession.get();
            if (sqlSession != null) {
   
                try {
   
                    return method.invoke(sqlSession, args);
                } catch (Throwable var19) {
   
                    throw ExceptionUtil.unwrapThrowable(var19);
                }
            } else {
   
                SqlSession autoSqlSession = SqlSessionManager.this.openSession();
                Throwable var6 = null;

                Object var8;
                try 

你可能感兴趣的:(mybatis,mybatis)