为了“懒”,找到了MyBatis的一些使用小窍门

1.为了解决复杂结构减少调用交互,可以使用collection标签

博主的目的是为了构造如下图那样一对多对多关系的数据结构,考虑到了使用collection标签。collection标签的存在也是为了应对这样的需求。常规的实现方式可以直接在dao层添加几个获取列表的接口,然后遍历调用再进行赋值,可是这样做会非常的麻烦,频繁的调用也会增加数据库访问的开销。如果采用collection标签的形式,可以直接把这些常规的操作交给MyBatis去实现。这样就可以解放出双手,专注做一些关联关系的操作了。

为了“懒”,找到了MyBatis的一些使用小窍门为了“懒”,找到了MyBatis的一些使用小窍门

结构已经是明确的了,那接下来就要确定结构里一是如何与多进行关联的。根据目前的业务的话,就是通过实体里的id进行关联的。那接下来展示一下xml中是如何配置的。

为了“懒”,找到了MyBatis的一些使用小窍门

由于业务要求,还要查出不同类型下的collection中的数据,所以除了既定关联字段ID外还需要再传入一个固定参数typeId,但是基础结构里是没有这个字段的,那这应该是怎么办呢?好吧,没关系可以按下面这种骚操作,写死一个固定列。正如下图的右半部分一样,在返回的基础字段中添加所需要的固定的类型字段的id。这样就可以在调用dao层的方法时,传入两个参数了。

为了“懒”,找到了MyBatis的一些使用小窍门

解释一下collection标签中的一些属性的含义:

property:该属性的属性值是对应返回结构中的指定list的属性值,这块需要与属性值保持一致,不然最后的结果就是类DPHEnterprisePageVO中的list字段为空

javaType:这个就不用不用说了,代表的就是对应属性的java类型

ofType:由于返回的是个集合类型,那么此处就应该有具体类型的映射了,所以它就表示了List泛型里的类类型

select:这个属性值是所要调用的dao方法中的一个查询列表的方法,直接放入方法的引用地址即可

column:这个属性就有意思了,如果上面对应的dao方法是单参数方法,那么此处直接放入数据库返回字段对应的字段名即可,如果是需要传多个参数的话,那么就需要指明各个参数名对应的数据库字段名了,格式:{id=ID,typeId=DLIST}或以不用{}的形式也是可以的。

2.Java代码讲究复用,Mybatis的sql代码也不弱,用sql标签和include标签实现代码的复用

1)首先最直接的用法就是xml内部使用

用sql标签包裹sql语句段或者包含Mybatis标签的语句段,用include标签来进行引用,最终的运行结果就是相当于直接把sql标签里的内容移植到了引用include标签的位置,如下图,是一个简单的xml内部使用场景,具体业务描述就不赘述了。这样复用的好处就是省去了每次改完一个地方还要再去修改另外一处,还有可能会改出别的问题,大大简化了开发,提高的质量。

为了“懒”,找到了MyBatis的一些使用小窍门

2)最后说一下不同作用域之间如何实现复用

重点还是两个标签,这里还是借用这块的代码来说明,在一个xml里写了一段公用的sql代码片段,想要在另一个xml进行引用,思考怎么才能找到这个sql标签呢?其实还是通过include标签。在内部使用时,include标签里的refid属性指定的是sql片段的id,既然是id那么这个id就只能是在本xml范围内唯一,那如何让别的xml也能直接定位到这个sql段呢?那就不能直接通过id来关联了,这就需要在id前面加上命名空间,对于xml而言就是xml映射的dao接口的唯一限定名,形如:<include refid="namespace.sqlid"/>,具体实例如下图所示

为了“懒”,找到了MyBatis的一些使用小窍门

以上是不是省去了很多步骤。后续会继续更新MyBatis的一些使用窍门。