
resultMap:
<resultMaps>
<resultMap id="FullResultMap" class="Admin">
<result property="AdminId" column="adminId" dbType="Int"/>
<result property="LoginName" column="loginName" dbType="NVarChar"/>
<result property="Password" column="password" dbType="NVarChar"/>
<result property="Keyword" column="keyword" dbType="NVarChar"/>
</resultMap>
</resultMaps>
意思就是配置数据库返回的字段与实体类的对应关系。这个一般不需要
在 select 语句中查询得到的是一张二维表, 水平方向上看是一个个字段, 垂直方向上看是一条条记录。作为面向对象的语言, Java 中的的对象是根据类定义创建的。 类之间的引用关系可以认为是嵌套的关系。
在 mybatis 中, resultMap 节点定义了结果集和结果对象(JavaBean)之间的映射规则。
本文主要讲解的是 resultMap 的解析。
两个基础类
在阅读本文之前, 最好能对这两个类有相应的理解。
1.1、列映射类ResultMapping
ResultMapping 对象记录了结果集中一列与队友JavaBean中一个 属性的对应关系
解析
2.1、入口函数
resultMap 是 mapper.xml 文件下的, 因此其是解析 Mapper 的一个环节。
解析, 由于是可以有多个的, 因此, context.evalNodes("/mapper/resultMap")返回的是一个 List。
2.2、整个过程就是 resultMapElement 这个函数。
其流程大体如下:
对应的代码
2.3、获取 id
id 对于 resultMap 来说是很重要的, 它是一个身份标识。 具有唯一性
这里涉及到 XNode 对象中的两个函数
该函数是获取 XNode 对象对应 XML 节点的 name 属性值, 如果该属性不存在, 则返回传入的默认值 def。
而在获取 id 的过程中, 默认值是下面这个函数
该函数是生成元素节点的id, 如果是这样子的 XML。
我们调用
则, 返回值应该是
2.4、解析结果集的类型
结果集的类型, 对应的是一个 JavaBean 对象。 通过反射来获得该类型。
看源码, 有很多个 def 值, 也就是说, 我们在配置结果集的类型的时候都是有优先级的。 但是, 这里有一个奇怪的地方, 我源代码版本(3.5.0-SNAPSHOT)的 的属性, 只有 type, 没有 ofType/resultType/javaType。 以下为相应的 DTD 约束:
我怀疑是兼容以前的版本。
2.5、获取继承结果集和自动映射
这个两个属性都是在配置 XML 的时候可有可无的。
2.6、解析
先看 DTD 约束
可以有以下几个子节点:
根据类型进行解析, 最后获得 resultMappings
除了 discriminator 节点, 其余节点最后都会回到 buildResultMappingFromContext 方法上, 该方法是创建 ResultMapping 对象。
如果是 discriminator, 则处理该元素并创建鉴别器。
鉴别器内部, 也是含有 ResultMapping 的
2.7、创建 ResultMap 对象
在解析完 的各个属性和子节点之后。 创建 ResultMapResolver 对象, 通过对象可以生成 ResultMap。
解析结果
有如下的数据库表
通过代码生成器生成 XML 和 Mapper。
添加结果集
对应的 sql
则最后解析出的结果
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)