Mybatis如果将将查询结果封装为list ?

整个过程在handleRowValuesForNestedResultMap()方法中完成。流程如下

在DefaultResultSetHandler中的nestedResultObjects用于存放封装每一行数据的Java对象,是一个Map集合。

在Mybatis处理结果集的时候,是一行一行处理的。
1. 生成key。该key用于从nestedResultObjects中获取Object。生成规则主要是拼接当前行的主键值及其对应的ColumnName。比如下面这个key:
-1013422398:-1528515008:com.blog.mapper.BlogMapper.blog:bid:4

2. 从nestedResultObjects中获取Object

3. 如果Object为null,表示该主键值所对应的对象还没有被封装过。执行3.1。
如果object不为null,则直接对该Object的内嵌ResultMap属性赋值,执行3.4。
3.1 创建用于封装当前行数据的空Object。实际是使用反射利用构造器创建的一个空Object。
3.2 获取该Object的元对象metaObject。后期操作都是基于这个元对象的。
3.3 遍历propertyResultMappings,开始给该metaObject赋值
3.3.1 当前propertyMapping中没有内嵌query。获取当前propertyMapping的typeHandler,调用typeHandler.getResult(resultSet,column)获取当前column下对应的value。底层是调用ResultSet的get方法。
3.3.2 当前propertyMapping中有内嵌query。执行内嵌query,查询结果即为当前column对应的value。
3.4 给metaObject的内嵌ResultMap属性赋值。创建当前ResultMap对应的Java空对象,执行3.1~3.4,将最终初始化的对象注入到该metaObject中,这是一个递归过程。最后将metaObject返回。
3.5 检查nestedResultObjects中是否有当前key。如果没有,就将该metaObject放入nestedResultObjects中。
3.6 将初始化后的行对象放入resultSet中的list集合。
流程图如下
Mybatis中结果集封装

相关文章: