在 Java + MyBatis 中,多表联查(关联查询)常见有 三种方式,下面从最常用到进阶给你讲清楚,并带示例。
适合场景:简单联查、字段不多、不需要复杂对象结构。
user 表(用户)orders 表(订单,含 user_id)<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>
List<Map<String, Object>> selectUserWithOrders(@Param("userId") Integer userId);
✅ 优点:简单、性能好
❌ 缺点:返回结构是扁平的,不适合复杂对象
适合场景:需要返回对象包含对象/集合(如 User 包含 Orders)
class User {
private Integer id;
private String username;
private List<Order> orders;
}
class Order {
private String orderNo;
private BigDecimal amount;
}
<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>
✅ 优点:结构清晰、面向对象
✅ 生产最推荐
适合场景:层级深、数据量小
<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>
⚠️ 注意:
MyBatis-Plus 本身不支持 JOIN,但可:
@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 |
如果你愿意,可以告诉我:
我可以直接帮你写 完整 SQL + Mapper + Entity。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。