现在我们已经有一个DefaultSqlSession 了,必须找到Mapper.xml 里面定义的Statement ID,才能执行对应的SQL 语句。

找到Statement ID 有两种方式:一种是直接调用session 的方法,在参数里面传入Statement ID,这种方式属于硬编码,我们没办法知道有多少处调用,修改起来也很麻烦。

另一个问题是如果参数传入错误,在编译阶段也是不会报错的,不利于预先发现问题。

Blog blog = (Blog) session.selectOne("com.leon.mapper.BlogMapper.selectBlogById
", 1);

所以在MyBatis 后期的版本提供了第二种方式,就是定义一个接口,然后再调用Mapper 接口的方法。

由于我们的接口名称跟Mapper.xml 的namespace 是对应的,接口的方法跟statement ID 也都是对应的,所以根据方法就能找到对应的要执行的SQL。

BlogMapper mapper = session.getMapper(BlogMapper.class);

在这里我们主要研究一下Mapper 对象是怎么获得的,它的本质是什么。

DefaultSqlSession 的getMapper()方法,调用了Configuration 的getMapper()方法。

configuration.<T>getMapper()

Configuration 的getMapper()方法,又调用了MapperRegistry 的getMapper()方法。

mapperRegistry.getMapper()

我们知道,在解析mapper 标签和Mapper.xml 的时候已经把接口类型和类型对应的MapperProxyFactory 放到了一个Map 中。获取Mapper 代理对象,实际上是从Map 中获取对应的工厂类后,调用以下方法创建对象:

MapperProxyFactory.newInstance()

最终通过代理模式返回代理对象:

return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]
{ mapperInterface }, mapperProxy);

回答了前面的问题:为什么要保存一个工厂类,它是用来创建代理对象的。

MyBatis 源码解读-获得Mapper 对象相关推荐

  1. Mybatis源码解读-设计模式总结

    虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...

  2. 2020年Mybatis源码解读

    目录标题 为什么需要ORM 框架Mybatis ORM框架-前身是Ibatis Mysql映射文件三要素: Mybatis 单独开发-快速入门 mybatis核心配置xml resultType 还是 ...

  3. MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)

    文章目录 Pre Executor 执行器 接口继承关系 SimpleExecutor(简单执行器) 入门小demo 实例化SimpleExecutor doQuery方法 Pre MyBatis源码 ...

  4. MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)

    文章目录 Pre Executor 执行器 接口继承关系 BatchExecutor(重用执行器) 入门小demo 源码 BatchExecutor VS ReuseExecutor Pre MyBa ...

  5. MyBatis源码解读之源码结构

    2019独角兽企业重金招聘Python工程师标准>>> 目的 文章主要了解MyBatis源码结构,每个包的具体功能.如何去学习MyBatis源码. MyBatis源码结构导图 查看大 ...

  6. MyBatis 源码解读(零)导语

    简单介绍下我使用最多的持久层框架 Hibernate valuelist MyBatis 这三个框架,也是用过国内的一些产品,不过已经很少了. 虽然已经使用了很长时间,但是还没有认真的读过该项目的源码 ...

  7. MyBatis 源码解读-带着问题去看源码

    分析源码,我们还是从编程式的demo 入手.Spring 的集成我们会在后面讲到. InputStream inputStream = Resources.getResourceAsStream(re ...

  8. MyBatis 源码解读-mapperElement()

    http://www.mybatis.org/mybatis-3/zh/configuration.html#mappers 1)判断 最后就是<mappers>标签的解析. 扫描类型 含 ...

  9. MyBatis 源码解读-XMLConfigBuilder

    XMLConfigBuilder 是抽象类BaseBuilder 的一个子类,专门用来解析全局配置文件,针对不同的构建目标还有其他的一些子类,比如: XMLMapperBuilder:解析Mapper ...

最新文章

  1. 区分真实模式的两个标准
  2. 943602cs 蓝牙驱动 win10_英特尔升级WiFi 和蓝牙驱动,Win10 更新5月版稳了
  3. Oracle RAC 添加删除节点
  4. JS中Node节点总结
  5. 采用IpIq控制方法和电流空间和电压空间的PWM方法控制
  6. ibatis.net:第五天,QueryForObject
  7. 一款黑科技让普通屏幕秒变触摸屏,厉害了我的哥
  8. SpringCloud教程 | 第三篇: 服务消费者(Feign)
  9. mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB
  10. LeetCode 1311. 获取你好友已观看的视频(BFS+哈希map+vector排序)
  11. 分布式服务框架原来与实践 读书笔记一
  12. Perl 文件和文件夹操作
  13. Linux配置手册(五)Linux 配置域名服务器(DNS)
  14. 【图像处理】高斯滤波
  15. 转置矩阵使用T,Hermite矩阵、正交矩阵、酉矩阵、奇异矩阵、正规矩阵、幂等矩阵
  16. 全志F1C100S声卡驱动探究
  17. 交安ABC考试单选练习题库
  18. Java面试题-day25 数据库之事务
  19. cv2 改变图片大小 resize
  20. 四川省内江市启动公共视频监控三期建设

热门文章

  1. asp.net 2.0 主题中多CSS文件引用
  2. Nuget常用命令(转)
  3. Struts2【一】 配置介绍
  4. 习题3-11 Kickdown UVA - 1588
  5. Linux centos7 shell特殊符号、cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号...
  6. java预备作业2 计科1501 乔赫
  7. php header运用细节
  8. CSS3实现漂亮ToolTips
  9. [黑马程序员五]:常用的T-SQL语句
  10. JVM学习04:类的文件结构