思考: “为什么在使用 Mybatis 的时候,只需定义一个接口,不用写实现类就能使用XML中或者注解上配置好的SQL语句,就能完成对数据库 CRUD 的操作呢?”

这是因为用到了接口代理类,把每一个数据库操作的DAO接口都用操作数据库的代理类实现,并注册到Spring容器让用户去使用。从代码层面来看, 主要是两个东西, 一个是mapperRegistry, 还有一个是mappedStatements.

mapperRegistry存储的是(接口全路径, MapperProxyFactory)键值对.  通过MapperProxyFactory可以创建MapperProxy.

mappedStatements存储的是(接口全路径+方法名, mappedStatement), 当sqlSession.getMapper返回的是一个MapProxy, MapProxy执行某个sql语句时, 通过MapProxy与调用的接口的名字可以组成一个key, 之后通过这个key可以到mappedStatements找到这个接口的具体实现, 即一个mappedStatement.  这也是为什么DAO接口的路径要与mapper配置文件中的nameSpace一致, 以及 DAO接口中的方法, 要与mapper配置文件中的sql片段中"id"属性内容一致. 这些都是为了后续缓存的key好匹配.

图片摘选链接:手写Mabatis

最新文章

  1. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
  2. tomcat 远程调试
  3. windows系统和ubuntu虚拟机之间文件共享——samba
  4. Javascript模板引擎:Hogan
  5. 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
  6. MVC - Action和ActionResult
  7. hdu 2067
  8. 一个Java程序员应该掌握的10项技能
  9. Zabbix的集中式监控
  10. 模块化手机project ara之我见
  11. test_CSDN_markdown_format
  12. 关于写作那些事之github告诉我构建失败,然后呢?
  13. 小程序开发-Now you can provide attr "wx:key" for a "wx:for" to improve performance
  14. sql注入总结(二)--2018自我整理
  15. 3.6 C++继承机制下的构造函数
  16. wireshark系列之wireshark过滤器
  17. 4.Spring中使用Log4j
  18. 3- 功能2:基于forms组件和ajax实现注册功能
  19. C语言文法阅读与理解序
  20. 分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客

热门文章

  1. python基础-常用内置包
  2. Navicat Premium无法连接到oracle数据库的解决方法
  3. uniapp 打包app 引入高德地图
  4. ClickHouse数据副本引擎
  5. day09-功能实现08
  6. Kubernetes的垂直和水平扩缩容的性能评估
  7. 封装 avm 组件经验分享
  8. c#5.0(.net 4.5之后)的 Async+await+Task的异步机制的调试笔记
  9. [深度学习] Python人脸识别库face_recognition使用教程
  10. 手撕AVL树(C++)