一、前言
mybatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或bcnf,但实际事与愿违,那么结果集映射就是mybatis为我们提供这种理想与现实间转换的手段了,而resultmap就是结果集映射的配置标签了。
二、从sql查询结果到领域模型实体
在深入resultmap标签前,我们需要了解从sql查询结果集到javabean或pojo实体的过程。
1. 通过jdbc查询得到resultset对象
2. 遍历resultset对象并将每行数据暂存到hashmap实例中,以结果集的字段名或字段别名为键,以字段值为值
3. 根据resultmap标签的type属性通过反射实例化领域模型
4. 根据resultmap标签的type属性和id、result等标签信息将hashmap中的键值对,填充到领域模型实例中并返回
三、resultmap标签
1. 属性说明
id属性 ,resultmap标签的标识。
type属性 ,返回值的全限定类名,或类型别名。
automapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultmap`内明确注明映射关系才会调用对应的setter方法。
2. 基本作用:建立sql查询结果字段与实体属性的映射关系信息
示例1:通过setter构造领域模型
子元素说明:
id元素 ,用于设置主键字段与领域模型属性的映射关系
result元素 ,用于设置普通字段与领域模型属性的映射关系
示例2:通过构造函数构造领域模型
子元素说明:
constructor元素 ,指定使用指定参数列表的构造函数来实例化领域模型。注意:其子元素顺序必须与参数列表顺序对应
idarg子元素 ,标记该入参为主键
arg子元素 ,标记该入参为普通字段(主键使用该子元素设置也是可以的)
注意:在采用嵌套结果的方式查询一对一、一对多关系时,必须要通过resultmap下的id或result标签来显式设置属性/字段映射关系,否则在查询多条记录时会仅仅返回最后一条记录的情况。
4. 动态映射关系信息
通过 discriminator子元素 (鉴别器)可以实现动态映射关系信息的设置。具体示例如下:
情景:查询学生信息的seniorhighschool信息,若就读时间during字段值为4、5、6时,则以juniorhighschool字段作所为seniorhighschool信息。
注意:上面关于 discriminator子元素 的 case元素 的 resulttype属性 和 resultmap元素 的 type属性 ,均不是直指返回的领域模型类型,而是指定根据判断条件后得到映射关系,可通过 id子元素 和 result子元素 重写映射关系。
5. id元素,result元素,idarg元素,arg元素,discriminator元素的共同属性
javatype属性 :java类的全限定名,或别名
jdbctype属性 :jdbc类型, jdbc类型为cud操作时列可能为空时进行处理
typehandler属性 :指定类型处理器的全限定类名或类型别名
column属性 :指定sql查询结果的字段名或字段别名。将用于jdbc的 resultset.getstring(columnname)
四、总结
掌握上述内容,那么在写一对一关系、一对多关系查询时就更有把握了哦!