前言:
mybatis作为一个持久层框架,是一个致力于面向程序员,需要程序员自行编写相关的sql语句的orm框架,而开发中涉及到的sql,一较多的基本是查询的sql,由于表与表之间的关系,我们经常需要处理一对一,一对多,和多对多关系的查询语句,而针对这些关联关系,经常用到的是association标签和collection标签。
1)一对一查询:
案例:假设一个用户可以创建多个订单,而一个订单只能由一个用户创建,因此,用户与订单属于一对多关系,而订单与用户属于一对一关系。
user类:
orders类:
sql语句,根据orders表中的user_id外键与user表中的id关联
mapper接口:
测试:
先加载全局xml文件,最终得到sqlsessionfactory工厂对象
结果:
上边resultMap里边的相关标签和属性:
id标签:property编写实体类对应的主键id,column编写映射的结果集的id字段;
result标签:其他非主键使用result标签;
property:实体类中相应的属性;
column:查询映射结果集对应的列的字段;
association标签(一对一关联关系使用):该标签中的property=user,指将关联查询带的用户信息映射到user属性,也就是上边orders中的user属性;
javaType:user属性所属的pojo类;
2)一对多查询:
案例:
查询订单并关联查询订单详情,要求映射的结果集,有用户信息,订单信息,和订单详情信息。
分析:一份订单里边可以有多个商品,订单详情指针对每种商品的相关信息的描述,以及订单的创建时间,编号等。所以订单与详情属于一对多关系。
orderdetail类:
orders类:
sql语句:
关于collection标签中的相关属性和上边的association标签类似,区别之一只是一个使用的是javaType一个使用的是ofType
接口定义和上边差不多,这里就不写了,只需要知道使用mybatis实现mapper代理时,要满足:
mapper接口名和mapper.xml中的select标签的id值保持一致;
返回值和resultType或resultMap的type保持一致;
有参数时,只需要保证参数和parmentType指定的类型一致;
测试:
结果:
3)多对多查询:
案例:一份订单里边可以有多个商品,同种商品可以在多份订单中,因此,订单与商品的关系属于多对多关系;一条订单详情,描述一种商品,订单详情与商品又属于一对一关系。
在本次demo中,订单与商品关联是通过订单详情表关联起来的,即订单详情起到一个中间表的作用:
orderdetail类:
sql语句:
测试结果: