水煮MyBatis(五)- 总体设计策略

130 阅读3分钟

前言

Mybatis的设计目的,是为了让开发者执行sql时,对输入输出的管理更加方便。所以更方便、更简单、更好用的设计思路,才形成了mybatis的核心竞争力,从群雄逐鹿的时代洪流中一路成长至今。

总体设计图

此图参照网上例子绘制

image.png

  • 内置方法: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进行转换的,可以自定义。