从 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 解析结果集
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix