这里我犯了一个错误。就是只插入了主表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);
}