mybatis源码系列(二)—— Mapper接口的binding流程

示例代码

InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));
// 1.加载配置文件创建configuration对象,创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取Mapper接口动态代理
BaseTermMapper mapper = sqlSession.getMapper(BaseTermMapper.class);
// 4.动态代理回调sqlSession中的查询方法,sqlSession将查询方法转发给Executor,
// Executor基于JDBC访问数据库获取数据并通过反射将数据转换成POJO并返回
BaseTerm baseTerm = mapper.selectById(1);
System.out.println(baseTerm.getName());
sqlSession.close();

sqlSessionFactory.openSession()的流程在mybatis数据源模块分析中有具体分析。
这里主要分析获取Mapper接口动态代理的流程
binding的核心类主要有:
MapperRegistry : mapper接口和对应的代理对象工厂的注册中心;
MapperProxyFactory:用于生成mapper接口动态代理的实例对象;
MapperProxy:实现了InvocationHandler接口,它是增强mapper接口的实现;
MapperMethod:封装了Mapper接口中对应方法的信息,以及对应的sql语句的信息;它是mapper接口与映射配置文件中sql语句的桥梁;
在这里插入图片描述
现在开始进入源码流程

// 3.获取Mapper接口动态代理
BaseTermMapper mapper = sqlSession.getMapper(BaseTermMapper.class);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就可以看出BaseTermMapper mapper = sqlSession.getMapper(BaseTermMapper.class); 返回的mapper其实是MapperProxy动态代理类。
接下来看调用查询方法的时候源码是如何实现的。
在这里插入图片描述
因为此时的mapper是MapperProxy动态代理类,mapper.selectById(1)方法会调用到MapperProxy的invoke方法
在这里插入图片描述
在这里插入图片描述
MapperMethod的部分源码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到调用的是sqlSession.selectOne方法
在这里插入图片描述
在这里插入图片描述
此时具体对象内容如下:
在这里插入图片描述
在这里插入图片描述
可以看到最后sqlSession并没有正在处理sql请求,而是转交给executor去查询数据库并将数据映射封装返回。至此第二阶段Mapper的binding流程结束。

以下是Mapper代理类的简单原理代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后调用代码:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值