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的解析,自动填充对象的映射,等等。想要有更深的了解还需进一步精度这些代码。