一 什么是多变关联
1.所谓的多变关联,就是表结构中存在多对一,一对多的现象,当然也存在多对多。
2.在真正的工作中,经常存在多表关联的存在,就是说外键的存在。比如说:商品表goods,会关联一个分类表,将每个商品进行分类处理。
3.Bean类中的多变关联,作为分类表,应该存在有一个List对象来存放属于该分类的商品对象。而每个商品表中也应该有一个分类bean对象用于说明商品的分类信息
4.在JDBC的正常操作中,我们需要通过两次查询来依次存放数据来完成商品Bean,分类Bean对象,当然这使用MyBatis同样可以做到
5.在MyBatis中,提供了一些操作可以使我们在一次查询中将直接完成Bean
二 多变关联实现(一)
1.操作原理:
(1)在单表操作中,我们使用resultType来指定返回类型,并将得到的值依次类型传递到业务逻辑中去,而在多变关联查询中,我们则不使用resultType,而是使用resultMap将返回值以Map的形式传递到resultMap操作中。
(2)如何映射相应的resultMap?必须使得select中的resultMap的值与resultMap中的id值保持一致
(3)将返回值作为Map的话,列名作为key,那多条语句的key值重复问题?我们必须明确,在SQL语句中的多条语句查询,是像指针逐条逐条输出的,所以每次都是一个新的map虽然key值都是这些列名,但是Value值却随着指针的改变而改变。这也是为什么当我们需要返回一个List对象是,resultType依旧要写List泛型中的Bean类。
2.一对多与多对多的实现
resultMap的实现
执行结果
(1)所谓一对多与多对多无非就是查询一条与多条的区别,除了返回值一个是bean 对象一个是List对象外并没有本质区别
(2)id与result,id用于设置主键的映射关系(这里也包括外联表的主键),而result则用于设置非主键的映射关系
(3)collection中,用于设置外联表的映射,使用ofType来设置外联表的Bean类,而原本表的bean类由resultMap中的Type属性确定
(4)column与property:column则是列名,即SQL语句返回出来的列名,property则是Bean对象的属性名
3.多对一的实现
select语句:不用在意useCache属性,这是用于设置缓存的属性,与这次无关
resultMap语句:
(1)基本是所有东西与一对多相似,下面只说区别
(2)assciation替换javaType
三 多变关联实现(二)
1.一次查询的缺陷
我们发现这种写法实际上是很麻烦的,他需要将表关联起来,就是使用连接的方式,也就是这样
即使是一对多也会是这样
导致了分类表信息大量的重复,如果只是这几条数据没什么问题,但是当数据量过大时则会出现效率问题,所以我们还是应该采用两次查询来完成操作,当然对于业务逻辑层的执行依旧是一次操作(不然的话,我们费力干这些是为了干嘛?)
2.两次查询的操作
执行结果
(1)我们本质上还是针对于selClassifyOneAndAll进行了查询
(2)当返回结果进入classifySepMap中后,先是映射id和result属性,在进入collection标签中,而collection标签中则使用select访问下一次查询,并将主键使用column属性传递到下次查询中,找到相应外键值并传递
(3)property中的list并非指类,而是Classify中的属性名,第二次查询(selGoodsByCid)会将结果返回成Goods的集合传递到这个属性中。
四 多变关联实现(三)
1.约束 : 这种实现要求在select中讲结果使用别名的方式与对象中的属性名映射起来且值是用于多对一查询
2.对于bean对象的内部bean对象属性,要使用“bean属性名.bean对象属性名的“的方式来指定,但是由于点在SQL语句中有特殊含义,所以需要使用 `` 来取消他的特殊含义。
执行结果