保存订单:
为订单表中插入一行数据,描述本次交易,这行数据部分数据是通过程序赋予的,部分数据是来自购物车的,部分数据是来自session中的用户
数据库当中创建表
1、订单表orders
其中:
**oid:UUIDUtils
orderTime:new Date();
total:从购物车获取
state:1
address:null
name:null
telephone:null
uid:从session中的用户获取到**
保存订单项:
向订单项表中插入数据,描述当前订单的一个详细的购买信息,部分数据是来自购物车,部分数据需要通过程序赋予。
2、订单表orderitem
提交的商品表
**itemid:UUIDUtils
uid:来自于购物车中的购物项
total:来自购物车中的购物项
pid:来自购物车上购物项下商品对象的pid
oid:来自于当前订单的id**
用户点击提交订单,将购物车中的数据以订单/订单的形式保存来,然后清空购物车
保存订单:
为订单表中插入一行数据,描述本次及交易,这行数据部分数据是通过程序赋予的,部分数据来自购物车,部分数据来自session中的用户
创建OrderServlet OrderService OrderServiceImpl OrderDaoImpl
Order{User user,List list = new ArrayList}
OrderItem{Product product,Order order}
创建Order{User user,List list = new ArrayList}
public class Order {
private String oid; //订单编号
private Date ordertime; //下单时间
private double total; //总计
private int state; //状态
private String address; //收货人地址
private String name; //收货人姓名
private String telephone; //收货人电话
//程序对象和对象发送关系,而不是对象和对象的属性发送关系
//设计Order目的:让Order携带更多的数据向service,dao传递,user对象是可以携带更多的数据
private User user;
//程序中体现订单对象和订单之间关系,我们再在项目中的部分功能中有类似的需求:查询订单的同时还需要获取订单下所有的订单项
private List list = new ArrayList();
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Order() {
// TODO Auto-generated constructor stub
}
public Order(String oid, Date ordertime, double total, int state, String address, String name, String telephone,
User user, List list) {
super();
this.oid = oid;
this.ordertime = ordertime;
this.total = total;
this.state = state;
this.address = address;
this.name = name;
this.telephone = telephone;
this.user = user;
this.list = list;
}
@Override
public String toString() {
return “Order [oid=” + oid + “, ordertime=” + ordertime + “, total=” + total + “, state=” + state + “, address=”
- address + “, name=” + name + “, telephone=” + telephone + “, user=” + user + “, list=” + list + “]”;
}
}
创建OrderItem{Product product,Order order}
package cn.itzheng.store.domain;
public class OrderItem {
private String itemid;// id
private int quantity; // 数量
private double total;// 小计
// 1、对象对应对象
// 2、product,order携带更多的数据
private Product product;// 获取其对象上的商品ip即为pid
private Order order;// 获取对象上的oid,当前订单id
public String getItemid() {
return itemid;
}
public void setItemid(String itemid) {
this.itemid = itemid;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public OrderItem() {
// TODO Auto-generated constructor stub
}
public OrderItem(String itemid, int quantity, double total, Product product, Order order) {
super();
this.itemid = itemid;
this.quantity = quantity;
this.total = total;
this.product = product;
this.order = order;
}
@Override
public String toString() {
return “OrderItem [itemid=” + itemid + “, quantity=” + quantity + “, total=” + total + “, product=” + product
- “, order=” + order + “]”;
}
}
创建OrderServlet
**创建saveOrder方法
确认用户登录状态
创建订单对象,为订单对象赋值
遍历购物项的同时,创建订单项
调用业务层功能:保存订单
清空购物车
将订单放入request
转发/jsp/order_info.jsp
return “/jsp/order_info.jsp”;**
public class OrderServlet extends BaseServlet {
// saveOrder 将购物车中的信息以订单的形式保存
public String saveOrder(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
// TODO Auto-generated method stub
// 确认用户登录状态 从session当中获取对应user
User user = (User) request.getSession().getAttribute(“loginUser”);
if (null == user) {
request.setAttribute(“msg”, “请登录之后在下单”);
return “/jsp/info.jsp”;
}
// 从session作用域当中获取购物车
Cart cart = (Cart) request.getSession().getAttribute(“cart”);
// 创建订单对象,为订单对象赋值
Order order = new Order();
order.setOid(UUIDUtils.getCode());// oid获取随机的
order.setOrdertime(new Date());// 获取当前时间
order.setTotal(cart.getTotal());// 获取当前总金额
order.setState(1);
order.setUser(user);// 将当前用户放入到订单当中
// 遍历购物项的同时,创建订单项,为订单项赋值
for (CartItem item : cart.getCartItems()) {// 遍历购物车当中的购物项,cart.getCartItems():获取到购物车当中所有的商品的集合
OrderItem orderItem = new OrderItem();
orderItem.setItemid(UUIDUtils.getCode());// 设置商品编号
orderItem.setQuantity(item.getNum());// 设置订单的商品的数量是Cart当中CartItem商品项的数量
orderItem.setTotal(item.getSubTotal());//将商品的小计设置搭配订单项的金额当中
orderItem.setProduct(item.getProduct());//获取到商品项当中的每一个商品,将商品项放入到订单项当中
//设置当前的订单项属于那个订单:程序的角度体验订单订单项和订单对应关系
orderItem.setOrder(order);//将订单放入到订单项当中,以便获取订单编号
order.getList().add(orderItem);//将每一个订单项放入的到对应的订单当中
}
//调用业务层功能,保存订单
OrderService orderService = new OrderServiceImpl();
//将订单数据,用户数据,订单下所有的订单项都传递到service层
orderService.saveOrder(order);
//清空购物车
cart.clearCart();
//将订单信息放入request
request.setAttribute(“order”, order);
//转发到/jsp/order_info.jsp
return “/jsp/order_info.jsp”;
}
}
OrderService
public interface OrderService {
void saveOrder(Order order) throws SQLException;
}
OrderServiceImpl
public class OrderServiceImpl implements OrderService {
OrderDao orderDao = new OrderDaoImpl();
@Override
public void saveOrder(Order order) throws SQLException {
/*
-
try { //保存订单和订单下所有的订单项(同时成功或者同时失败) //开启数据的事务 JDBCUtils.startTransaction();
-
OrderDao orderDao = new OrderDaoImpl();
-
orderDao.saveOrder(order);
-
for(OrderItem item:order.getList()) {//遍历所有的订单项 orderDao.saveOrderItem(item);
-
}
-
} catch (Exception e) { // TODO: handle exception
-
JDBCUtils.commitAndClose();//关闭事务 }
*/
Connection conn = null;
try {
//获取到链接
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);//开启事务
//保存订单
orderDao.savaOrder(conn,order);
//保存订单项
//遍历订单上的每一个购物项
for(OrderItem item:order.getList()) {
orderDao.savaOrderItem(conn,item);
}
//提交事务
conn.commit();
} catch (Exception e) {
// TODO: handle exception
//如果有异常
//回滚事务
conn.rollback();
}
}
}
OrderDao
public interface OrderDao {
void savaOrderItem(Connection conn, OrderItem item) throws SQLException;
void savaOrder(Connection conn, Order order)throws SQLException;
}
public class OrderDaoImpl implements OrderDao {
// 保存订单
@Override
public void savaOrder(Connection conn, Order order) throws SQLException {
// TODO Auto-generated method stub
String sql=“INSERT INTO orders VALUES(?,?,?,?,?,?,?,?)”;
QueryRunner qr=new QueryRunner();
Object[] params={order.getOid(),order.getOrdertime(),order.getTotal(),order.getState(),order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()};
qr.update(conn,sql,params);
}
// 保存订单项
@Override
public void savaOrderItem(Connection conn, OrderItem item) throws SQLException {
String sql=“INSERT INTO orderitem VALUES(?,?,?,?,?)”;
QueryRunner qr=new QueryRunner();
Object[] params={item.getItemid(),item.getQuantity(),item.getTotal(),item.getProduct().getPid(),item.getOrder().getOid()};
qr.update(conn,sql,params);
}
}
修改/jsp/order_info.jsp
原理分析:
最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
Runner qr=new QueryRunner();
Object[] params={item.getItemid(),item.getQuantity(),item.getTotal(),item.getProduct().getPid(),item.getOrder().getOid()};
qr.update(conn,sql,params);
}
}
修改/jsp/order_info.jsp
原理分析:
最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
[外链图片转存中…(img-xCeySDy9-1714309521836)]
[外链图片转存中…(img-2q945ci1-1714309521836)]