mybatis整体架构
接口层 | sqlSeeion |
核心处理层 | 配置解析 参数映射 sql解析 sql执行 结果集映射 插件 |
基础支持层 | 数据源模块 事务管理模块 缓存模块 Binding模块 反射模块 类型转换 日志模块 资源加载 解析器模块 |
Mybayis sql的执行流程:
当执行 session.selectList("com.demo.dao.StockMapper.selectAll") 这行代码时发生了什么?
1.
SqlSession.selectList(String statement)
2.
Executor.query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler)
Executor.doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
3.
StatementHandler.query(Statement statement, ResultHandler resultHandler)
4.
ResultSetHandler.handleResultSets(statement)
粗糙的可以归纳为如下:
SqlSession----->Executor-------->StatementHandler-------------->ResultSetHandler
组件分析:
SqlSession:
包含
<T> T selectOne(String statement);
<E> List<E> selectList(String statement);
等增删改查方法
有一各成员变量:Executor,增删改查方法交给Executor执行
生命周期伴随整个事物。
Executor:
增删改查方法和sqlSession类似。
有多个实现类:
BatchExecutor
ClosedExecutor
ReuseExecutor
SimpleExecutor
StatementHandler
Executor 通过调用StatementHandler的方法来完成增删改查,而StatementHandler 则是调用了jdbc的Statement\PreparedStatement 的方法返回了ResultSet
ResultSetHandler:
把resultSet 转化为java Model
怎么转化的呢? 通过 Mapper文件中的ResultMap