mybatis-plus一对多关联查询

MyBatis-Plus 本身主要关注单表操作,但可以通过几种方式实现一对多关联查询:

1. 使用 XML 映射文件实现

这是最传统的方式,通过编写 SQL 和 ResultMap 实现:

XML 复制代码
<!-- UserMapper.xml -->
<resultMap id="userWithOrdersMap" type="com.example.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <!-- 一对多关联 -->
    <collection property="orders" ofType="com.example.Order">
        <id property="id" column="order_id"/>
        <result property="orderNo" column="order_no"/>
        <result property="userId" column="user_id"/>
    </collection>
</resultMap>

<select id="selectUserWithOrders" resultMap="userWithOrdersMap">
    SELECT u.*, o.id as order_id, o.order_no, o.user_id
    FROM user u
    LEFT JOIN order o ON u.id = o.user_id
    WHERE u.id = #{id}
</select>

2. 使用注解方式实现

MyBatis 也支持通过注解实现:

java 复制代码
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user WHERE id = #{id}")
    @Results({
        @Result(id=true, property="id", column="id"),
        @Result(property="name", column="name"),
        @Result(property="orders", column="id",
                many=@Many(select="com.example.mapper.OrderMapper.selectByUserId"))
    })
    User selectUserWithOrders(Long id);
}

public interface OrderMapper extends BaseMapper<Order> {
    @Select("SELECT * FROM order WHERE user_id = #{userId}")
    List<Order> selectByUserId(Long userId);
}

3. 使用 MyBatis-Plus 的关联查询插件

可以集成第三方插件如 mybatis-plus-join

java 复制代码
// 添加依赖后使用
public List<User> getUserWithOrders() {
    return joinLambdaWrapper(User.class)
            .leftJoin(Order.class, Order::getUserId, User::getId)
            .selectAll(User.class)
            .selectAs(Order::getId, User::getOrderId)
            .selectAs(Order::getOrderNo, User::getOrderNo)
            .list();
}
相关推荐
艾莉丝努力练剑9 分钟前
【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
大数据·开发语言·c++·人工智能·红黑树
No0d1es17 分钟前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
l1t23 分钟前
利用DeepSeek优化SQLite求解数独SQL用于DuckDB
开发语言·数据库·sql·sqlite·duckdb
_OP_CHEN25 分钟前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
9号达人38 分钟前
普通公司对账系统的现实困境与解决方案
java·后端·面试
硅农深芯38 分钟前
如何使用ptqt5实现进度条的动态显示
开发语言·python·qt
超级苦力怕41 分钟前
Java 为何 long a = 999999999 能过;long a = 9999999999 报错?一文讲透“宽化转换”
java
佐杰1 小时前
Jenkins使用指南1
java·运维·jenkins
dllxhcjla1 小时前
三大特性+盒子模型
java·前端·css
Lhan.zzZ1 小时前
Qt数据可视化实战:饼图、线图与表格的完整指南
开发语言·qt·信息可视化