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();
    }
}

}

 

posted @ 2020-08-27 18:31  林淼零  阅读(172)  评论(0编辑  收藏  举报