案例4-生成订单
需求:
在购物车页面上,有i一个提交订单,点击的时候,将用户购物车中的商品添加到数据库中.
实体:
用户
订单
订单项(中间表)
商品
需要在order实体提供 user对象和list<OrderItem>
需要在orderItem实体中提供 product对象和order对象
步骤分析:
点击生成订单:
/store/order?method=add
创建OrderServlet
add方法中:
1.判断用户是否登录,
2.封装数据 Order
oid 随机
total 购物车中的总金额
ordertime 当前时间
User session中当前用户
订单项集合List<OrderItem>
创建OrderItem,然后添加到list中
orderItem从那里来????????/
购物车中CartItem
name(先不管)
address(先不管)
telephone(先不管)
3.调用orderservice 生成订单
开启事务
先往订单表中插入一条数据
往订单项表中插入n条数据
提交事务
创建表
订单表 CREATE TABLE `orders` ( `oid` varchar(32) NOT NULL, `ordertime` datetime DEFAULT NULL, `total` double DEFAULT NULL, `state` int(11) DEFAULT NULL, `address` varchar(30) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `uid` varchar(32) DEFAULT NULL, PRIMARY KEY (`oid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 订单项表 CREATE TABLE `orderitem` ( `itemid` varchar(32) NOT NULL, `count` int(11) DEFAULT NULL, `subtotal` double DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `oid` varchar(32) DEFAULT NULL, PRIMARY KEY (`itemid`), KEY `fk_0001` (`pid`), KEY `fk_0002` (`oid`), CONSTRAINT `fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`), CONSTRAINT `fk_0002` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建bean
com.louis.domain.Order
package com.louis.domain; import java.io.Serializable; import java.util.Date; import java.util.LinkedList; import java.util.List; public class Order implements Serializable{ /* * `oid` varchar(32) NOT NULL, `ordertime` datetime DEFAULT NULL, `total` double DEFAULT NULL, `state` int(11) DEFAULT NULL, `address` varchar(30) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `uid` varchar(32) DEFAULT NULL, */ private String oid; private Date ordertime; private Double total; private Integer state=0;//订单状态 0:未支付 1:已支付 private String address; private String name; private String telephone; //属于那个用户 private User user; //包含那些订单项 private List<OrderItem> items=new LinkedList<>(); //“属于”对应mysql中的字段,"包含"则不用,但“被包含”会对应mysql字段 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 Integer getState() { return state; } public void setState(Integer 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<OrderItem> getItems() { return items; } public void setItems(List<OrderItem> items) { this.items = items; } }
com.louis.domain.OrderItem
package com.louis.domain; import java.io.Serializable; public class OrderItem implements Serializable{ /** * `itemid` varchar(32) NOT NULL, `count` int(11) DEFAULT NULL, `subtotal` double DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `oid` varchar(32) DEFAULT NULL, */ private String itemid; private Integer count; private Double subtotal; //包含那个商品 private Product product; //属于那个订单 private Order order; public String getItemid() { return itemid; } public void setItemid(String itemid) { this.itemid = itemid; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public Double getSubtotal() { return subtotal; } public void setSubtotal(Double subtotal) { this.subtotal = subtotal; } 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; } }
/store/src/beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="CategoryService" class="com.louis.service.impl.CategoryServiceImpl"></bean> <bean id="ProductService" class="com.louis.service.impl.ProductServiceImpl"></bean> <bean id="UserService" class="com.louis.service.impl.UserServiceImpl"></bean> <bean id="OrderService" class="com.louis.service.impl.OrderServiceImpl"></bean> <bean id="ProductDao" class="com.louis.dao.impl.ProductDaoImpl"/> <bean id="UserDao" class="com.louis.dao.impl.UserDaoImpl"/> <bean id="CategoryDao" class="com.louis.dao.impl.CategoryDaoImpl"/> <bean id="OrderDao" class="com.louis.dao.impl.OrderDaoImpl"/> </beans>
/store/WebContent/jsp/cart.jsp
<a href="${pageContext.request.contextPath }/order?method=add">
<input type="submit" width="100" value="提交订单" name="submit" border="0" style="background: url('${pageContext.request.contextPath}/images/register.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0);
height:35px;100px;color:white;">
</a>
com.louis.web.servlet.OrderServlet
package com.louis.web.servlet; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.ConvertUtils; import com.louis.domain.Cart; import com.louis.domain.CartItem; import com.louis.domain.Order; import com.louis.domain.OrderItem; import com.louis.domain.Product; import com.louis.domain.User; import com.louis.myconvertor.MyConverter; import com.louis.service.OrderService; import com.louis.service.ProductService; import com.louis.service.impl.OrderServiceImpl; import com.louis.service.impl.ProductServiceImpl; import com.louis.utils.BeanFactory; import com.louis.utils.UUIDUtils; import net.sf.ehcache.search.expression.Between; public class OrderServlet extends BaseServlet { public String add(HttpServletRequest request, HttpServletResponse response) throws Exception { //0.判断用户是否登录 User user=(User) request.getSession().getAttribute("user"); if(user == null){ request.setAttribute("msg", "请先登录~~"); return "/jsp/msg.jsp"; } //1.封装数据 Order order=new Order(); //1.1 订单id order.setOid(UUIDUtils.getId()); //1.2 订单时间 DateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); order.setOrdertime(dateFormat2.parse("2010-09-13 22:36:01")); //1.3 总金额 //获取session中cart Cart cart=(Cart) request.getSession().getAttribute("cart"); order.setTotal(cart.getTotal()); //1.4 订单的所有订单项 /* * 先获取cart中itmes * 遍历itmes 组装成orderItem * 将orderItem添加到list(items)中 */ for (CartItem cartItem : cart.getItmes()) { OrderItem oi = new OrderItem(); //设置id oi.setItemid(UUIDUtils.getId()); //设置购买数量 oi.setCount(cartItem.getCount()); //设置小计 oi.setSubtotal(cartItem.getSubtotal()); //设置product oi.setProduct(cartItem.getProduct()); //设置order oi.setOrder(order); //添加到list中 order.getItems().add(oi); } //1.5 设置用户 order.setUser(user); //2.调用service 添加订单 OrderService os=(OrderService) BeanFactory.getBean("OrderService"); os.add(order); //3.将order放入request域中,请求转发 request.setAttribute("bean", order); //4.清空购物车,不清空的话,下次购买上次的商品还在购物车内 request.getSession().removeAttribute("cart"); return "/jsp/order_info.jsp"; } }
/store/WebContent/WEB-INF/web.xml
<servlet> <description></description> <display-name>OrderServlet</display-name> <servlet-name>OrderServlet</servlet-name> <servlet-class>com.louis.web.servlet.OrderServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OrderServlet</servlet-name> <url-pattern>/order</url-pattern> </servlet-mapping>
com.louis.service.impl.OrderServiceImpl
package com.louis.service.impl; import com.louis.dao.OrderDao; import com.louis.domain.Order; import com.louis.domain.OrderItem; import com.louis.service.OrderService; import com.louis.utils.BeanFactory; import com.louis.utils.DataSourceUtils; public class OrderServiceImpl implements OrderService { @Override public void add(Order order) throws Exception { try { //1、开启事务 DataSourceUtils.startTransaction(); OrderDao orderDao = (OrderDao) BeanFactory.getBean("OrderDao"); //2、向order表中添加一个数据 orderDao.add(order); //3、向orderItem中添加n条数据 for(OrderItem orderItem : order.getItems()) { orderDao.addItem(orderItem); } //4、事务处理 DataSourceUtils.commitAndClose(); } catch (Exception e) { e.printStackTrace(); DataSourceUtils.rollbackAndClose(); throw e; } } }
com.louis.dao.impl.OrderDaoImpl
package com.louis.dao.impl; import org.apache.commons.dbutils.QueryRunner; import com.louis.dao.OrderDao; import com.louis.domain.Order; import com.louis.domain.OrderItem; import com.louis.utils.DataSourceUtils; public class OrderDaoImpl implements OrderDao { /** * 添加一条订单 */ @Override public void add(Order order) throws Exception { //如果带有参数,则是自动开启事务,整体事务会出现问题 QueryRunner qr = new QueryRunner(); /* * `oid` varchar(32) NOT NULL, `ordertime` datetime DEFAULT NULL, `total` double DEFAULT NULL, `state` int(11) DEFAULT NULL, `address` varchar(30) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `uid` varchar(32) DEFAULT NULL, */ String sql="insert into orders values(?,?,?,?,?,?,?,?)"; qr.update(DataSourceUtils.getConnection(),sql, order.getOid(),order.getOrdertime(),order.getTotal(),order.getState(), order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()); } /** * 添加一条订单项 */ @Override public void addItem(OrderItem oi) throws Exception { QueryRunner qr = new QueryRunner(); /** * `itemid` varchar(32) NOT NULL, `count` int(11) DEFAULT NULL, `subtotal` double DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `oid` varchar(32) DEFAULT NULL, */ String sql="insert into orderitem values(?,?,?,?,?)"; qr.update(DataSourceUtils.getConnection(),sql, oi.getItemid(),oi.getCount(),oi.getSubtotal(),oi.getProduct().getPid(),oi.getOrder().getOid()); } }
/store/WebContent/jsp/order_info.jsp
<div style="margin:0 auto;margin-top:10px;950px;"> <strong>订单详情</strong> <table class="table table-bordered"> <tbody> <tr class="warning"> <th colspan="5">订单编号:${bean.oid } </th> </tr> <tr class="warning"> <th>图片</th> <th>商品</th> <th>价格</th> <th>数量</th> <th>小计</th> </tr> <c:forEach items="${bean.items }" var="oi"> <tr class="active"> <td width="60" width="40%"> <input type="hidden" name="id" value="22"> <img src="${pageContext.request.contextPath}/${oi.product.pimage}" width="70" height="60"> </td> <td width="30%"> <a target="_blank">${oi.product.pname }</a> </td> <td width="20%"> ¥${oi.product.shop_price } </td> <td width="10%"> ${oi.count } </td> <td width="15%"> <span class="subtotal">¥${oi.subtotal }</span> </td> </tr> </c:forEach> </tbody> </table> </div>
问题
1、mysql主键外键
2、Sat Oct 14 21:47:13 CST 2017