当前位置: 首页 > web >正文

Mybatis执行sql流程(一)

文章目录

    • 第一行:
    • 第二行:

代码中的两行代码是如何执行的?

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.selectById(userId);

第一行:

获取 Mapper 接口的代理对象,调用链如下:

SqlSession.getMapper()Configuration.getMapper()MapperRegistry.getMapper() // 使用map做了缓存,若没有则继续向下MapperProxyFactory.newInstance() // 使用 JDK 动态代理生成 Mapper 接口的代理对象。即返回的是一个动态生成代理类对象。具体的代理过程此处不详细介绍,在后文。

第二行:

执行SQL:动态代理拦截方法调用。
userMapper.selectById(userId); 上述得知userMapper对象是代理类对象,此处调用的selectById方法就是代理类中实现的接口方法(当然不是具体的实现内容,具体的实现内容在InvocationHandler与JDK动态代理相关)参考JDK动态代理

// 例如:执行userMapper.selectUserById(1);
MapperProxy.invoke() // MapperProxy 就是InvocationHandler的实现,即具体实现内容在此。在调用链中还涉及到二级缓存的事情,后续说明MapperMethod.execute() // MapperMethod 将方法调用转为SqlSession的操作,如selectOne/insert等SqlSession.selectOne()Executor.query() // 有多种执行器,后续详细说明MappedStatement.getBoundSql()query() // 此处涉及到一级缓存的事情,后续说明;如果没有命中一级缓存,则查询数据库Executor.prepareStatement() // 此处涉及到TypeHandler,将对应的java数据转化为sql类型的数据StatementHandler.query()PreparedStatement.execute() // 执行sqlResultHandler.handleResultSets() // 此处涉及到TypeHandler,将结果集转化为java类型的数据
ClientSqlSessionMapperProxyMapperMethodExecutorJDBCgetMapper(UserMapper.class)创建动态代理userMapper.selectUserById(1)解析方法调用selectOne("selectUserById", 1)query()执行 SQL返回 ResultSet转换为 User 对象返回结果ClientSqlSessionMapperProxyMapperMethodExecutorJDBC

相关内容:
JDK代理
Mybatis加载Mapper
MapperRegistry
MyBatis中JDK动态代理
Mybatis之MapperProxy
Mybatis之MapperMethod
Mybatis之Executor执行器
Mybatis之StatementHandler
Mybatis之KeyGenerator

http://www.xdnf.cn/news/18238.html

相关文章:

  • Dijkstra和多层图 0
  • Linux 系统(如 Ubuntu / CentOS)阿里云虚拟机(ECS)上部署 Bitnami LAMP
  • 自定义ViewPage2滑动切换效果
  • docker compose再阿里云上无法使用的问题
  • MQTT(轻量级消息中间件)基本使用指南
  • MySQL 函数大赏:聚合、日期、字符串等函数剖析
  • 用户认证与应用控制技术
  • DevExtreme Angular UI控件更新:引入全新严格类型配置组件
  • Tmux Xftp及Xshell的服务器使用方法
  • 黑马java八股文全集
  • 实时视频延迟优化实战:RTSP与RTMP播放器哪个延迟更低?
  • Python 项目里的数据清理工作(数据清洗步骤应用)
  • 《算法导论》第 27 章 - 多线程算法
  • K8S集群环境搭建(一)
  • 母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南
  • ——分治——
  • 腾讯开源:视频生成框架Hunyuan-GameCraft
  • MySQL数据库初识
  • 聊聊Vuex vs Pinia
  • 【Python】Python 面向对象编程详解​
  • Golang database/sql 包深度解析(二):连接池实现原理
  • 【前端面试题】前端面试知识点(第三十一题到第六十一题)
  • 《设计模式》抽象工厂模式
  • 24. 什么是不可变对象,好处是什么
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?
  • 【网络通信】TCP/IP 协议全方位解析​
  • 【LeetCode】12. 整数转罗马数字
  • STM32——软硬件I2C
  • 8月17日星期天今日早报简报微语报早读
  • 解锁Java开发神器:XXL-Job从入门到精通