处理 Mybatis 中一对多、多对一、多对多映射的黑魔法

本文探讨了在Mybatis中处理一对多、多对一、多对多关系映射的方法,提出避免使用association、collection,而是通过优化SQL,利用数据库如MySQL的group_concat()和concat()函数来简化XML配置,减少复杂度并提高代码可读性。这种方法能直接返回客户端所需数据,并充分发挥数据库处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

先看看Mybatis官方介绍

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

注意,这里是简单的XML! 可是,当我们的数据库表关系错综复杂,表与表之存在一对多、多对一、多对多的关系时,如何通过mybatis表示出他们的关系呢?网上很多文章都在介绍 association、 collection,我先不说association、 collection有多好,先来看看一个具体实例。

下图是订单的数据库表关系


这里写图片描述


有这样一个需求,我要展示类似于淘宝订单的效果,如下图:


这里写图片描述


我们看到上面的订单就会想到,要展示一条订单,需要:订单信息、物流信息、卖家信息、买家信息、商品信息、商品属性信息、商品状态信息…,至少也要5/6张表的数据,其中,订单对买家/卖家是多对一关系、订单对商品时多对多关系…,看看类似的xml:

<!-- 查询用户及购买的商品  type写的是user类的全路径  把数据映射到user中   -->
    <resultMap type="org.mybatis.po.User" id="UserAndItemsResultMap">
        <!-- 用户信息 -->
        <id column="user_id" property="id" />
        <result column="username" property="username" />
        <result column="sex" property="sex" />
        <result column="address" property="address" />

        <!-- 订单信息一个用户对应多个订单,使用collection映射-->
        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值