mybatis (四) 运行原理

简介

先来看一段简单的mybatis代码:

    /**
     * SqlSession非线程安全 测试可以这样使用  切记开发环境不可以这样
     * 开发环境必须从sqlSessionFactory获取
     */
    SqlSession sqlSession;
    DeptMapper mapper;

    @Before
    public void sqlSession() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(DeptMapper.class);
    }

    @After
    public void close() {
        sqlSession.close();
    }
    
    @Test
    public void findDeptPlusByid() {
        DeptPlus deptPlusByid = mapper.findDeptPlusByid(2L);
        System.out.println(deptPlusByid);
    }

本文适合写一个简单的demo进行debug阅读本文。

大致整理了一下mybatis的执行流程:
在这里插入图片描述
mybatis架构设计:
在这里插入图片描述
mybatis层次结构:
在这里插入图片描述

一、sqlSessionFactory

在这里插入图片描述

二、sqlSession

在这里插入图片描述

在这里插入图片描述

三、 getMapper

在这里插入图片描述
在这里插入图片描述
获取mapper:

    public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
        MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type);
        if (mapperProxyFactory == null) {
            throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
        } else {
            try {
                return mapperProxyFactory.newInstance(sqlSession);
            } catch (Exception var5) {
                throw new BindingException("Error getting mapper instance. Cause: " + var5, var5);
            }
        }
    }

MapperProxyFactory:

    public T newInstance(SqlSession sqlSession) {
        MapperProxy<T> mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);
        return this.newInstance(mapperProxy);
    }
    protected T newInstance(MapperProxy<T> mapperProxy) {
        return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
    }

四、mybatis查询流程

在这里插入图片描述

五、运行流程总结

在这里插入图片描述

  1. 根据配置文件(全局,sql映射)初始化出Configuration对象
  2. 创建一个DefaultSqlSession对象,它里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
  3. DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
  4. MapperProxy里面有(DefaultSqlSession);
  5. 执行增删改查方法:
    1. 调用DefaultSqlSession的增删改查(Executor);
    2. 会创建一个StatementHandler对象。同时也会创建出ParameterHandler和ResultSetHandler)
    3. 调用StatementHandler预编译参数以及设置参数值,使用ParameterHandler来给sql设置参数
    4. 调用StatementHandler的增删改查方法;
    5. ResultSetHandler封装结果

注意:四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);

六、mybatis缓存机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值