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);
}

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

  1. Activiti工作流学习笔记(三)——自动生成28张数据库表的底层原理分析

    原创/朱季谦 我接触工作流引擎Activiti已有两年之久,但一直都只限于熟悉其各类API的使用,对底层的实现,则存在较大的盲区. Activiti这个开源框架在设计上,其实存在不少值得学习和思考的地 ...

  2. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  3. Hibernate第三天——表间关系与级联操作

    第三天,我们来使用Hibernate进行表之间一对多 多对多关系的操作: 这里我们先利用两个例子进行表关系的回顾: 一对多(重点): 例如分类和商品的关系,一个分类多个商品,一个商品属于一个分类 CR ...

  4. Oracle 函数 “自动生成订单号”

    create or replace function get_request_code return varchar2 AS --函数的作用:自动生成订单号 v_mca_no mcode_apply_ ...

  5. SQL Server三种表连接原理

    在SQL Server数据库中,查询优化器在处理表连接时,通常会使用一下三种连接方式: 嵌套循环连接(Nested Loop Join) 合并连接 (Merge Join) Hash连接 (Hash ...

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

    转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询  MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...

  7. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  8. C# 处理Word自动生成报告 三、设计模板

    C# 处理Word自动生成报告 一.概述 C# 处理Word自动生成报告 二.数据源例子 C# 处理Word自动生成报告 三.设计模板 C# 处理Word自动生成报告 四.程序处理 既然是模板就少不了 ...

  9. django 多对多自定义第三张表时的注意事项

    杂交(自定义第三张表+ManyToManyField) # modles.py class Boy(models.Model): name = models.CharField(max_length= ...

随机推荐

  1. php调用API支付接口(使用第三方接口,调用的天工接口。)

    首先访问  https://charging.teegon.com/  注册账号, 找到开发配置   记下client_id和client_secret. 点击 天工开放平台 点击天工收银 点击  S ...

  2. Redis 安装与初体验

    一.Redis简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  3. Flex 布局教程

    今天给大家分享一下flex布局的语法 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于 ...

  4. VS.NET2010水晶报表安装部署[VS2010]

    水晶报表VS2010版IDE安装标准版SAP Crystal Reports, version for Visual Studio 2010 - Standard: 下载地址: http://down ...

  5. Asp.Net MVC 之 Autofac 初步使用3 集成web api

    今天我们试着在WebApi2实现autofac的注入,关于这方面也是看了几位园友的分享省了不少时间,所以结合着前篇的demo再新建webapi进行... 一样开篇还是发下大概demo结构: 还是nug ...

  6. Host文件修改后无效的解决办法

    什么是hosts文件? 简单的说,hosts文件是用于本地dns服务(相关主题:什么是DNS缓存,如何清除DNS缓存?)的,采用ip 域名的格式写在一个文本文件当中,Hosts是一个没有扩展名的系统文 ...

  7. android sdk tools 一览

    ANDROID SDK ADKROID SDK的工具划分为两部分,一部分是SDK tools,与平台无关,另一部分是Platform tools支持最新的安卓平台   SDK tools有 SDK m ...

  8. 2208: [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1371  Solved: 557[Submit][Status ...

  9. 算法模板——sap网络最大流 3(递归+邻接表)

    实现功能:同前 程序还是一如既往的优美,虽然比起邻接矩阵的稍稍长了那么些,不过没关系这是必然,但更重要的一个必然是——速度将是一个质的飞跃^_^(这里面的point指针稍作了些创新——anti指针,这 ...

  10. 【Unity优化】如何实现Unity编辑器中的协程

    Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...