Mybatis学习第四弹

今天主要谈谈 Mybatis 中对查询的结果集封装规则的学习。

通常来说,对于 POJO 我们只需要使用 resultMap 标签对查询的结果集进行封装简单即可,使用 id 子标签封装主键查询结果,使用 result 子标签封装其他列查询结果,使用 result 封装主键,但是不推荐这样做,因为

id 子标签对主键的封装会进行底层优化;其中,使用 column 属性指定查询的列名,使用property 属性指定类的属性名

除此之外,我们通常会遇到一些比较复杂的情况,比如:

1、类的属性是一个 java 对象且查询语句如果采用联合查询,就需要一些特殊的处理才能封装结果集,比如可以指定 result 标签的 property 属性为『a.b』,采用级联属性的方式封装结果集;也可以使用 resultMap 的association 子标签来封装对象属性,其中 property 属性指定属性名,javaType 属性指定对象所属的类的全类名且必须指定。

2、类的属性是一个 java 对象且使用分步查询,此时同样使用 association 标签来定义封装规则,其中 property 属性指定属性名,select 属性指定下一步查询语句所在的命名空间及 id ,column 属性指定将哪一列的值传递给下一步查询语句。

3、类的属性是一个集合类型元素且采用联合查询,此时使用 resultMap 的 collection 子标签定义封装集合类属性的规则,其中 property 属性指定集合属性名,ofType 指定集合类型元素所属类的全类名,然后在 collection 标签中使用 id 和 result 标签正常定义封装规则即可。

4、同上2,也可以采用分步查询并定义相应的封装规则,此时 collection 的property 标签指定集合属性名,select 属性指定集合类型元素所属类的全类名,column 属性指定将某列的值传递给下一查询语句,同时不需要再在collection 标签中在定义封装规则。

5、分步查询时如果需要将多列的值传递到下一个查询语句,可以采用封装 map 的方式,例如 column = “{key1=column1,key2=column2}”。

6、association 标签和 collection 标签中都有 fetchType 属性,可以设定值为 lazy(延迟)和 eager(立即)来开启和关闭延迟加载功能,且该属性会覆盖 Mybatis 的全局设置。

tip:如果需要根据查询得到的某一列的值改变结果集的映射行为,可以使用 discriminator 标签,其中 javaType 必须指定为对应属性的java 类型,column 指定为列名;在子标签 case 中,value 属性指定为需要鉴别的值,resultType 指定为结果集封装的类名;case 标签中定义的封装规则将会与上一级封装规则合并并且取最新的规则。

关注微信公众号:Javall咖啡屋
每天更新各种技术学习心得体会

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值