ResultSetHandler
2021-07-09 21:08:10 0 举报
Mybatis 的 ResultSetHandler 的主要结构
作者其他创作
大纲/内容
applyNestedResultMappings(),给连接嵌套的map中的属性赋值:1、获取所有mapping映射关系,只处理嵌套的map2、针对循环引用的逻辑3、尝试从暂存区中获取对象,一般都没有4、第一次获取时会根据映射关系创建属性的类,如list5、调用getValue封装嵌套的对象6、把封装好的对象通过metaObject填充到map属性中
有
如果连接查询结果被封装成集合的话,回到handleRowValuesForNestedResultMap()开始处理第二行数据
1、嵌套map相关判断2、尝试从暂存区获取已经封装了部分的对象(一个person可能有多个user但是所有person行数据都应该只对应一个1person)3、getRowValue()复杂重载版: a.嵌套map相关判断 b.通过createResultObject();创建对应空对象 c.通过metaObject封装对象 d.自动映射赋值(在使用嵌套map时默认是关闭的) e.手动映射赋值 applyPropertyMappings() f.对嵌套的map进行赋值:applyNestedResultMappings() g.懒加载逻辑 h.将当前行解析好的数据放入暂存区
DefaultResultSetHandler
无
handleResultSet()处理结果集
handleRowValues();处理结果行
handleRowValuesForNestedResultMap()
getPropertyMappingValue():1、如果这个属性对应的是另一个查询,则通过getNestedQueryMappingValue调用另一个查询语句,中间有延迟加载、缓存的逻辑。涉及到循环引用的问题2、否则直接获取值然后返回
有无嵌套的ResultMap
PreparedStatementHandler#query
handleRowValuesForSimpleResultMap()对每一行结果调用getRowValue()封装成一个Java对象
嵌套map指的是直接在resultMap的association等标签中指定了列和属性的对应关系,而不是指定另一个查询来封装对象。一般来说通过连接查询结果封装对象的都是嵌套map。
暂存区:nestedResultObjects会保存每个从数据行中解析出来的对象,一个map,key是resultmap的id和能区别对象的列
applyPropertyMappings,手动赋值:1、获取所有列名和对应的映射关系2、如果是连接嵌套map属性,跳过3、通过getPropertyMappingValue()获取列对应的值4、通过metaObject工具给对象赋值
创建对象:1、Integer等原始类型直接创建2、基于mapper的构造函数映射创建3、返回接口或有无参构造器时,ObjectFactory创建4、基于自动映射的顺序和构造器参数的顺序创建
收藏
0 条评论
下一页