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中