mybatis多对多关联关系映射
mybatis多对多关联关系映射
多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性。而这连个实体都需要包含对方的集合类的属性。
例如:订单和商品,一个订单包含多个商品,一个商品又可以属于多个订单。
对这样的多对多关系,需要建立一个中间表,来维护这样的关系,在中间表中包含了两个表的主键字段作为外键,而中间表则另选一个字段作为这个中间表的主键。
--商品表
CREATE TABLE tb_product(
id int(32) PRIMARY KEY auto_increment,
name VARCHAR(30),
price DOUBLE
)
--订单表
CREATE TABLE tb_orders (
id INT ( 32 ) PRIMARY KEY auto_increment,
number VARCHAR ( 32 ) NOT NULL,
user_id INT ( 32 ) NOT NULL,
FOREIGN KEY ( user_id ) REFERENCES tb_user ( id )
);
--中间表 商品表和订单表多对多关联的中间表
create TABLE tb_orderitem(
id int(32) PRIMARY KEY auto_increment,--作为中间表的主键
orders_id int(32),
product_id int(32),
FOREIGN KEY(orders_id) REFERENCES tb_orders(id),
FOREIGN KEY(product_id) REFERENCES tb_product(id)
);
对应的java实体类
//商品表持久化类
public class Product {
private Integer id;
private String name;
private Double price;
private List<Orders> orders; //与订单的关联属性,为多对多形式
setter/getter方法
}
//订单持久化类
public class Orders {
private Integer id;
private String number;
private List<Product> productList;//与订单是多对多关系,多对多关系是都要在对方的属性中添加对方的属性列表
setter/getter方法
}
/**
*注意,两个类中的属性,都有关联的list
*/
mapper接口和mapper映射文件
public interface OrdersOfProcduct {
List<Orders> findOrdersInfo(int id);//根据id查询订单列表
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.jason.bootmybatis.mapper.OrdersOfProcduct">
<!--多表联合查询-->
<select id="findOrdersInfo" parameterType="Integer" resultMap="OrderOfProductResult">
select o.*,p.id as pid,p.name,p.price
from tb_orders o join tb_product p join tb_orderitem oi
on oi.orders_id=o.id and oi.product_id=p.id and
o.id=#{id}
</select>
<!--结果集映射-->
<resultMap id="OrderOfProductResult" type="Orders">
<id property="id" column="id"/>
<result property="number" column="number"/>
<!-- 多对多关联映射-->
<collection property="productList" ofType="Product">
<id property="id" column="pid"/>
<result property="name" column="name"/>
<result property="price" column="price"/>
</collection>
</resultMap>
</mapper>
service业务层接口和实现类
public interface OrdersOfProducts {
List<Orders> findOrdersOfProductByorderid(int id);
}
//实现类
@Service
public class OrdersOfProductsImpl implements OrdersOfProducts {
@Autowired
private OrdersOfProcduct ordersOfProcduct;
@Override
public List<Orders> findOrdersOfProductByorderid(int id) {
return ordersOfProcduct.findOrdersInfo(id);
}
}
测试控制器类
![多对多关系测试结果](D:\gitTask\dev\intern\chenhongjun\第五周go和java操作mysql\images\多对多关系测试结果.png)@Controller
@ResponseBody
public class manyTomany {
@Autowired
private OrdersOfProducts ordersOfProducts;
@RequestMapping("/findordersproductinfo/{id}")
public String find(@PathVariable int id){
return ordersOfProducts.findOrdersOfProductByorderid(id).toString();
}
}
测试结果
总结:
对于多对多关系映射,需要产生一个中间表,来存放关联表的主键,A,B,在java实体类中,需要在A中声明一个集合类型为B的集合属性,在B中也需要声明一个集合属性为A的属性。对于mapper映射文件的编写,还是需要采用嵌套结果,这样方便一些。
mybatis多对多关联关系映射的更多相关文章
- mybatis一对多关联关系映射
mybatis一对多关联关系映射 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List 属性名 作为少的一方的属性. 用户和订单 ...
- (转)Hibernate框架基础——多对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...
- Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
- Java基础-SSM之mybatis一对多和多对一关系映射
Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建customers表: ...
- mybatis之关联关系映射
Mybatis关联关系映射 1.一对多 首先先用逆向生成工具生成t_hibernate_order.t_hibernate_order_item 这两张表对应的model与mapper OrderVo ...
- mybatis一对一关联关系映射
mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加&qu ...
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...
- 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多
学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
随机推荐
- [CSP-S模拟测试]:装饰(状压DP)
题目传送门(内部题114) 输入格式 第一行一个正整数$n$. 接下来一行$n-1$个正整数,第$i$个数为$f_{i+1}$. 接下来一行$n$个数,若第$i$个数为$0$则表示林先森希望$i$号点 ...
- 教材代码完成情况测试P171(课上测试)
一.任务详情 0 在Ubuntu中用自己的有位学号建一个文件,教材p171 Example7_7 增加一个类DangerException2, 显示"超轻"异常,超轻的阈值minC ...
- maven仓库,snapshot快照仓库和release发布仓库的区别
首先看下snapshot类型 建立一个maven-privider项目,版本定义为1.1-SNAPSHOT 创建一个privider类,写一个hello()方法,并推送maven私有仓库 然后再建立一 ...
- VS2017 -error LNK1104: 无法打开文件“msvcprtd.lib”
原文地址:https://blog.csdn.net/u012308586/article/details/89309495 VS2017 -error LNK1104 无法打开文件“msvcprtd ...
- OPCDAAuto的一个坑
最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...
- elasticsearch-6.2.3单机搭建
1.这里说明下,elasticsearch为了保证安全性需要创建新的用户名,需要在新的用户名下运行,本人用的是elasticsearch-6.2.3,centos7.3 2.切换目录到:cd usr/ ...
- 【HANA系列】SAP HANA行列转换
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA行列转换 前 ...
- python学习之模块-模块(二)
5.2 序列化模块 将一种数据结构转换成一种特殊的序列(字符串或bytes)的过程就叫序列化.这个特殊的序列还可以通过命令反解回原来的数据类型. python中有三种序列化的功能模块: json模 ...
- 微服务简历V1.0
张三 电话:xxx-xxxx-xxxx 邮箱: xxxxxxx@qq.com 年龄:x岁 籍贯:江苏 求职意向:java开发工程师 期望薪资:面议 专业技能 熟练使用Ecl ...
- 2 Java中常见集合
1)说说常见的集合有哪些吧? 答:集合有两个基本接口:Collection 和 Map. Collection 接口的子接口有:List 接口.Set 接口和 Queue 接口: List 接口的实现 ...