前边我们讲过了动态SQL,即在mapper.xml的映射文件中堆存在的statement中的SQL进行if条件判断来拼接SQL,或者使用foreach语句来处理一个list或者数组类型的输入参数类型的数据。今天我们来讲一讲Mybatis的高级映射,即多张表关联的映射。
1.数据模型的分析
我们在Hibernate中讲过,有域模型和数据关系模型,而在Mybatsi中,我们在分析数据库中的多张表的关系时,首先要明白该表的业务内容,和重要字段(如主键,外键等),然后确立这张表和其他表的关联关系,最后再从业务层面来分析这张表和其他表的关联关系。
2.一对一映射查询
①.确立关联关系:表示表1中的每一条记录在表2中有且仅有一条记录与之对应,这种关系就叫做一对一关联。
②.编写SQL语句:先确定主表,再确定从表,然后确定关联条件
③.创建对应的POJO类(有resultType和resultMap两种方式)
④.编写mapper.xml:注意使用resultMap的方式使用到了<association>节点。
3.一对多关联关系
① 确立数据库表的关联关系:即表1的一条记录在表2中可能有多条记录与之对应。
② 编写SQL语句:确定主表,确定关联表
③ SQL显示的问题:在关联查询的数据中,因为主表和关联表存在着一对多的关联关系,所以有时会出现主表内容重复而关联表内容不重复的情况,为了解决这种情况,我们在主表对应的Java中添加一个List,其中包含的类型时关联表对应的Java类型。
④ 编写mapper.xml文件,需要在resultMap节点中使用collection来对应主表对应Java类的List属性。
4.多对多关联关系
① 有时一些表之间的关系在数据级别上并没有主外键关系,但是通过分析他们之间业务的关系可以看到主外键关系。
② 在mapper.xml中映射多对多关联关系时,可能就需要将resultMap中的assocaition和collection节点一起使用才可以映射多对多的关联关系。
③ 多对多的关联关系就是:表1和表2中的每一条数据记录都可能在对方的表中具有多条数据记录与之对应。