SSM学习08MyBatis关联映射多对多

和上一个相同还是<collection>是多对多映射,一个订单可能包含多个产品,而每个商品有可能出现在多个订单中,在数据库中这样的情况就需要一张中间表来维护。

1.在mybatis中建表:

 1 create table tb_product(
 2     id int(32) primary key auto_increment,
 3     name varchar(32),
 4     price double
 5 );
 6
 7 insert into tb_product values(‘1‘,‘Java基础入门‘,‘44.5‘);
 8 insert into tb_product values(‘2‘,‘Java Web程序开发入门‘,‘38.5‘);
 9 insert into tb_product values(‘3‘,‘SSM框架整合实战‘,‘50‘);
10
11 create table tb_ordersitem(
12     id int(32) primary key auto_increment,
13     orders_id int(32),
14     product_id int(32),
15     foreign key(orders_id) references tb_orders(id),
16     foreign key(product_id) references tb_product(id)
17 );
18
19 insert into tb_ordersitem values(‘1‘,‘1‘,‘1‘);
20 insert into tb_ordersitem values(‘2‘,‘1‘,‘3‘);
21 insert into tb_ordersitem values(‘3‘,‘3‘,‘3‘);

   可以看出tb_ordersitem中引用了tb_prduct和tb_orders中的主键作为外键。

Product:

  

 1 package com.zyk.po;
 2
 3 import java.util.List;
 4
 5 public class Product {
 6     private int id;
 7     @Override
 8     public String toString() {
 9         return "Product [id=" + id + ", name=" + name + ", price=" + price + ", orders=" + orders + "]";
10     }
11     private String name;
12     private Double price;
13     private List<Orders> orders;
14     public int getId() {
15         return id;
16     }
17     public void setId(int id) {
18         this.id = id;
19     }
20     public String getName() {
21         return name;
22     }
23     public void setName(String name) {
24         this.name = name;
25     }
26     public Double getPrice() {
27         return price;
28     }
29     public void setPrice(Double price) {
30         this.price = price;
31     }
32     public List<Orders> getOrders() {
33         return orders;
34     }
35     public void setOrders(List<Orders> orders) {
36         this.orders = orders;
37     }
38
39
40 }

Order:

 1 package com.zyk.po;
 2
 3 import java.util.List;
 4
 5 public class Orders {
 6     private int id;
 7     @Override
 8     public String toString() {
 9         return "Orders [id=" + id + ", productlist=" + productlist + ", number=" + number + "]";
10     }
11     private List<Product> productlist;
12     private String number;
13     public List<Product> getProductlist() {
14         return productlist;
15     }
16     public void setProductlist(List<Product> productlist) {
17         this.productlist = productlist;
18     }
19
20     public int getId() {
21         return id;
22     }
23     public void setId(int id) {
24         this.id = id;
25     }
26     public String getNumber() {
27         return number;
28     }
29     public void setNumber(String number) {
30         this.number = number;
31     }
32
33
34 }

从两个javabean中可以看出:product中有order,order中有product

OrderMapper.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <mapper namespace="com.itheima.mapper.OrdersMapper">
 5     <select id="findOrdersWithProduct" parameterType="Integer" resultMap="OrdersWithProductResult">
 6         select o.*,p.id as pid,p.name,p.price
 7         from tb_orders o,tb_product p,tb_ordersitem oi
 8         where oi.orders_id=o.id
 9         and oi.product_id=p.id
10         and o.id=#{id}
11     </select>
12     <resultMap type="Orders" id="OrdersWithProductResult">
13       <id property="id" column="id"/>
14       <result property="number" column="number"/>
15       <collection property="productList" ofType="Product">
16           <id property="id" column="pid"/>
17           <result property="name" column="name"/>
18           <result property="price" column="price"/>
19       </collection>
20     </resultMap>
21 </mapper>

测试类:

1 @Test
2     public void findOrdersAndPorductTest() {
3         SqlSession session = MybatisUtils.getSession();
4         Orders orders = session.selectOne("com.itheima.mapper.OrdersMapper.findOrdersWithProduct",1);
5         System.out.println(orders);
6         //关闭SqlSession
7         session.close();
8     }

结果:

  

原文地址:https://www.cnblogs.com/2312947032zyk/p/10566790.html

时间: 2024-10-16 22:58:01

SSM学习08MyBatis关联映射多对多的相关文章

顺藤摸瓜【Nhibernate 关联映射--多对一】

现有两个实体,Dog 和 Master ,映射到数据库表中如上图所示.一个Dog只允许对应一个Master,但一个Master可以有多个Dog.我们在查询Dog的时候,往往还需要知道其主人Master的信息,也就是说,如果已知一个Dog的信息,想一次来顺藤摸瓜找到Master的信息,此时用Nhibernate如何去实现呐?这里就用到了多对一的关联映射方法.看我是如何实现的: Nhibernate的整个搭建过程就不在赘述了,前面的两篇文章都已经详细展示了一下,下面仅仅展示多对一的实现方法. 首先构

Hibernate关联映射多对多关联

在关系数据库中还有一种常见的关系,即多对多关联,下面以地址和人之间的关系来说明多对多关联,一个人可以去很对地方,同时,一个地址可以有多个人同时存在,因此,地址和人的关系可以看成是多对多的关系,地址(address)的结构表如图所示: 人(person)的结构表如图所示: 建立他们的多对多关联必须建立中间表(person_address),建立视图可以看到他们的多对多关系图如图所示: 在Hibernate中配置address和person表的多对多关联 1.新建一个项目工程 2.为工程添加Hibe

Hibernate之关于多对多双向关联映射

[Hibernate]之关于多对多双向关联映射 多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例. 首先我们还是先看Annotations配置! @Entity @Table(name="t_student") public class Student {     private Integer id;     private String name;     private Integer age;     

008多对一 关联映射 --- many-to-one

多对一 --- many-to-one 一对多 --- one-to-many 一对一 --- one-to-one 多对多 --- many-to-many 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和组两个实体,多个用户属于一个组,那么一个用户都会对应于一个组,所以用户实体中应该有一个持有组的引用. 关联映射的本质: 将关联关系映射到数据库,所谓的关联关系是对象模型在内存

Hibernate-03 关联映射

学习任务 关联映射 inverse属性.cascade属性 单向的多对一.双向的一对多映射 多对多映射 关联关系 类与类之间最普遍的关系就是关联关系. 单向的关联 双向的关联 单向多对一关联 以Emp和Dept为例. 配置单向多对一关联 Emp类中需要添加Dept属性. 1.Dept类 package com.etc.entity; import java.io.Serializable; /** 部门持久化类 */ public class Dept implements Serializab

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射. 在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之间的关系就是多对多,多对多关联

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

上篇博文[SSH进阶之路]Hibernate映射--一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数据冗余的问题. 举例 一个用户(User)对多个角色(Role),一个角色对多个用户. 分类 单向的多对多关联映射(单向User--->Role) 对象模型 关系模型 实例

千山万水之Hibernate(七)——关联映射(多对多)

一直认为通过写SQL语句来处理多对多的情况比较复杂,对表关系必须是理解的非常清楚,在学习了Hibernate中的多对多处理后,想想其实多对多也没什么,只不过多了一张表,如果说多了一张表感觉复杂了,Hibernate中我们完全不用去理会他,直接去操作关联实体就可以了,从这点上看,Hibernate为我们做了很多事,确实功不可没. 在有了Hibernate这个帮手后,今天一起看看我们在Hibernate的基础上进行一些操作. 原理分析 我们拿学生和课程为例子来分析,所谓的多对多关系可以这样理解:一个