zoukankan      html  css  js  c++  java
  • Mybatis运行原理

    MyBatisTest.java

    package com.aff.mybatis.test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    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 org.junit.Test;
    
    import com.aff.mybatis.bean.Employee;
    import com.aff.mybatis.dao.EmployeeMapper;
    
    public class MyBatisTest {
    
        //抽出 getSqlSessionFactory 方法
        public  SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            return sqlSessionFactory;
        }
    
        /**
         * 插件开发,mybatis 允许使用插件拦截四大对象的某一个方法
         * Executor  执行器  (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 执行增删改查的但其中原理还是需要下面三个处理器来操作的
         * ParameterHandler  参数处理器 (getParameterObject, setParameters)
         * ReultSetHandler   结果集处理器 (handleResultSets, handleOutputParameters)
         * StatementHandler  sql语句的处理器 (prepare, parameterize, batch, update, query)
         */
        
        /**
         * 1.获取sqlSessionFactory 对象
         *                 解析全局配置文件和mapper.xml文件的每一个信息保存在Configuration中,然后返回包含Configuration 的DefultSqlSession
         *                 注意:MappedStatement 代表一个增删改查标签的详细信息(各个属性值,sql语句等全部信息都在)
         * 
         * 2.获取sqlSession 对象
         *                 返回一个DefultSqlSession对象包含Executor和Configuration
         *                这一步会创建Executor对象 ,如果有二级缓存配置开启的话,会有一个CachingExecutor包装Executor,
         *                再接着有拦截器的话,会有一个拦截器链(interceptorChain)来包装Executor ,interceptorChain.pluginAll(executor)
         * 
         * 3.获取接口的代理对象(MapperProxy)
         *                 getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象
         *                 代理对象里面包含了,DefultSqlSession ,所以里面也就包含了Executor
         *                 
         * 4.执行代理对象的增删改查方法
         * 
         * 
         * 总结:
         *         1.根据配置文件(全局,sql映射) 初始化出Configuration 对象
         *         2.创建一个DefultSqlSession 对象
         *             他里面包含Configuration 以及Executor(根绝全局配置文件的defultExecutorType 创建出的对应得Executor)
         *         3. DefultSqlSession.getMapper() :拿到Mapper接口对应的MapperProxy
         *         4.MapperProxy 里面有DefaultSqlSession
         *         5.执行增删改查方法:
         *                             ①. 调用DefaultSqlSession 的增删改查(Executor)
         *                             ②. 会创建一个StatementHandler 对象
         *                                   (同时也会创建ParameterHandler和ResultSetHandler)
         *                             ③. 调用StatementHandler 预编译参数和设置参数值
         *                                  使用ParameterHandler 来给sql设置参数
         *                             ④. 调用 StatementHandler 的增删改查方法
         *                             ⑤.  ResultSetHandler 封装结果
         * 
         * 注意:四大对象每个创建的时候都有一个interceptorChain.pluginAll(Executor/ParameterHandler/ReultSetHandler/StatementHandler)
         * @throws IOException
         */
        //解析mybatis运行原理
    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            //获取接口的实现类对象
            //会为接口自动的创建一个代理对象, 代理对象去执行增删改查方法
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee employee = mapper.getEmpById(1);
            System.out.println(employee);
        } finally{
            openSession.close();
        }
    }
    
    }

    All that work will definitely pay off
  • 相关阅读:
    卫星时间同步装置的安装及售后
    windowsU盘重装系统:操作流程
    vue安装正确流程
    win10以太网未识别的网络
    [UnityShader]unity中2D Sprite显示阴影和接受阴影
    [UnityShader]说厌了的遮挡显示
    [Unity]利用Mesh绘制简单的可被遮挡,可以探测的攻击指示器
    ConcurrentHashMap源码解读
    Vector底层原理
    LinkedList集合底层原理
  • 原文地址:https://www.cnblogs.com/afangfang/p/13573081.html
Copyright © 2011-2022 走看看