目录
一对多:一本书对应多种书本类型,例如:西游记 -> 神话、古典、名著
多对一:多本书指向一种书本类型,例如:西游记、山海经、聊斋志异 -> 神话
一个项目由多个人来开发,例如:A项目由张三、李四、王五来开发
一对多:一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a, 在多的一方,添加一的一方的主键作为外键
2.通过mybatis-generator插件生成dao、mapper、model层
3..配置mybatis关联映射文件------CustomerMapper.xml
建立实体层面的关联关系: 多对一:多个订单对应一个客户(一个订单对应唯一一个客户)
2.配置mybatis关联映射文件------OrderMapper.xml
在元素中,包含了一个子元素,MyBatis通过该元素来处理一对多关联关系。
在元素中,包含了一个子元素,MyBatis就是通过该元素来处理一对一关联关系。
2.通过mybatis-generator插件生成dao、mapper、model层
一:基本概念
关联关系是指类之间的引用关系,如果类A与类B关联,那么类A将被定义成类B的属性。
以下例子可以表现类之间的引用关系:
Adress类:
public class Address{
private String name;
}
B类:
public class B{
private String sid;
private Float score;
private Address address;
}
adress这个类被定义成类B的属性,可以通过B类来调用adress类的相关属性,它们之间存在着引用关系
二:关联关系的分类
一对一,一对多,多对一,多对多
关系的撰述:
一对多:一本书对应多种书本类型,例如:西游记 -> 神话、古典、名著
多对一:多本书指向一种书本类型,例如:西游记、山海经、聊斋志异 -> 神话
多对多:永远视为两个一对多
一个人负责多个项目开发,例如:张三负责 A B C
一个项目由多个人来开发,例如:A项目由张三、李四、王五来开发
三:实现关联关系的操作步骤
案例一:实现一对多关系
一对多:一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a, 在多的一方,添加一的一方的主键作为外键
1.将数据表导入数据库中
-- 一对多
-- 客户表(主表)
create table t_customer
(
customer_id int primary key not null auto_increment,
customer_name varchar(50) not null
);
-- 多对一
-- 订单表(从表)
create table t_order
(
order_id int primary key not null auto_increment,
order_no varchar(50) not null unique,
cid int not null,
foreign key(cid) references t_customer(customer_id)
);
-- 初始化代码
delete from t_order;
delete from t_customer;
-- 与mssql不一样,自动增长是可以赋值,也可以不赋值
insert into t_customer(customer_id,customer_name) values(1, 'zs');
insert into t_customer(customer_id,customer_name) values(2, 'ls');
insert into t_customer(customer_id,customer_name) values(3, 'ww');
insert into t_customer(customer_id,customer_name) values(4, 'xm');
insert into t_order(order_no,cid) values('P01',1);
insert into t_order(order_no,cid) values('P02',1);
insert into t_order(order_no,cid) values('P03',1);
insert into t_order(order_no,cid) values('P04',1);
insert into t_order(order_no,cid) values('P05',1);
insert into t_order(order_no,cid) values('P06',2);
insert into t_order(order_no,cid) values('P07',2);
insert into t_order(order_no,cid) values('P08',2);
insert into t_order(order_no,cid) values('P09',3);
insert into t_order(order_no,cid) values('P10',3);
SELECT * FROM t_customer;
SELECT * FROM t_order;
2.通过mybatis-generator插件生成dao、mapper、model层
如果有兴趣了解插件的配置,可以参考之前的博客:
重点:
- 建立实体层面的关联关系:
一对多:一个客户(customer)对应多个订单(order)
如果要建立一对多的关系,则要在客户实体类建立关系:
private List<Order> orders=new ArrayList<>();
客户实体类----Customer:
package com.tangyuan.model;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
/**
* 建立实体层面的关联关系:
* 一对多:一个客户(customer)对应多个订单(order)
*/
public class Customer {
private Integer customerId;
private String customerName;
//A:订单(Order) B:客户(Customer)
//一对多
private List<Order> orders=new ArrayList<>();
public Customer(Integer customerId, String customerName) {
this.customerId = customerId;
this.customerName = customerName;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public Customer() {
super();
}
public Integer getCustomerId() {
return customerId;
}
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
@Override
public String toString() {
return "Customer{" +
"customerId=" + customerId +
", customerName='" + customerName + '\'' +
", orders=" + orders +
'}';
}
}
CustomerMapper:
package com.tangyuan.mapper;
import com.tangyuan.model.Customer;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CustomerMapper {
/**
* 查询所有
* @return
*/
List<Customer> queryCustomer();
}
3..配置mybatis关联映射文件------CustomerMapper.xml
<resultMap id="one2many" type="Customer">
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
<!-- 一对多的关系 -->