文章目录
表之间的关联关系
关联关系是有方向的.
1)一对多关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在老师方,就是一对多关联.
2)多对一关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在学生方,就是多对一关联.
3)一对一关联:一个老师辅导一个学生,一个学生只请教一个老师.学生和老师是一对一.
4)多对多关联:园区划线的车位和园区的每一辆车.任意一个车位可以停任意一辆车.任意一车辆车可以停在任意一个车位上.
一对多关联关系
客户和订单就是典型的一对多关联关系.
一个客户名下可以有多个订单.
客户表是一方,订单表是多方.客户一中持有订单的集合.
使用一对多的关联关系,可以满足查询客户的同时查询该客户名下的所有订单.
首先修改实体类,添加无参构造方法,有参构造方法,tostring方法,setter,getter方法(下面代码省略
)
public class Customer { //customer表中的三个列 private Integer id; private String name; private Integer age; //该客户名下的多有订单,一方持有多方的集合 private List<Orders> ordersList; //------------------------------------------------------ public class Orders { private Integer id; private String orderNumber; private Double orderPrice; //包含客户对象,多对一,多方持有一方的对象 private Customer customer;
修改CustomerMapper.xml文件,
这里在绑定数据的时候使用了resultMap,这里主要关注一下resultmap的绑定过程
<mapper namespace="com.bjpowernode.mapper.CustomerMapper"> <!-- //根据客户的id查询客户所有信息并同时查询该客户名下的所有订单 Customer getById(Integer id) 实体类: //customer表中的三个列 private Integer id; private String name; private Integer age; //该客户名下的所有订单的集合 private List<Orders> ordersList; --> <resultMap id="customermap" type="customer"> <!--主键绑定--> <id property="id" column="cid"></id> <!--非主键绑定--> <result property="name" column="name"></result> <result property="age" column="age"></result> <!--多出来的一咕噜绑定ordersList Orders实体类: private Integer id; private String orderNumber; private Double orderPrice; --> <collection property="ordersList" ofType="orders"> <!--主键绑定--> <id property="id" column="oid"></id> <!--非主键绑定--> <result property="orderNumber" column="orderNumber"></result> <result property="orderPrice" column="orderPrice"></result> </collection> </resultMap> <select id="getById" parameterType="int" resultMap="customermap"> select c.id cid,name,age,o.id oid,orderNumber,orderPrice,customer_id from customer c left join orders o on c.id = o.customer_id where c.id=#{id} </select> </mapper>
编写测试类
@Test public void testGetCustomerById(){ Customer customer = customerMapper.getById(1); System.out.println(customer); }
这里可以看到,我们查询用户,该用户的订单也显示出来了。
多对一关联关系
订单和客户就是多对一关联.
站在订单的方向查询订单的同时将客户信息查出.
订单是多方,会持有一方的对象.客户是一方.
修改OdersMapper.xml文件
<mapper namespace="com.bjpowernode.mapper.OrdersMapper"> <!-- //根据主键查询订单,并同时查询下此订单的客户信息 Orders getById(Integer id); --> <!-- 手工绑定数据 实体类 private Integer id; private String orderNumber; private Double orderPrice; //关联下此订单的客户信息,多方持有一方的对象 private Customer customer; --> <resultMap id="ordersmap" type="orders"> <!--主键绑定--> <id property="id" column="oid"></id> <!--非主键绑定--> <result property="orderNumber" column="orderNumber"></result> <result property="orderPrice" column="orderPrice"></result> <!--多出来的一咕噜绑定 private Integer id; private String name; private Integer age; //该客户名下的所有订单的集合,一方持有多方的集合 private List<Orders> ordersList; //不用管 --> <association property="customer" javaType="customer"> <id property="id" column="cid"></id> <result property="name" column="name"></result> <result property="age" column="age"></result> </association> </resultMap> <select id="getById" parameterType="int" resultMap="ordersmap"> select o.id oid,orderNumber,orderPrice,customer_id,c.id cid,name,age from orders o inner join customer c on o.customer_id = c.id where o.id=#{id} </select> </mapper>
添加测试方法
@Test public void testGetOrdersById(){ Orders orders = ordersMapper.getById(11); System.out.println(orders); }
这里我们看到,查询订单的时候,用户的信息也随着查出来了。
一对一关联
下面的一对一以及多对多就不再写例子了,直接上总结。
多对多关联
园区划线的车位和园区的每一辆车.任意一个车位可以停任意一辆车.任意一车辆车可以停在任意一个车位上.
具体例子不在详细写了。看总结。
✨总结
无论是什么关联关系,如果某方持有另一方的集合,则使用标签完成映射,如果某方持有另一方的对象,则使用标签完成映射。
表关联在用途中,一对多,多对一比较常用,其余的比较少用。
下一节将会复习到
事务,缓存,ORM