从 SELECT 看 Mybatis 执行流程

Mybatis 层次结构

  • 部件解释:

SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合
ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装
SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql 表示动态生成的SQL语句以及相应的参数信息
Configuration MyBatis所有的配置信息都维持在Configuration对象之中

mybatis mapper 动态代理的使用

1、通过 session 的 getMapper(Class) 方法获取对应的 Mapper session.getMapper(UserMapper.class)
2、把 getMapper 的执行逻辑交给 configuration 进行处理

3、configuration 说我管不了你这个逻辑,你找我内部的属性 mapperRegistry 把

mapperRegistry 维护的是对应的 mapper 对应的内容

4、从 mapperRegistry 的内部属性 knownMappers 获取对应的维护数据,同时通过 mapperProxyFactory.newInstance(sqlSession) 生成代理对象

5、动态代理生成对应的代理对象

6、通过 **Mapper 进行接口调用

7、进行 JDK 动态代理回调进行方法增强 invoke 接口

1、如果是 Object 的方法那么可以直接进行方法的调用不用进行增强,否则进行方法增强

8、通过 PlainMethodInvoker 中的 MapperMethod 进行方法的执行

9、调用 MapperMethod 的 execute 方法进行方法执行

1、构建 MapperMethod 时设置 SqlCommand 并初始化其中的相关属性
2、调用 SqlCommand 的 getType() 方法检查 SQL 类型,如果是查询需要通过返回值类型来选择具体的执行方法
3、通过 sqlSession 的相关方法进行 SQL 的解析执行
4、需要注意即使是 selectOne 方法也是执行的 selectList 方法

10、通过 configuration 的 getMappedStatement 获取存储的 MappedStatement 数据

11、通过 Executor 执行器进行具体的方法执行
12、从 MappedStatement 方法获取 BoundSql

1、BoundSql 封装了对应的 SQL 语句

  private final String sql;
  private final List<ParameterMapping> parameterMappings;
  // 参数数据
  private final Object parameterObject;
  private final Map<String, Object> additionalParameters;
  // 参数设置的元数据
  private final MetaObject metaParameters;

11、通过 queryFromDatabase 执行具体的逻辑调用 doQuery() 进行方法的执行

12、构建 StatementHandler 并进行 SQL 填充,默认选择 prepareStatement
13、通过 StatementHandler 执行 statement

1、通过 statement 执行 SQL
2、调用 ResultHandler 解析结果集


posted @   ayiZzzz  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示