MyBatis基础05之多对多关系

【Java进阶营】MyBatis的多对多关联关系,你知道吗? 在实际项目开发中,多对多关系也是非常常见的关系,比如,一个购物系统中,一个用户可以有多个订单,这是一对多的关系;一个订单中可以购买多种商品,一种商品也可以属于多个不同的订单,订单和商品就是多对多的关系。对于数据库中多对多关系建议使用一个中间表来维护关系,中间表中的订单d作为外键参照订单表的id,商品id作为外键参照商品表的id。 下面我们就用一个简单示例来看看MyBatis怎么处理多对多关系。 首先,在数据库创建三个表:TB_USER、TB_ARTICLE和TB_ORDER,再创建一个中间表维护TB_ART 阅读详情

多对多

一张订单里 可以包含多种产品
一种产品 可以出现在多张订单里
这就是多对多关系
为了维系多对多关系,必须要一个中间表。
在这里我们使用订单项(OrderItem)表来作为中间表
  1. Order表和OrderItem表
create table order_ (
  id int(11) NOT NULL AUTO_INCREMENT,
  code varchar(32) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

create table order_item_(
  id int(11) NOT NULL AUTO_INCREMENT, 
  oid int ,
  pid int ,
  number int ,
  PRIMARY KEY(id)
)AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO order_ VALUES (1,'code000A');
INSERT INTO order_ VALUES (2,'code000B');

INSERT INTO order_item_ VALUES (null, 1, 1, 100);
INSERT INTO order_item_ VALUES (null, 1, 2, 100);
INSERT INTO order_item_ VALUES (null, 1, 3, 100);
INSERT INTO order_item_ VALUES (null, 2, 2, 100);
INSERT INTO order_item_ VALUES (null, 2, 3, 100);
INSERT INTO order_item_ VALUES (null, 2, 4, 100);

2.实体类

  OrderItem.java
  ...
  private int id;
  private int number;
  private Order order;
  private Product product;  


  Order.java

    ...
    private int id;
    private String code;
    private List<OrderItem> orderItems;

3 . 映射文件

Order.xml

    <?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="com.how2java.pojo">
        <resultMap type="Order" id="orderBean">
            <id column="oid" property="id" />
            <result column="code" property="code" />

            <collection property="orderItems"  
             ofType="OrderItem">
                <id column="oiid" property="id" />
                <result column="number" property="number" />
                <association property="product"  
                 javaType="Product">
                    <id column="pid" property="id"/>
                    <result column="pname" property="name"/>
                    <result column="price" property="price"/>
                </association>               
            </collection>
        </resultMap>

        <select id="listOrder" resultMap="orderBean">
            select o.*,p.*,oi.*, o.id 'oid',  
             p.id 'pid', oi.id 'oiid', p.name 'pname'
                from order_ o
                left join order_item_ oi    on o.id =oi.oid
                left join product_ p on p.id = oi.pid
        </select>

        <select id="getOrder" resultMap="orderBean">
            select o.*,p.*,oi.*, o.id 'oid', p.id 'pid',  
             oi.id 'oiid', p.name 'pname'
                from order_ o
                left join order_item_ oi on o.id =oi.oid
                left join product_ p on p.id = oi.pid
            where o.id = #{id}
        </select>
    </mapper>   

Product.xml

<?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="com.how2java.pojo">
        <resultMap type="Product" id="productBean">
            <id column="pid" property="id" />
            <result column="pname" property="name" />
            <result column="price" property="price" />

            <!-- 多对一的关系 -->
            <!-- property: 指的是属性名称,  
            javaType:指的是属性的类型 -->
            <association property="category"   
                javaType="Category">
                <id column="cid" property="id"/>
                <result column="cname" property="name"/>
            </association>
        </resultMap>

        <select id="listProduct" resultMap="productBean">
            select c.*, p.*, c.id 'cid', p.id 'pid',  
             c.name 'cname', p.name 'pname'
                from category_ c
                left join product_ p on c.id = p.cid
        </select>   
        <select id="getProduct" resultMap="productBean">
            select c.*, p.*, c.id 'cid', p.id 'pid',  
             c.name 'cname', p.name 'pname'
                from category_ c
                left join product_ p on c.id = p.cid
            where p.id = #{id}
        </select>   
    </mapper>

OrderItem.xml

 <?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="com.how2java.pojo">

        <insert id="addOrderItem" parameterType="OrderItem">
            insert into order_item_
                values(null,#{order.id},  
                #{product.id},#{number})
        </insert>   
        <insert id="deleteOrderItem" parameterType="OrderItem">
            delete from order_item_
                where oid = #{order.id} and pid = #{product.id}
        </insert>   

    </mapper>

MyBatis.xml

  <mappers>
        <mapper resource="com/how2java/pojo/Category.xml"/>
        <mapper resource="com/how2java/pojo/Product.xml"/>
        <mapper resource="com/how2java/pojo/Order.xml"/>
        <mapper resource="com/how2java/pojo/OrderItem.xml"/>
    </mappers>

4 .查询操作

通过Order.xml的listOrder对应的sql语句进行查询:

<select id="listOrder" resultMap="orderBean">
    select o.*,p.*,oi.*, o.id 'oid',  
     p.id 'pid', oi.id 'oiid', p.name 'pname' 
        from order_ o 
        left join order_item_ oi    on o.id =oi.oid 
        left join product_ p on p.id = oi.pid 
</select>


联合order_, order_item_, product_ 三张表进行查询



<resultMap type="Order" id="orderBean">
    <id column="oid" property="id" />
    <result column="code" property="code" />

    <collection property="orderItems" ofType="OrderItem">
        <id column="oiid" property="id" />
        <result column="number" property="number" />
        <association property="product" javaType="Product">
            <id column="pid" property="id"/>
            <result column="pname" property="name"/>
            <result column="price" property="price"/>
        </association>              
    </collection>
</resultMap>


查询结果 id和code字段放在Order对象里,  
 然后通过一对多的<collection>标签  
 把oiid和number放在OrderItem对象里,  
 最后把pid,pname,price放进Product对象里。
    private static void listOrder(SqlSession session) {
        List<Order> os = session.selectList("listOrder");
        for (Order o : os) {
            System.out.println(o.getCode());
            List<OrderItem> ois= o.getOrderItems();
            for (OrderItem oi : ois) {
                System.out.format("\t%s\t%f\t%d%n", oi.getProduct().getName(),oi.getProduct().getPrice(),oi.getNumber());
            }
        }
    }

5 .建立关系

    首先通过id分别获取Ordre对象和Product对象,然后创建一个新的OrderItem对象,接着设置Order,设置Product,设置数量,最后调用"addOrderItem" 对应的sql语句插入数据。

Order o1 = session.selectOne("getOrder", 1);
Product p6 = session.selectOne("getProduct", 6);
OrderItem oi = new OrderItem();
oi.setProduct(p6);
oi.setOrder(o1);
oi.setNumber(200);
session.insert("addOrderItem", oi);



addOrderItem调用insert into 语句插入一条OrderItem记录

<insert id="addOrderItem" parameterType="OrderItem">
    insert into order_item_ 
        values(null,#{order.id},#{product.id},#{number})
</insert> 

6 .删除关系

    private static void deleteOrderItem(SqlSession session) {
        Order o1 = session.selectOne("getOrder",1);
        Product p6 = session.selectOne("getProduct",6);
        OrderItem oi = new OrderItem();
        oi.setProduct(p6);
        oi.setOrder(o1);
        session.delete("deleteOrderItem", oi);     
    }
  1. 删除订单时,删除对应的订单项
    比如删除订单A,那么就应该删除订单A在订单项里所对应的数据。

提示,通过Mybatis执行多条sql语句需要增加一个参数:allowMultiQueries

在Order.xml中



    <delete id="deleteOrder" parameterType="_int">
        delete from order_item_ where oid = #{order.id};
        delete from order_ where id = #{id};
    </delete>

TestMyBatis.java

           int id = 1;
           session.delete("deleteOrder",id);
          // 直接执行即可删除orderItem和order
Mybatis中通过注解的方式实现多对多查询 文章目录前言一、创建数据库1.创建学生信息表2.创建课程信息表3.创建成绩表(中间表)二、创建项目1.配置pom.xml文件2.建立实体类和接口3.创建主配置文件4.创建配置文件4.建立测试5.测试结果总结 前言 文章通过课程与学生之间的多对多关系,(一个学生可以选择多门课程,以及一个课程可以被多个学生选择)来展示mybatis中的相应多表查询。 在mybatis中“一对多”和“多对多”关系通常情况下采用的都是延迟加载。 一、创建数据库 示例:pandas 是基于NumPy 的一种工具,该工具是为了解. 阅读详情

相关推荐

mybatis注解的详解和开发(增、删、改、查以及一对一、一对多/多对一、多对多的关系联查)

Results代替了标签< resultMap> 该注解中可以使用单个@Result注解,也可以使用@Result集合格式:@Results ({@Result () , @Result ()}) 或者@Result (@Result())id 是否是主键字段column 数据库中列的名property 需要装配的属性名one 需要使用 @One 注解 (@Result (one = @One) ())

m0_56245143的博客 1751

MyBatis 中多对多关系的处理

首先感谢: MyBatis 多对多 中间表插入数据:https://blog.youkuaiyun.com/u010857795/article/details/71512044 Mybatis中传入多个参数的问题:https://www.cnblogs.com/mingyue1818/p/3714162.html 后补: ...

imyLove7的博客 1042

Spring Boot + MyBatis-Plus 实现多对多关系数据模型与关联查询实战

在关系型数据库设计中,多对多关系是处理复杂业务逻辑的常见模式,它通过引入中间表来解耦实体间的直接关联,从而实现数据的高度灵活性与可扩展性。其核心原理是利用外键约束和索引优化来维护数据完整性并提升查询性能。掌握多对多关系模型对于构建高效、可维护的后端系统具有重要技术价值,尤其在需要动态分组、频繁查询统计的场景下,如社交网络的好友关系、电商平台的商品-订单系统以及内容管理系统的标签体系。本文以综艺节目互动系统中的宿舍活动管理为具体案例,深入探讨了如何使用 Spring Boot 和 MyBatis-Plus 框

weixin_33724059的博客 358

MyBatis 如何实现一个多对多的关联查询呢?

MyBatis 实现一个多对多的关联查询的方法分享

qq_25073223的博客 2021

05、MyBatis

SSM,SpringBoot,MyBatis

advent86的专栏 1001

【MyBatis】映射一对多和多对多关系配置(看完这篇不吃亏)

resultMap 允许我们定义复杂的映射规则,将结果集中的多个字段映射到一个对象中。因为我们是一对多的所以我们再编写vo类的时候,里面是使用list集合。建立我们给的sql文件,运行它用这里面的表,让我们更好的示例操作。在我们的配置文件里面配置我们需要的几个表,自动生成所需文件。当然我们要先建立这个包里面的类才能更好的下一步。在原本的基础的sql上我们增加一个一对多的sql。在上面我们已经写好了sql,我们生成对应的。在我们的里面添加一个sql的方法编写。在生成的接口类里面编写对应的接口方法。

无法自律的人的博客 5964

【Mybatis】Mybatis处理一对多、多对多关系映射-四

Mybatis处理一对多、多对多关系映射

admin_2022的博客 666

Mybatis多对多关联查询

Mybatis多对多关联查询

【SSM - MyBatis篇05】映射器 - resultMap结果映射 - 级联关系 - 一对一、一对多、多对多关联查询

文章目录映射器XML映射器1. select元素【**】2. insert元素2.1 insert元素特有的属性:2.2 insert元素主键回填(设置为自动递增的主键)2.3 自定义主键(实现主键自动递增)3. update、delete元素4. resultMap元素(结果映射)【*****】级联关系【*****】4.1 一对一关联查询 (association) - 用javaType来指定对象类型4.2 一对多、多对多关联查询 (collection) - 用ofType来制定对象类型 映射器  

Java小皮孩 5618

STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码)

STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3

weixin_A13253323604 3万+

CCC数字钥匙3.0标准解读(22)

介绍设备制造商服务器和车辆制造商服务器之间的通信协议.

weixin_41738640的博客 1748

MyBatis入门之多对多关联关系(示例)

在元素中使用了元素来映射多对多的关联关系,其中property属性表示课程持久化类中的学生属性,ofType属性表示集合中的数据为Student类型,而column的属性值会作为参数执行StudentMapper.xml中定义的id为findStudentById的执行语句,来查询课程中的学生信息。在实际项目开发中,多对多的关联关系是非常常见的。以学生和课程为例,一个学生可以选修多门课程,而一门课程又可以被多个学生选修,学生和课程就属于多对多的关联关系。

夏天又到了的专栏 1511

向量数据库:PGVector

PGVector 是一个基于 PostgreSQL 的扩展插件,为用户提供了一套强大的向量存储和查询的功能

m0_37559973的博客 1万+

MyBatis处理关联一对一,一对多和多对多关系-多表连接详细案例

实体间的关系:关联关系(拥有 has、属于 belong) OneToOne:一对一关系(Passenger— Passport) OneToMany:一对多关系(Employee — Department) ManyToMany:多对多关系(Student — Subject) 下面是示例展示MyBatis处理一对一,一对多和多对多的关联关系 1、OneToOne 一对一关系表设计(旅客表对护照表,一个旅客对应一张护照) create table t_passengers(

qiuyu1998的博客 888

第七天 Labview进阶(7.2 与汇川PLC通信)

运行环境: Labview 2020 Autoshop v4.10.1.1 该文档中包括Labview程序和汇川PLC程序,可以完美实现Labview与汇川PLC的通信。具体的使用教程可以参考本人的相关文章,讲解详尽,请尽情享用!

weixin_38637405的博客 3527

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 549

Mybatis高级映射之多对多映射

这样就是形成了一个双向的一对多,从而变成了多对多,其实前面掌握了一对多就已经完全足够了,我为了再巩固一下所以继续写了个多对多的例子。由于前面的案例员工和部门一方是一对一,一方是一对多,所以不能形成多对多的条件,我重新换了一个案例——用户和角色。多对多映射其实就是一个双向的一对多映射,因为两边都是一对多。多对多主要是关联关系要找好,然后根据关联去查询。

xwnxwn的专栏 200

Codex 实战 Skills:如何用 Skill 让 AI 模拟人工点击,自动完成复杂的前端表单测试

本文介绍如何构建基于Selenium WebDriver的AI Agent技能,实现自动化UI测试流程。主要内容包括: 环境搭建:配置无头Chrome浏览器环境,使用WebDriver Manager自动管理驱动 核心技能开发:通过ID、CSS Selector、XPath等策略定位元素,实现显式等待机制 交互模拟:使用ActionChains模拟鼠标悬停等复杂操作 稳定性优化:解决异步加载问题,确保测试可靠性 Skill封装:将功能模块化,使AI能通过自然语言指令操作Web界面 该方案突破了传统自动化测试

yueyeguzhuo的专栏 147

Mybatis学习_05mybatis多表操作实现多对多操作

mybatis的多表操作 表之间的关系有几种:一对多,多对一,一对一,多对多 示例:用户和订单就是一对多,订单和用户就是多对一 一个用户可以下多个订单 多个订单属于同一个用户 示例:人和身份证号就是一对一 一个人只能有一个身份证号 一个身份证号只能属于一个人 示例:老师和学生之间就是多对多 一个学生可以被多个老师教过 一个老师可以教多个学生 示例(特例):如果拿出每一个订单,都...

chenchen818的博客 446

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MyBatis关联关系

问题:查询时,实体属性和列名不一致 用别名(容易) 用resultMap(麻烦、有时候必须用它,如关联关系时) 用注解 MyBatis关联关系映射(注解) 一个国家一个首都 一个省多个城市 学生与课程 一对一:在任意一方引入对方主键作为外键 一对多:在“多”的一方,添加“一”的一方的主键作为外键 多对多:产生的中间表,引入了至少两张表的主键作为外键。 ..

mtm001的专栏 1080

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mybatis多对多的关系

前言:本项目是使用idea进行开发,数据库使用的是Mysql。 1.搭建maven项目,引入mybatis需要的依赖 默认没有java、resources、test等文件夹,习惯性建立这几个文件夹,建立文件夹的时候注意标记文件夹的用途(不然编译器无法识别,无法编译代码) pom.xml(注意要将实体包下面的xml文件设置可编译) &lt;?xml version="1.0" encoding...

小思的博客 737

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MyBatis05-关联关系、延迟加载和缓存

@[toc] 关联关系 1对1关系 对象与对象1对1 部门对象 private Integer deptno; private String dname; private String loc; 员工对象 private Integer empno; private Stri...

chigui1424的博客 185

Mybatis高级

嵌套结果映射通过多个 resultMap 组合实现每个属性值的映射 嵌套结果查询是在 SQL 中实现多表联查,且通常情况下需要执行多个 SQL 语句,并将结果拼接到一个对象中 在数据量较大的情况下,嵌套结果映射相对来说性能更高,但是查询时需 要考虑 SQL 的效率和维护成本。一级缓存是SqlSession级别的 ,通过同一个sqlSession查询的数据会被缓 存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问。据,然后通过在主表查询结果上进行循环,并在循环中执行从表的查询,

qq_64004825的博客 1853

Mybatis_05_关联关系映射

<table schema="" tableName="t_hibernate_order" domainObjectName="Order" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> </table> <table

qq_58530605的博客 546
上一篇: MyBatis基础04之多对一
下一篇: Git命令集
Young-zhou
博客等级 码龄10年 10粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值