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 解析结果集
标签:调用,流程,private,SQL,Mybatis,执行,方法,final,SELECT From: https://www.cnblogs.com/ayizzz/p/17532809.html