生成订单:三个表(Products,Orders,OrderItem)

1.有三个表(Product上,Orders,OrderItem)

分别创建对应的三个实体类

OrderItem中有外键Order_id 参考Orders中的id ;Product_id参考Product中的id;Orders中有外键User_id参考User中的id

sql 代码:

CREATE DATABASE day2017_04_05;
USE day2017_04_05;
CREATE TABLE `user` (
  `id` INT(11) AUTO_INCREMENT,
  `username` VARCHAR(20) ,
  `PASSWORD` VARCHAR(20) ,
  `gender` VARCHAR(10) ,
  `email` VARCHAR(50) ,
  `telephone` VARCHAR(20) ,
  `introduce` VARCHAR(100),
  `activeCode` VARCHAR(50) ,
  `state` INT(11) ,
  `role` VARCHAR(10) DEFAULT ‘普通用户‘,
  `registTime` TIMESTAMP ,
  PRIMARY KEY (`id`)
)
商品表
CREATE TABLE `products` (
  `id` VARCHAR(100) ,
  `name` VARCHAR(40) ,
  `price` DOUBLE ,
  `category` VARCHAR(40) ,
  `pnum` INT(11) ,
  `imgurl` VARCHAR(100) ,
  `description` VARCHAR(255) ,
  PRIMARY KEY (`id`)
)
订单表
CREATE TABLE `orders` (
  `id` VARCHAR(100) ,
  `money` DOUBLE ,
  `receiverAddress` VARCHAR(255) ,
  `receiverName` VARCHAR(20) ,
  `receiverPhone` VARCHAR(20) ,
  `paystate` INT(11) ,
  `ordertime` TIMESTAMP ,
  `user_id` INT(11) ,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)
订单项表
CREATE TABLE `orderitem` (
  `order_id` VARCHAR(100) ,
  `product_id` VARCHAR(100),
  `buynum` INT(11) ,
  PRIMARY KEY (`order_id`,`product_id`),
  FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`),
  FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
)

实体类

public class Order {
    private String id; // 订单编号
    private double money; // 订单总价
    private String receiverAddress; // 送货地址
    private String receiverName; // 收货人姓名
    private String receiverPhone; // 收货人电话
    private int paystate; // 订单状态
    private Date ordertime; // 下单时间
    private int userid;
    private List<OrderItem> orderItems;
}
public class OrderItem {
    private Order order;//订单
    private Product product; //商品
    private int buynum; //购物数量
    }
public class Product {
    private String id; // 商品编号
    private String name; // 名称
    private double price; // 价格
    private String category; // 分类
    private int pnum; // 数量
    private String imgurl; // 图片路径
    private String description; // 描述
    }
    

servlet 操作

package com.learning.web.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.learning.domain.Order;
import com.learning.domain.OrderItem;
import com.learning.domain.Product;
import com.learning.domain.User;
import com.learning.service.OrderService;

@WebServlet("/createOrder")
public class CreateOrderServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            Order order=new  Order();
            User user = (User) request.getSession().getAttribute("user");
            try {
                BeanUtils.populate(order, request.getParameterMap());
                order.setId(UUID.randomUUID().toString());
                order.setUserid(user.getId());
            } catch (Exception e) {
                e.printStackTrace();
            }

            List<OrderItem> orderItems=new ArrayList<OrderItem>();
            //从session中获取cart,添加到订单项中
            Map<Product, String> cart = (Map<Product, String>) request.getSession().getAttribute("cart");
            for (Map.Entry<Product, String> map : cart.entrySet()) {
                OrderItem orderItem=new OrderItem();
                orderItem.setBuynum(Integer.parseInt(map.getValue()));
                orderItem.setProduct(map.getKey());
                orderItem.setOrder(order);
                orderItems.add(orderItem);
            }

            order.setOrderItems(orderItems);
            OrderService orderService=new OrderService();
            orderService.createOrder(order);
            //生成订单,删除cart中的所有product
            cart.clear();

            request.getRequestDispatcher("/pay.jsp").forward(request, response);

    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
    public void createOrder(Order order) {
        try {

            ManageTheadLocal.startTransaction();
            orderDao.createOrder(order);
            orderItemDao.createOrderItem(order);
            productDao.updateProductNumber(order);
            ManageTheadLocal.commit();
        } catch (SQLException e) {
            ManageTheadLocal.rollback();
            e.printStackTrace();
        }
    }
public void createOrder(Order order) throws SQLException {
        QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());
        queryRunner.update(ManageTheadLocal.getConnection()," insert into orders values(?,?,?,?,?,?,?,?)",order.getId(),order.getMoney(),order.getReceiverAddress(),order.getReceiverName(),order.getReceiverPhone(),order.getPaystate(),order.getOrdertime(),order.getUserid());

    }

public void createOrderItem(Order order) throws SQLException {
            List<OrderItem> orderItems = order.getOrderItems();
            QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());
            Object[][] params =new Object[orderItems.size()][];
            for (int i = 0; i < params.length; i++) {
                params[i]=new Object[]{order.getId(),orderItems.get(i).getProduct().getId(),orderItems.get(i).getBuynum()};
            }
            queryRunner.batch(ManageTheadLocal.getConnection()," insert into orderitem values (?,?,?) ",params );
    }

public void updateProductNumber(Order order) throws SQLException {
        List<OrderItem> orderItems = order.getOrderItems();
        QueryRunner queryRunner=new QueryRunner(C3P0Util.getDataSource());

        Object[][] params=new Object[orderItems.size()][];
        for (int i = 0; i < params.length; i++) {
            params[i]=new Object[]{orderItems.get(i).getBuynum()};
        }
        queryRunner.batch(ManageTheadLocal.getConnection()," update products set pnum=pnum-?", params);
    }
时间: 2024-04-17 19:01:06

生成订单:三个表(Products,Orders,OrderItem)的相关文章

estore商城案例(四、五)------添加购物车&amp;购物车显示/生成订单&amp;在线支付

一.添加购物车 1.获得商品id提交到servlet程序 2.根据id获取product对象 3.判断seesion中是否有存在购物车session.没有的话表示  添加的第一件商品  需要先创建session:有的话直接在session里添加获得的produce(添加product 要先判断session中是否存在对应的商品,存在话直接修改商品数量,没有的话新添加这个商品). servlet程序代码: 1 public void doGet(HttpServletRequest request

用户扫码微信二维码生成订单(三)

官方API:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 首先要修改/lib/HttpService.cs 把Get和Post中的的设置代理服务器代码进行隐藏: 修改前: WebProxy proxy = new WebProxy();proxy.Address = new Uri(WxPayConfig.PROXY_URL);request.Proxy = proxy; 修改后: //WebProxy proxy =

网上图书商城项目学习笔记-018生成订单

一.流程分析 1.订单模块介绍 2.生成订单流程 二.代码 1.view层 (1)showitem.jsp 1 <form id="form1" action="<c:url value='/OrderServlet'/>" method="post"> 2 <input type="hidden" name="cartItemIds" value="${cartIt

SQL Server三种表连接原理

http://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop J

第三章 表单笔记

第三章                                                                表单  笔记 attion 此属性指示服务器处理表单输出的程序一般来说,当用户单点击的"提交"按钮后信息发送到Web服务器上,由attion属性所指的程序处理如果action为空则默认提交到本页method此属性告诉浏览器,如何将数据发送给服务器,他指向服务器发送数据的方法.语法为method=(getpost)<form method="

MySQL订单分库分表多维度查询

转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单表为例, 按照用户ID mod 64 分成 64个数据库.按照用户的维度查询很快,因为最终的查询落在一台服务器上.但是如果按照商户的维度查询,则代价非常高.需要查询全部64台服务器.在分页的情况下,更加恶化.比如某个商户查询第10页的数据(按照订单的创建时间).需要在每台数据库服务器上查询前100条数

Goods:生成订单

OrderServlet #createOrder 1 /* 2 * 3 * 生成订单 4 */ 5 public String createOrder(HttpServletRequest req, HttpServletResponse resp) 6 throws ServletException, IOException { 7 //获取所有购物车条目ID 查询之 8 String cartItemIds=req.getParameter("cartItemIds"); 9 L

业务受理需求 客户下单 根据前台页面所选的省市区 关联定区去生成订单

1 业务受理需求 注要:通过客户提交信息自动找到快递员上门取件.   1.客户通过打电话,网络(前台系统)提交物流委托信息(寄件人地址,电话)到后台管理系统,后台管理系统会将客户物流委托信息保存到数据库中,这个物流委托信息称为:订单 Order   2.后台管理保存完订单数据后,系统根据取件地址自动匹配到快递员,系统会给快递员产生取件任务,系统会给快递员发送一条短信..这个取件任务称为:工单 WorkBill.   3.快递员根据短信中取件信息上门取件,快递员会给客户提供纸质单据(快递单),填写

订单分库分表实践总结

订单分库分表实践总结 主库容量已接近服务器物理空间上限,同时也已经达到MySQL的处理上限,很快将无法再处理新增订单. 旧订单库面临的问题有: 1.超大容量问题 订单相关表都已经是超大表,最大表的数据量已经是几十亿,数据库处理能力已经到了极限: 单库包含多个超大表,占用的硬盘空间已经接近了服务器的硬盘极限,很快将无空间可用: 2.性能问题 单一服务器处理能力是有限的,单一订单库的TPS也有上限,不管如何优化,总会有达到上限,这限制了单位时间的订单处理能力,这个问题在大促时更加明显,如果不重构,订