mybatis 一对多配置

文章展示了在Mybatis中进行一对多映射配置的方法,包括PayInfoVo和ProductVo两个类的定义,以及resultMap的使用来关联订单信息和产品信息。查询SQL用于获取付款凭证详情及关联的产品数据。
摘要由CSDN通过智能技术生成

mybatis 一对多配置


import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("付款凭证信息")
public class PayInfoVo {
    @ApiModelProperty("订单Id")
    private String orderId;
    @ApiModelProperty("付款凭证ID")
    private String payInfoId;
    @ApiModelProperty("付款凭证图片")
    private String bankSlipPicUrl;
    @ApiModelProperty("订单价格")
    private BigDecimal saleAmount;
    @ApiModelProperty("订单创建时间")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty("产品信息")
    private List<ProductVo> list;
}

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("合同订单产品信息")
public class ProductVo {
    @ApiModelProperty("产品Id")
    private String productId;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("产品图片")
    private String productParamPicUrl;
    @ApiModelProperty("产品简介")
    private String productBrief;
}
    <resultMap type="org.jeecg.modules.saleAddBack.entity.vo.PayInfoVo" id="payInfoVoResult">
        <result property="orderId" column="order_id"/>
        <result property="payInfoId" column="pay_info_id"/>
        <result property="bankSlipPicUrl" column="bank_slip_pic_url"/>
        <result property="saleAmount" column="sale_amount"/>
        <result property="createTime" column="create_time"/>
        <collection property="list" ofType="org.jeecg.modules.saleAddBack.entity.vo.ProductVo"> 
            <!-- productId:产品信息的唯一标识 -->
            <id column="product_id" property="productId" />
            <result column="product_name" property="productName"/>
            <result column="product_param_pic_url" property="productParamPicUrl"/>
            <result column="product_brief" property="productBrief"/>
        </collection>
    </resultMap>
SELECT
            a.pay_info_id,
            b.order_id,
            b.create_time,
            a.bank_slip_pic_url,
            b.sale_amount,
            d.product_id,
            c.product_name,
            d.product_brief,
            d.product_param_pic_url
        FROM
            sadd_pay_info a
            LEFT JOIN sadd_order b ON a.order_id = b.order_id
            LEFT JOIN sadd_order_detail c on b.order_id = c.order_id
            LEFT JOIN sadd_product_info d ON d.product_id = c.product_id
        WHERE
            b.pay_method = 1
            AND b.pay_document_status = 1
            AND b.user_detail_id = "2322"
            ```


假设我们有两个表,一个是 `order` 表,一个是 `order_item` 表,每个订单可能有多个订单项。下面是 MyBatis 配置文件的代码示例: 首先,我们需要定义两个对应的实体类 `Order` 和 `OrderItem`: ```java public class Order { private int id; private String orderNo; private List<OrderItem> orderItems; // getters and setters } public class OrderItem { private int id; private String itemName; private int orderId; // getters and setters } ``` 然后,我们需要在 MyBatis 的映射文件中定义 SQL 语句和映射关系。假设我们要查询订单及其所有订单项,我们可以这样写: ```xml <!-- 定义查询订单及其所有订单项的 SQL 语句 --> <select id="selectOrderWithItems" resultMap="orderWithItems"> SELECT o.id, o.order_no, oi.id AS item_id, oi.item_name, oi.order_id FROM orders o LEFT JOIN order_items oi ON o.id = oi.order_id WHERE o.id = #{id} </select> <!-- 定义结果集映射关系 --> <resultMap id="orderWithItems" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <!-- 嵌套结果集映射关系 --> <collection property="orderItems" ofType="OrderItem"> <id property="id" column="item_id"/> <result property="itemName" column="item_name"/> </collection> </resultMap> ``` 在这个示例中,我们定义了一个名为 `selectOrderWithItems` 的查询语句,它会返回订单及其所有订单项的详细信息。我们使用了 `LEFT JOIN` 操作将订单表和订单项表连接起来,并使用 `WHERE` 子句限制查询结果只包含指定订单的信息。 接下来,我们定义了一个名为 `orderWithItems` 的结果集映射关系,它指定了如何将查询结果映射到 `Order` 对象和 `OrderItem` 对象中。在这个映射关系中,我们使用了 `<collection>` 元素嵌套了一个订单项的结果集映射关系,以便将订单项列表映射到 `Order` 对象的 `orderItems` 属性中。 最后,在 Java 代码中调用查询语句并获取结果: ```java public Order selectOrderWithItems(int id) { try (SqlSession sqlSession = sqlSessionFactory.openSession()) { OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); return orderMapper.selectOrderWithItems(id); } } ``` 在上面的代码中,我们使用了 `SqlSession` 对象和 `OrderMapper` 接口来执行查询操作。查询结果会自动映射到 `Order` 对象中,包括所有订单项信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值