###Jsp+Servlet购物商城day03.3:生成订单。【重中之重:保存多表信息】:使用事物,dao两个方法分别插入主表和从表信息。

这里我犯了一个错误。就是只插入了主表Order信息,没有插入从表OrderItem。

页面显示竟然没错误。I 服了 U。===原因是:Cart封装完整。数据库随意插入,没多想。就只插了Order表。

今天做“我的订单”模块才发现,“提交订单”OrderItem表插入数据失败!----都是自负惹的祸。


这就算了。知道该插入两张表信息,却毫无思路!!!惨。

上代码:

servlet:


public class OrderServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;
	
	//====多层数据的封装,必须自己总结一套 套路。思路清晰熟练。?下面
	public String save(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
			User user = (User) request.getSession().getAttribute("logingUser");
			if (user==null) {
//				response.sendRedirect("/login.jsp");//==###=重定向,后面代码不会再执行。
				return "/login.jsp";
			}
			Cart cart = (Cart) request.getSession().getAttribute("cart");
			/*===######==数据封装。购物项==订单项,购物车==Order。对应数据关系。
			 【总体思想:把session里的cart信息,取出来封装到 order里】
			 ①cartItem信息和OrderItem页面信息基本完全一样,只是个别表字段多加了几个特有外键属性。
			表结构不同, 因此OrderItem不能直接使用 CartItem的Bean类。
			②cart和Order相似。都对内容进行封装。都有总价。很相似。
			====总结===Cart.jsp到OrderInfo.jsp的过渡:
			本质就是:Session购物车数据 Cart取出来重新封装在Order里,再在页面显示重新Order信息。
			=====难点也就是逐层封装的具体过程。需要非常熟练。
			 */
			Orders order = new Orders();
			//
			order.setOid(UUIDUtils.getUUID());
			order.setDate(new Date());
			order.setState(0);
			order.setTotal(cart.getTotalMoney());
			order.setUser(user);
			//
			//OrderItem orderItem = new OrderItem();//===放在外面,Map永远只存了最后一个OrderItem
			LinkedHashMap<String, OrderItem> map = new LinkedHashMap<String, OrderItem>();
			
			Collection<CartItem> items = cart.getItems();
			for (CartItem cartItem : items) {
				OrderItem orderItem = new OrderItem();//===放在外面,Map永远只存了最后一个OrderItem
				//System.out.println("cartItem:"+cartItem.getPro().getPname()+"="+cartItem.getTotal());
				orderItem.setCount(cartItem.getCount());
				orderItem.setItemid(cartItem.getPro().getPid());
				orderItem.setOrder(order);
				orderItem.setPro(cartItem.getPro());
				map.put(cartItem.getPro().getPid(), orderItem);
			}
			System.out.println("===map"+map);//===ok===
			order.setOrderItems(map);
			
			/*//===测试。
			Collection<OrderItem> orderItems = order.getOrderItems();
			for (OrderItem item : orderItems) {
				System.out.println("一个orderItem:【");
				System.out.println("==="+item.getItemid());
				System.out.println("==="+item.getCount());
				System.out.println("==="+item.getSubtotal());
				System.out.println("==="+item.getPro().getPname());
				System.out.println("】");
			}
			System.out.println();//===重写toString()*/			
			OrderService os = new OrderServiceImpl();
			try {	
				/*boolean b = os.save(order);
				if(b){
					request.getSession().removeAttribute("cart");
				}
				//==######=dao 一般不会保存失败。出错,肯定是sql语句语法问题。返回值是void就行,不用判断是否保存成功。代码简写即可*/				
				os.save(order);
				request.getSession().removeAttribute("cart");
				//===
				request.setAttribute("order", order);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return "order_info.jsp";
	}

}
service:

//===teacher===####################==【插入多表信息。毫无思路。一点都不熟!!!】
	@Override
	public void save(Orders orders) throws SQLException {
		//==######=保存两张表数据:orders(下单时间。用户信息等基本信息)。和orderitem
		//==######=多个SQL语句使用事物
		OrderDao od = new OrderDaoImpl();
		//开启事务
		Connection conn = C3p0Utils.getConnection();
		conn.setAutoCommit(false);
		//执行Java代码
		//先插入主表数据
		od.save(conn,orders);
		//再插入从表
		Collection<OrderItem> items = orders.getOrderItems();
		for (OrderItem oi : items) {
			od.save(conn,oi);
		}
		//提交事务。
		DbUtils.commitAndClose(conn);
		
	}
dao:

       @Override
	public void save(Connection conn, Orders order) throws SQLException {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "insert into orders values(?,?,?,?,   ?,?,?,?)";//===######==【插入表,参数自然照着表字段写,外键不能插入对象】
		Object[] params = {order.getOid(),order.getDate(),order.getTotal(),
				order.getState(),order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()};
		 qr.update(conn,sql, params);
	}
	@Override
	public void save(Connection conn, OrderItem oi) throws SQLException {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		/*
		 private String  itemid;
		private int count;
		private double subtotal;
		private Product pro ;
		private Orders order ;
		 * */
		String sql = "insert into orderitem values(?,?,?,?,   ?)";
		Object[] params = {oi.getItemid(),oi.getCount(),
				oi.getSubtotal(),oi.getPro().getPid(),oi.getOrder().getOid()};//===对象属性插入id。
		//插入oi.getOrder()。导致:Invalid argument value: java.io.NotSerializableException 
		 qr.update(conn,sql, params);
	}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值