Mybatis源码笔记(六)、ResultHandler

ResultHandler 接口比较简单,主要用于处理 ResultContext 对象

public interface ResultHandler<T> {

  void handleResult(ResultContext<? extends T> resultContext);

}

ResultHandler 主要有两个实现,分别是 DefaultResultHandler 和 DefaultMapResultHandler

  @SuppressWarnings("unchecked")
  public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;
    this.reflectorFactory = reflectorFactory;
    this.mappedResults = objectFactory.create(Map.class);
    this.mapKey = mapKey;
  }

  @Override
  public void handleResult(ResultContext<? extends V> context) {
    final V value = context.getResultObject();
    final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
    // TODO is that assignment always true?
    final K key = (K) mo.getValue(mapKey);
    mappedResults.put(key, value);
  }

  public Map<K, V> getMappedResults() {
    return mappedResults;
  }
}

public class DefaultResultHandler implements ResultHandler<Object> {

  private final List<Object> list;

  public DefaultResultHandler() {
    list = new ArrayList<>();
  }

  @SuppressWarnings("unchecked")
  public DefaultResultHandler(ObjectFactory objectFactory) {
    list = objectFactory.create(List.class);
  }

  @Override
  public void handleResult(ResultContext<?> context) {
    list.add(context.getResultObject());
  }

  public List<Object> getResultList() {
    return list;
  }

}

区别的化一目了然,DefaultMapResultHandler 将处理结果存储在一个 Map 对象中,DefaultResultHandler 将结果存储在一个 List 对象中。

总结:

至此,我们的主线流程大致的也就有了一些了解,对应于传统的 JDBC 方式,我们一步一步地分析了源码,他们是如何运作的,基本上已经明了了。实际上mybatis的框架还是很复杂的,其中一些很复杂的逻辑我们并没有实际深入,比如boundSql的解析,自动填充对象的映射,等等。想要有更深的了解还需进一步精度这些代码。

发表评论

邮箱地址不会被公开。 必填项已用*标注