前言
Mybatis的设计目的,是为了让开发者执行sql时,对输入输出的管理更加方便。所以更方便、更简单、更好用的设计思路,才形成了mybatis的核心竞争力,从群雄逐鹿的时代洪流中一路成长至今。
总体设计图
此图参照网上例子绘制
- 内置方法:mybatis里已经为Mapper定义了一些默认方法,比如delete、selectOne、selectList、update、insert等,可以让用户以最小代价开启编程之旅,也是Mybatis的初心所在,即足够的便利性,降低学习成本和门槛。
- 自定义方法:用户在注解或者XML配置文件中定义的特定业务SQL,是Mybatis灵活性的一个充分体现。
这里带一句,其实自定义方法最终执行时,也会调用内置方法进行处理。
总体流程
Mybatis的一个重要组成部分就是Mapper和其XML配置文件,容器加载初始化时,通过解析Mapper和配置文件,得到所有的Statement执行语句和相应的ParameterMap、ResultMap对象,用于处理请求参数和返回对象,这也是上图展示中的数据处理层的核心功能。这样的话,加上Mybatis的数据库连接池,一个SQL方法执行所需要的条件,就都具备了。
大概的执行过程,在上一章节中已经介绍,这里不再赘述。
核心部件
- 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对象之中
支持插件的组件
在Configuration类的源码中,可以观察插件注册字段【interceptorChain】,支持注册的组件:
- ParameterHandler,处理请求参数
- ResultSetHandler,处理请求结果
- StatementHandler,处理请求过程
- Executor,处理请求全过程
每个组件可以拦截的方法,都是不一样的,充分满足开发者的各种脑洞。
数据解析
分为两个部分
- 请求参数:根据在statement中定义的paramaterMap中的对象类型,解析出参数的java数据类型,然后构建对应的TypeHandler对象,完成解析,后续会开个单章详细介绍;
- 结果数据:与参数类似,返回结果是通过ResultMap定义的,主要是解决sql语句返回的字段和java属性的映射关系,也是有TypeHandler进行转换的,可以自定义。