mybatis 一对多嵌套查询

在MyBatis中,处理一对多关系的查询主要涉及到关联映射配置以及在Mapper XML文件中编写SQL查询。以下是一个简单的例子说明如何在MyBatis中实现一对多查询。假设我们有两个实体类:User和Order,一个用户可以有多个订单,这是一种一对多的关系。1. 首先,在User实体类中定义一个Order集合属性:

1. 首先,在User实体类中定义一个Order集合属性:

public class Order {
    private int id;
    private String productName;
    // 省略其他属性...

    // 定义User的外键引用
    private int userId;
    private User user; // 可选,取决于是否需要双向关联

    // 省略getter和setter方法...
}

2. 在Order实体类中定义User的外键引用: 

public class User {
    private int id;
    private String username;
    // 省略其他属性...

    // 定义一个Order集合属性
    private List<Order> orders;

    // 省略getter和setter方法...
}

3. 在User的Mapper XML文件中配置一对多关系查询:

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 查询用户基本信息 -->
    <select id="getUserById" parameterType="int" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 一对多关联查询用户的所有订单 -->
    <select id="getUserAndOrdersById" parameterType="int" resultType="com.example.entity.User">
        SELECT u.*, o.* FROM user u
        LEFT JOIN order o ON u.id = o.user_id
        WHERE u.id = #{id}
    </select>

    <!-- 使用association标签配置一对一关系 -->
    <resultMap id="userResultMap" type="com.example.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <!-- 省略其他字段映射 -->

        <!-- 一对多关联映射 -->
        <collection property="orders" ofType="com.example.entity.Order">
            <id property="id" column="order_id"/>
            <result property="productName" column="product_name"/>
            <!-- 省略其他字段映射 -->
            <!-- 设置关联外键 -->
            <association property="user" javaType="com.example.entity.User" column="user_id" select="com.example.mapper.UserMapper.getUserById"/>
        </collection>
    </resultMap>

    <!-- 使用resultMap进行查询 -->
    <select id="getUserWithResultMapById" parameterType="int" resultMap="userResultMap">
        SELECT * FROM user u
        LEFT JOIN order o ON u.id = o.user_id
        WHERE u.id = #{id}
    </select>
</mapper>

 在这里,我们展示了两种一对多查询的方式:

•直接通过联合查询获取所有用户和订单信息,然后在User实体类中直接解析订单集合。

•使用<collection>标签在<resultMap>中定义一对多关联,这样MyBatis会自动将查询结果映射到User实体类中的orders集合属性。在实际应用中,通常会选择第二种方式,因为它更具扩展性和可维护性。尤其是在处理深层次和复杂的关联关系时,<resultMap>的优势更为明显。

在MyBatisPlus中,处理一对多关系的查询相对较为简便,主要是借助于模型类的关联注解以及特殊的查询方法。以下是一个简化的例子:假设我们有两个实体类:User和Order,一个用户可以有多个订单,这是一种一对多的关系。

1. 首先,在User实体类中定义一个Order集合属性,并使用@TableField注解标明关联关系:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.List;

@TableName("user")
public class User {
    @TableId("id")
    private Long id;
    private String username;

    // 通过@TableField注解关联Order表
    @TableField(exist = false)
    private List<Order> orders;

    // getter和setter方法...
}

2. 在Order实体类中定义User的外键引用:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("order")
public class Order {
    @TableId("id")
    private Long id;
    private String productName;
    @TableField("user_id")
    private Long userId;

    // getter和setter方法...
}

3. 使用MyBatisPlus的内置方法进行关联查询:

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IService<User> {

    public User getUserAndOrders(Long userId) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", userId);
        // 使用lambda表达式加载关联的orders
        queryWrapper.lambda().with(User::getOrders);
        return baseMapper.selectOne(queryWrapper);
    }
}

在上述代码中,通过queryWrapper.lambda().with(User::getOrders);这一行,我们告诉MyBatisPlus在查询用户的同时加载关联的订单信息。这样,当你调用getUserAndOrders方法并返回用户对象时,用户对象的orders属性就已经包含了该用户的所有订单信息。注意,为了实现这样的关联查询,还需要确保数据库表结构符合关联关系(例如在order表中有user_id作为外键指向user表的id),并且在对应的UserMapper和OrderMapper中完成了基本的CRUD方法映射。MyBatisPlus会自动处理内部的一对多关联查询逻辑。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值