温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis如何多表联查

发布时间:2026-09-23 07:33:33 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java + MyBatis 中,多表联查(关联查询)常见有 三种方式,下面从最常用到进阶给你讲清楚,并带示例。


一、使用 SQL 多表 JOIN(最常用 ✅)

适合场景:简单联查、字段不多、不需要复杂对象结构。

示例表

  • user 表(用户)
  • orders 表(订单,含 user_id)

Mapper XML

<select id="selectUserWithOrders" resultType="map">
    SELECT
        u.id,
        u.username,
        o.order_no,
        o.amount
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{userId}
</select>

Java 接口

List<Map<String, Object>> selectUserWithOrders(@Param("userId") Integer userId);

✅ 优点:简单、性能好
❌ 缺点:返回结构是扁平的,不适合复杂对象


二、ResultMap 映射复杂对象(推荐 ✅✅)

适合场景:需要返回对象包含对象/集合(如 User 包含 Orders)

实体类

class User {
    private Integer id;
    private String username;
    private List<Order> orders;
}

class Order {
    private String orderNo;
    private BigDecimal amount;
}

Mapper XML(一次 JOIN 查询)

<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <collection property="orders" ofType="Order">
        <result property="orderNo" column="order_no"/>
        <result property="amount" column="amount"/>
    </collection>
</resultMap>

<select id="getUserWithOrders" resultMap="userMap">
    SELECT
        u.id,
        u.username,
        o.order_no,
        o.amount
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{userId}
</select>

✅ 优点:结构清晰、面向对象
✅ 生产最推荐


三、嵌套查询(N+1 查询 ⚠️)

适合场景:层级深、数据量小

Mapper XML

<resultMap id="userMap2" type="User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <collection
        property="orders"
        column="id"
        select="selectOrdersByUserId"/>
</resultMap>

<select id="getUser" resultMap="userMap2">
    SELECT id, username FROM user WHERE id = #{userId}
</select>

<select id="selectOrdersByUserId" resultType="Order">
    SELECT order_no, amount FROM orders WHERE user_id = #{id}
</select>

⚠️ 注意:

  • 会产生 N+1 查询
  • 大数据量性能差

四、MyBatis-Plus 多表联查(进阶)

MyBatis-Plus 本身不支持 JOIN,但可:

  • 自定义 XML
  • 使用 @Select 注解
  • 使用第三方插件(如 mybatis-plus-join)

注解方式示例

@Select("""
    SELECT u.*, o.order_no
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{id}
""")
User getUserWithOrder(@Param("id") Integer id);

五、选择建议 ✅

场景 推荐方式
简单查询 JOIN + Map
返回对象结构 ResultMap
小数据层级深 嵌套查询
微服务/复杂业务 DTO + JOIN

如果你愿意,可以告诉我:

  • 表结构
  • 是否需要分页
  • 是否用 MyBatis-Plus

我可以直接帮你写 完整 SQL + Mapper + Entity。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手