MyBatis学习(十)

69 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第40天,点击查看活动详情

新增 7k 多的病例还是开放了,害怕

MyBatis源码初步

MyBatis发送SQL语句是通过代理我们的Mapper,并通过命名空间找到对应的xml文件,并通过方法名对应到xml文件中的SQL语句。接下来简单了解下SQL语句执行完成之后MyBatis对结果集的处理。

处理结果集

查询得到的结果并没有直接返回,而是交给 ResultHandler对象处理。ResultHandler是结果处理器,用来接收此次查询结果的方法是该接口中的抽象方法 handleResultSets。
最终实际执行的方法是 DefaultResultSetHandler中的 handleResultSets 方法。 image.png 查询出来的结果被遍历后放入了列表multipleResults 中并返回。multipleResults中存储的就是这次查询期望的结果 List<Object>
在结果处理中,我们最关心的是 MyBatis如何将数据库输出的记录转化为对象列表,因此详细追踪这个过程。然而整个过程非常长,在 DefaultResultSetHandler 的方法中进行了多次跳转。其中经过的方法最重要的有如下三个:

  • createResultObject(ResultSetWrapper, ResultMap, List<Class<?>>, List<Object>, String)方法:该方法创建了输出结果对象。在示例中,为 User对象。
  • applyAutomaticMappings 方法:在自动属性映射功能开启的情况下,该方法将数据记录的值赋给输出结果对象。
  • applyPropertyMappings 方法:该方法按照用户的映射设置,给输出结果对象的属性赋值。 其中createResultObject(ResultSetWrapper, ResultMap, List<Class<?>>, List<Object>, String)方法根据输出对象的不同,使用类型处理器或通过调用构造方法等方式创建输出结果对象。

image.png 之后,以上方法逐级返回。最后,装载着对象列表的 multipleResults 被返回给 List<Object> res 变量,我们便拿到了查询结果。追踪到这里,方法就执行完成了。