在实际项目开发中,多对多关系也是非常常见的关系,比如,一个购物系统中,一个用户可以有多个订单,这是一对多的关系;一个订单中可以购买多种商品,一种商品也可以属于多个不同的订单,订单和商品就是多对多的关系。对于数据库中多对多关系建议使用一个中间表来维护关系,中间表中的订单d作为外键参照订单表的id,商品id作为外键参照商品表的id。
下面我们就用一个简单示例来看看MyBatis怎么处理多对多关系。
首先,在数据库创建三个表:TB_USER、TB_ARTICLE和TB_ORDER,再创建一个中间表维护TB_ARTICLE和TB_ORDER的关系,并插入测试数据。SQL脚本如下:
– 创建用户表
CREATE TABLE tb_user (
id INT PRIMARY KEY AUTO_ INCREMENT,
username VARCHAr(18),
loginname VARCHAr(18),
PASSWORD VARCHAr (18),
phone VARCHAr (18),
address VARCHAF (18)
);
– 插入用户表测试数据
INSERT INTO tb_user (username,loginname,PASSWORD,phone,address)
VALUES(‘张云’,‘jack’,‘123456’,‘13600000000’,‘杭州’);
– 创建商品表
CREATE TABLE tb_article(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAr (18),
price DOUBLE,
remark VARCHAr (18)
);
– 插入商品表测试数据
INSERT INTO tb_article(NAME,price,remark)
VALUIES(‘精通Python自然语言处理’,108.9,‘经典著作’);
INSERT INTO tb_article(NAME,price,remark)
VALUES(‘自然语言处理原理与实践’,99.9,‘经典著作’);
INSERT INTO tb_article(MAME,price,remark)
VALUES(‘大数据架构详解’,89.9,'经典著作’);
INSBRT INTO tb_article(NAE,price,remark)
VAIUES(‘推荐系统实践’,69.9,‘经典著作’);
– 创建订单表
CREATE TABLE tb_order(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAr(32),
total DOUBLE,
user_id INT,
FOREIGN KEY (user_id) REFBRENCES tb_user(id)
– 插入订单表测试数据
INSERT INTO tb_order (CODE,total,user_id)
VALUES('20180315ORDER1212,388.6,1);
INSERT INTO tb_ordor(CODE,total,user id)
VALUES('20180315ORDER1213,217.8,1);
– 创建中间表
CREATB TABLE tb_item(
order_id INT,
article_id INT,
amount INT,
PRIMARY KEY (order_id,article_id),
FOREIGN KEY (order_id) REPERENCES tb_order(id),
FOREIGN KEY (acticle_id) REERENCES tb_article(id)
);
– 创建插入中间表数据
INSERT INTO tb_item(order_id,article_id,amount)
VALUES (1,1,1);
INSERT INTO tb_item(order_id,article_id,amount)
VALUES (1,2,1);
INSERT INTO tb_item(orde_id, article_id,amount)
VALUES (1,3,2);
INSERT INTO tb_item(orde_id, article_id,amount)
VALUES (2,4,2);
INSERT INTO tb_item(orde_id, article_id,amount)
VALUES (2,1,1);
提示:
t_order表的user_id作为外键参照tb_user表的主键id。tb_item表作为中间表,用来维护tb_article和tb_order的多对多关系,tb_item表的order_id作为外键参照tb_order表的主键id,article_id作为外键参照tb_article 表的主键id
在数据库中执行SQL脚本,完成创建数据库和表的操作。接下来, 建一个User对象、一个Article对象和一个Order对象分别映射tb_user、tb_article和tb_order表。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
public class User implements serializable {
private Integer id; //用户id,主键
private string username; //用户名
private string loginname; //登录名
private string password; //密码
private string phone; //联系电话
private String address; //收货地址
//用户和订单是一对多的关系,即一个用户可以有多个订单
private List orders;
// 省略构选器和set/get方法…
}
用户和订单是一对多的关系,即一个用户可以有多个订单。在User类中定义了一个orders属性,该属性是一个List集合,用来映射一对多的关联关系,表示一个用户有多个订单。
public class Order implements Serializable {
private Integer id; //订单id,主键
private string code; //订单编号
private Double total; //订单总金额
// 订单和用户是多对一的关系,即一个订单只属于一个用户
private User user;
// 订单和商品是多对多的关系,即一个订单可以包含多种商品
private List
articles;


