实习知识整理11:确认订单并将订单的相关信息插入用户订单表和订单详情表

用户订单表:

订单详情表:

思路分析:首先我们需要知道当点击了确认订单按钮后,需要向后端传递哪些数据,先看用户订单表:ORDER_ID是不需要传的,这个可以在后台生成就行了;USER_ID是需要传的;ADDRESS_ID也是需要传的;ORDER_TIME可以在后台获得系统的时间,也是不需要传的;GET_TIME不需要;TOTAL总价是需要传的;NOTE备注也是需要传的。
再看订单详情表:ORDER_DETAIL_ID是自增的,不需要;ORDER_ID也是不需要的;ITEM_ID是需要的;BUY_COUNT也是需要的

1. 提交表单需要传递的数据

补充:再上一篇博客中讲述了如何选择其他地址并渲染到页面上,此时我们在这边的,需要传递ADDRESS_ID, 所以当我们选择其他地址时,同时也是需要将ADDRESS_ID也跟着改变成相应的,不然提交表单时,会传错误的ADDRESS_ID

html 复制代码
<input id="formAddressId" name="addressId" type="hidden" th:value="${defaultAddress.addressId}"/>

将需要传递的数据都放入表单中,如果不需要展示,直接设为隐藏就行了

2. 后端接收数据并执行插入操作

我们需要向两个表中插入数据,所以要写两个mapper

UserOrderMapper.java

java 复制代码
public interface UserOrderMapper {

    // 新增订单信息
    int insertUserOrder(UserOrder userOrder);
}

UserOrderMapper.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.shopping.mapper.UserOrderMapper">

    <resultMap id="userOrderBaseResultMap" type="UserOrder">
        <id column="ORDER_ID" property="orderId"/>
        <result column="USER_ID" property="userId"/>
        <result column="ADDRESS_ID" property="addressId"/>
        <result column="ORDER_TIME" property="orderTime"/>
        <result column="GET_TIME" property="getTime"/>
        <result column="TOTAL" property="total"/>
        <result column="NOTE" property="note"/>
    </resultMap>

    <!--insertUserOrder(UserOrder userOrder);-->
    <insert id="insertUserOrder" parameterType="UserOrder">
        INSERT INTO userorder (ORDER_ID,USER_ID,ADDRESS_ID,ORDER_TIME,GET_TIME,TOTAL,NOTE)
        VALUES (#{orderId},#{userId},#{addressId},#{orderTime},#{getTime},#{total},#{note})
    </insert>

</mapper>

OrderDetailMapper.java

java 复制代码
public interface OrderDetailMapper {
    //插入订单详情
    int insertOrderDetail(OrderDetail orderDetail);
}

OrderDetailMapper.xml

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.shopping.mapper.OrderDetailMapper">

    <resultMap id="baseOrderDetailResultMap" type="Address">
        <id column="ORDER_DETAIL_ID" property="orderDetailId"/>
        <result column="ORDER_ID" property="orderId"/>
        <result column="ITEM_ID" property="itemId"/>
        <result column="BUY_COUNT" property="buyCount"/>
    </resultMap>

    <!--insertOrderDetail(OrderDetail orderDetail);-->
    <insert id="insertOrderDetail" parameterType="OrderDetail">
        INSERT INTO orderdetail (ORDER_ID,ITEM_ID,BUY_COUNT) VALUES (#{orderId},#{itemId},#{buyCount})
    </insert>
</mapper>

UserOrderService.java 接口

使其的返回类型时ResultDTO

java 复制代码
public interface UserOrderService {
    // 直接购买确认订单功能
    ResultDTO<UserOrder> confirmOrder(UserOrder userOrder, OrderDetail orderDetail);
}

UserOrderServiceImpl.java 实现类

java 复制代码
public class UserOrderServiceImpl implements UserOrderService {
    @Resource
    UserOrderMapper userOrderMapper;
    @Resource
    OrderDetailMapper orderDetailMapper;

    @Override
    public ResultDTO<UserOrder> confirmOrder(UserOrder userOrder, OrderDetail orderDetail) {
        ResultDTO<UserOrder> userOrderResultDTO = new ResultDTO<>();
        // 判断用户是否登录
        if (0!= userOrder.getUserId()) {
            int orderId = (int)(Math.random() * 1234567890);  // 生成随机的订单编号
            userOrder.setOrderId(orderId);
            userOrder.setOrderTime(new Timestamp(System.currentTimeMillis()));  // 将当前系统的时间直接填入
            
            
            int orderSubmit = userOrderMapper.insertUserOrder(userOrder);
            if (orderSubmit > 0) {
                // 订单插入成功,才能进行订单详情插入
                orderDetail.setOrderId(orderId);
                int orderDetailSubmit = orderDetailMapper.insertOrderDetail(orderDetail);
                if (orderDetailSubmit > 0) {
                    userOrderResultDTO.setCode(200);
                    userOrderResultDTO.setMsg("下单成功!");
                    userOrderResultDTO.setData(userOrder);
                } else {
                    userOrderResultDTO.setCode(500);
                    userOrderResultDTO.setMsg("下单失败!");
                    userOrderResultDTO.setData(null);
                }
            }
        } else {
            userOrderResultDTO.setCode(500);
            userOrderResultDTO.setMsg("下单失败!");
            userOrderResultDTO.setData(null);
        }
        return userOrderResultDTO;
    }
}

UserOrderController.java

java 复制代码
    @RequestMapping("/confirmOrder")
    @ResponseBody
    // http://localhost:8082/project/order/confirmOrder
    public ResultDTO confirmOrder(UserOrder userOrder, OrderDetail orderDetail) throws Exception {
        // System.out.println("userOrder:" + userOrder);
        // System.out.println("orderDetail:" + orderDetail);
        ResultDTO<UserOrder> confirmOrderResult =  userOrderService.confirmOrder(userOrder, orderDetail);

        return  confirmOrderResult;
    }

这边是直接以ResultDTO的形式返回的,也可以使用ModelAndView进行数据的返回

相关推荐
cynicme15 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
青云交16 小时前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu16 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
Lei活在当下17 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
不穿格子的程序员17 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
漂流瓶jz17 小时前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
这是个栗子18 小时前
【问题解决】用pnpm创建的 Vue3项目找不到 .eslintrc.js文件 及 后续的eslint配置的解决办法
javascript·vue.js·pnpm·eslint
lkbhua莱克瓦2418 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue00818 小时前
C#类继承
java·开发语言·c#
凯芸呢18 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea