mybatis-架构
架构设计
接口层
提供给外部使用的接口api,开发人员通过这些本地api来操纵数据库。
接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
mybatis和数据库交互的方式
- 使用传统的mybatis提供的api,如sqlSession.selectList()
- 使用mapper代理的方式,使用getMapper(),得到接口的代理对象,再有代理对象进行方法调用
数据处理层
负责具体的sql查找、sql解析、sql执行和执行结果映射处理等。
它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层
负责最基础的功能支持,包括连接管理、事务管理、配置加载和缓存处理,这些都是公用的东西,将它们抽取出来作为最基础的组件。
为上层的数据处理层提供最基础的支撑。
主要构件
构件 | 描述 |
---|---|
SqlSession | 作为mybatis工作的顶层api接口,作为会话访问 ,完成增删改查功能 |
Executor | mybatis执行器 ,是mybatis的核心,负责sql动态语句的生成 和查询缓存维护 |
StatementHandler | 负责处理jdbc的statement的交互(设置参数、执行sql、封装结果 ),包括对statement设置参数,以及将jdbc返回的ResultSet结果转换为List |
ParameterHandler | 负责根据传递的参数值,对statement对象设置参数 |
ResultSetHandler | 负责将resultSet集合转换为list |
TypeHandler | 负责将jdbcType和javaType之间的数据转换; 1.负责对statement对象设置指定的参数 2.对statement返回的结果集resultSet,取出特定的列 |
MappedStatement | 维护了一条(select|update|delete|insert)节点的封装 |
SqlSource | 负责根据用户传递的parameterObject,动态生成sql语句,将信息封装到BoundSql对象中,并返回 |
BoundSql | 表示动态生成的sql语句以及相应的参数信息 |
总体流程
-
加载配置文件并初始化
触发条件:加载配置文件,配置文件包括:conf.xml、mapper.xml和java代码中的注解,将配置文件内容解析封装到
Configuration
,将sql配置信息加载成为一个Mappedstatement
对象,存储在内存中 -
接收调用请求
触发条件:调用mybatis的api传入参数:statementId和传入参对象
处理过程:将请求传递给下层的请求处理层进行处理
-
处理操作请求
触发条件:api接口层传递请求过来,传入参数:statementId和传入参对象
处理过程:
- statementId查找对应的MappedStarement对象
- 根据传入参数对象解析MappedStatement,得到最终要执行的sql和执行传入参数
- 获取数据库连接,根据得到的最终sql语句和执行传入参数到数据库执行,并得到执行结果
- 根据MappedStatement对象中的结果映射配置,对得到的执行结果进行转换,并得到最终结果
- 释放连接资源
-
返回处理结果
将最终结果返回