mybatis 一对一association、一对多collection实践,以订单为例

avatar 2021年01月10日16:29:53 0 106 views

最近帮朋友写一个简单的商城系统,其中关于订单查询这一块,可以记录一下分享给大家。

一、数据库设计

这里主要贴一下核心的2张表,订单主表和订单详细表,像用户表,购物车表,收货地址表,店铺表之类的就不贴出来了。

1. t_order 订单主表

这里说明一下为什么要冗余下单用户地址,主要是考虑到用户如果删除了收货地址 t_address 表的数据,会出现关联不上,所以实际情况我们不用 address_id 关联收获地址信息。

status状态字段:0未付款、1已付款/待发货、2已发货/待收货、3已收货/待评价、4已评价、5取消订单。暂时不考虑付款后退款的功能。

 

2.订单详情表 t_order_detail

同上,冗余商品信息表部分字段,目的是防止商家把商品删除,无法关联,所以我们不用 product_id 关联。

 

二、数据访问层 Mapper

本文其实主要是为了讲这个 mapper xml 的写法

1、Order.java

package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 订单表
 *
 * @author 言曌
 * @date 2020/12/27 2:10 下午
 */
@Data
@TableName("t_order")
public class Order extends BaseEntity {

    /**
     * 下单用户ID
     */
    private Long userId;

    /**
     * 总价
     */
    private Double totalPrice;

    /**
     * 地址ID
     */
    private Long addressId;

    /**
     * 订单状态: 0未付款、1已付款/待发货、2已发货/待收货、3已收货/待评价、4已评价、5取消订单
     */
    private Integer status;


    /**
     * 收货地址-收货人姓名(收货地址可能删除,所以这里要记录,不能直接读收货地址表))
     */
    private String addressRealName;

    /**
     * 收货地址-收货(收货地址可能删除,所以这里要记录,不能直接读收货地址表))
     */
    private String addressPhone;

    /**
     * 收货地址详细(收货地址可能删除,所以这里要记录,不能直接读收货地址表))
     */
    private String addressDetail;

    /**
     * 用户信息
     */
    @TableField(exist = false)
    private User user;
    
    /**
     * 店铺名称
     */
    @TableField(exist = false)
    private Store store;

    /**
     * 订单详细列表
     */
    @TableField(exist = false)
    List<OrderDetail> orderDetailList;

}

 

顺便贴一下父类的代码

BaseEntity.java

package com.example.sens.common.base;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.example.sens.common.constant.CommonConstant;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 言曌
 * @date 2019-08-07 00:28
 */
@Data
public class BaseEntity implements Serializable {

    /**
     * ID,自动生成
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 删除状态:1删除,0未删除
     */
    @TableField(value = "del_flag")
    @TableLogic
    private Integer delFlag = CommonConstant.STATUS_NORMAL;

    /**
     * 创建时间
     */
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;
}

 

2、OrderMapper.java

package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author liuyanzhao
 */
@Mapper
public interface OrderMapper extends BaseMapper<Order> {

    /**
     * 获得该用户的订单记录
     *
     * @return
     */
    List<Order> findByUserId(@Param("userId") Long userId, Page page);

}

 

3、OrderMapper.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.sens.mapper.OrderMapper">

    <resultMap id="BaseResultMap" type="com.example.sens.entity.Order">
        <id column="id" property="id"></id>
        <result column="user_id" property="userId"></result>
        <result column="address_id" property="addressId"></result>
        <result column="status" property="status"></result>
        <result column="total_price" property="totalPrice"></result>
        <result column="address_real_name" property="addressRealName"></result>
        <result column="address_phone" property="addressPhone"></result>
        <result column="address_detail" property="addressDetail"></result>
        <result column="create_time" property="createTime"></result>

        <association property="user" javaType="com.example.sens.entity.User">
            <id property="id" column="user_id"/>
            <result property="userDisplayName" column="user_display_name"/>
        </association>

        <association property="store" javaType="com.example.sens.entity.Store">
            <id property="id" column="store_id"/>
            <result property="name" column="store_name"/>
        </association>

        <collection property="orderDetailList" ofType="com.example.sens.entity.OrderDetail" javaType="java.util.ArrayList">
            <id property="id" column="order_detail_id"/>
            <result property="productId" column="product_id"/>
            <result property="productName" column="product_name"/>
            <result property="productPrice" column="product_price"/>
            <result property="productThumbnail" column="product_thumbnail"/>
            <result property="number" column="number"/>
        </collection>
    </resultMap>

    <select id="findByUserId" resultMap="BaseResultMap">
        SELECT
            o.id, o.user_id, o.store_id, o.address_id, o.status, o.total_price, o.address_real_name, o.address_phone, o.address_detail, o.create_time,
            u.user_display_name,
            s.name store_name, s.id store_id,
            d.id order_detail_id, d.product_id, d.product_name, d.product_price, d.product_thumbnail, d.number
        FROM
            t_order o
            LEFT JOIN t_user u ON  o.user_id = u.id AND u.del_flag = 0 
            LEFT JOIN t_store s ON o.store_id = s.id AND s.del_flag = 0
            LEFT JOIN t_order_detail d ON d.order_id = o.id AND d.del_flag =0
        WHERE
            o.user_id = #{userId} AND
            o.del_flag = 0   
    </select>



</mapper>

 

三、web层访问效果

service,web层代码我就不贴了

这里主要给大家看一下最终返回的格式,返回的JSON格式数据如下

[
    {
        "id":1,
        "delFlag":0,
        "createTime":"2021-01-10 07:23:21",
        "updateTime":null,
        "userId":27,
        "totalPrice":140,
        "addressId":1,
        "status":0,
        "addressRealName":"CC",
        "addressPhone":"13512344221",
        "addressDetail":"XXXXXXX",
        "user":{
            "id":27,
            "delFlag":0,
            "createTime":null,
            "updateTime":null,
            "userName":null,
            "userDisplayName":"CC",
            "idCard":null,
            "userAvatar":null,
            "userDesc":null,
            "status":0,
            "email":null,
            "phone":null,
            "money":null,
            "role":null
        },
        "store":{
            "id":1,
            "delFlag":0,
            "createTime":null,
            "updateTime":null,
            "userId":null,
            "name":"ABC水果平台",
            "status":null,
            "userDisplayName":null,
            "userPhone":null,
            "applyTime":null,
            "passTime":null
        },
        "orderDetailList":[
            {
                "id":1,
                "delFlag":0,
                "createTime":null,
                "updateTime":null,
                "orderId":null,
                "userId":null,
                "productId":1,
                "productName":"苹果",
                "productPrice":10,
                "productThumbnail":"/static/theme/g1/images/1.jpg",
                "number":1
            },
            {
                "id":3,
                "delFlag":0,
                "createTime":null,
                "updateTime":null,
                "orderId":null,
                "userId":null,
                "productId":1,
                "productName":"苹果3",
                "productPrice":30,
                "productThumbnail":"/static/theme/g1/images/1.jpg",
                "number":3
            },
            {
                "id":2,
                "delFlag":0,
                "createTime":null,
                "updateTime":null,
                "orderId":null,
                "userId":null,
                "productId":1,
                "productName":"苹果2",
                "productPrice":20,
                "productThumbnail":"/static/theme/g1/images/1.jpg",
                "number":2
            }
        ]
    }
]

这里造的数据是 t_order  一条记录,t_order_detail 三条记录,即在一个店铺创建的一个订单买了三种商品。

 

页面效果如下(省略html,css,js代码)

该商城还在开发中,基于springboot+mybatis,预计下周末前完成,需要完整代码可以联系博主

 

 

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
可以匿名评论或者登录后台评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0