当前位置: 首页 > news >正文

MyBatis多表查询实现方式

MyBatis 的多表查询主要涉及关联查询(如一对一、一对多、多对多),可以通过 ResultMap 嵌套映射实现。

1. 嵌套ResultMap (关联查询)

通过 <association> (一对一)和 <collection> (一对多)标签嵌套映射关联对象。

示例:订单(Order)与用户(User)的一对一关系:

<resultMap id="OrderWithUserMap" type="Order">
    <id property="id" column="order_id"/>
    <result property="orderNo" column="order_no"/>
    <!-- 一对一映射用户 -->
    <association property="user" javaType="User">
        <id property="id" column="user_id"/>
        <result property="name" column="user_name"/>
    </association>
</resultMap>

<select id="getOrderWithUser" resultMap="OrderWithUserMap">
    SELECT 
        o.id AS order_id, o.order_no, 
        u.id AS user_id, u.name AS user_name
    FROM orders o
    LEFT JOIN user u ON o.user_id = u.id
</select>

2. 一对多关系(如订单与订单项)

使用 <collection> 标签映射子对象集合。

<resultMap id="OrderWithItemsMap" type="Order">
    <id property="id" column="order_id"/>
    <result property="orderNo" column="order_no"/>
    <!-- 一对多映射订单项 -->
    <collection property="items" ofType="OrderItem">
        <id property="id" column="item_id"/>
        <result property="productName" column="product_name"/>
    </collection>
</resultMap>

<select id="getOrderWithItems" resultMap="OrderWithItemsMap">
    SELECT 
        o.id AS order_id, o.order_no,
        i.id AS item_id, i.product_name
    FROM orders o
    LEFT JOIN order_item i ON o.id = i.order_id
</select>

3. 多对多关系(如用户与角色)

通过中间表关联,结合 <collection> 实现。

<resultMap id="UserWithRolesMap" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <collection property="roles" ofType="Role">
        <id property="id" column="role_id"/>
        <result property="name" column="role_name"/>
    </collection>
</resultMap>

<select id="getUserWithRoles" resultMap="UserWithRolesMap">
    SELECT 
        u.id AS user_id, u.name AS user_name,
        r.id AS role_id, r.name AS role_name
    FROM user u
    LEFT JOIN user_role ur ON u.id = ur.user_id
    LEFT JOIN role r ON ur.role_id = r.id
</select>

相关文章:

  • 【技术白皮书】内功心法 | 第一部分 | IP协议的目的与工作原理(IP地址)
  • Linux 生成静态库
  • yarn install时报错certificate has expired
  • TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”
  • Flow Matching 和 Rectified Flow的区别
  • 关于爱思唯尔官方Latex模版参考文献不是按照引用顺序编号,乱序问题
  • 怎么使用Sam Helper修改手机屏幕分辨率,使得游戏视野变广?
  • 为界面添加垂直滚动条事件
  • SQLiteStudio:一款免费跨平台的SQLite管理工具
  • Java对象深拷贝与浅拷贝的区别
  • 2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB
  • JeecgBoot 使用心得
  • [HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(2)
  • IP,MAC,ARP 笔记
  • 定时任务和分布式任务框架
  • 基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
  • 睡不着营养贴士
  • AArch64架构及其编译器
  • Manus AI:开启Agent元年的ChatGPT时刻(附赠资料)
  • Linux教学总目录
  • 丰台区社会建设工作办公室网站/软文自助发布平台系统
  • 网站制作制作公司/网络营销顾问工作内容
  • 拆分盘网站建设/新产品推广
  • 网站商城开发公司/淘宝宝贝关键词排名查询工具
  • 网站后台管理 源码/天津优化加盟
  • 怎么做电影引流网站/品牌推广与传播怎么写