学习过程:
完成了购物车后,下面我们需要做的就是确认下单操作了,大家可以先看看数据库的设计,这个保存我们需要保持订单以及订单的所有的详细信息,所有在添加订单的时候需要同时添加几条信息,为了保证数据的完整性,这里必须使用事务进行处理。
1、dao层的实现。当然这里还有一个知识点,就是如何获得刚刚插入数据的id呢,因为订单和订单详细两个表是一对多的关系,在插入订单详细的数据时需要订单的id,而这个id是由数据库自增实现的,由于不同的数据库对主键的自增的实现不同,所以要想获得刚刚插入的这个自增的id的值,不同的数据库也有不同的实现方式。
mysql最为简单就是使用LAST_INSERT_ID()函数就可以了。
oracle的实现方式不是很一样,可以先取得id:SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL,再插入数据的时候把这个id设置进去。
这里我们先以mysql来实现,dao层的实现代码如下:
public void addorder(Order order, List<OrderDetail> orderDetails) {
Connection connection = getCon();
try {
connection.setAutoCommit(false);
// 添加订单
String sql = "insert into orders(member_id,order_time,addr,real_name,phone,countcash,status) values(?,?,?,?,?,?,?)";
ps = connection.prepareStatement(sql);
ps.setObject(1, order.getMemberId());
ps.setObject(2, order.getOrderTime());
ps.setObject(3, order.getAddr());
ps.setObject(4, order.getRealName());
ps.setObject(5, order.getPhone());
ps.setObject(6, order.getCountcash());
ps.setObject(7, order.getStatus());
ps.executeUpdate();
int lastorderid = 0;// 拿到刚刚插入订单Id
rs = exeQuery("SELECT LAST_INSERT_ID()", null);
try {
if (rs.next()) {
lastorderid = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
//
String sql2 = "insert into order_detail(order_id,goods_id,cash,nums) values(?,?,?,?)";
for (OrderDetail orderDetail : orderDetails) {
ps = connection.prepareStatement(sql2);
ps.setObject(1, lastorderid);
ps.setObject(2, orderDetail.getGoodsId());
ps.setObject(3, orderDetail.getCash());
ps.setObject(4, orderDetail.getNums());
ps.executeUpdate();
}
connection.commit();
} catch (SQLException e) {
try {
connection.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
2、servlet的实现。就是从购物车中获得购物信息,然后组织成为订单和订单详情对象,下单成功后清空购物车,并跳转到列表页面就可以了。代码如下:
public class OrderServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OrderDao orderDao = new OrderDao();
GoodsTypesDao goodsTypesDao = new GoodsTypesDao();
String ope = request.getParameter("ope");
HttpSession session = request.getSession();
// 结账
if (ope == null || ope.equals("add")) {
// 1、判断用户是否已经登陆
if (session.getAttribute("member") == null) {
// 没有登陆要求先登陆
response.sendRedirect("login.jsp?topage=order");
return;
}
Member member = (Member) session.getAttribute("member");
List<Cart> carts = (List<Cart>) session.getAttribute("carts");
// 封装 order 和 orderDetail 》》 session
List<OrderDetail> orderDetails = new ArrayList<OrderDetail>();
Order order = new Order();
// 封装订单
order.setAddr(member.getAddr());
order.setCountcash(count(carts));
order.setMemberId(member.getMemberId());
order.setOrderTime(new Date());
order.setPhone(member.getPhone());
order.setRealName(member.getRealName());
order.setStatus(Order.NOT);
// 封装订单详情
for (Cart cart : carts) {
OrderDetail orderDetail = new OrderDetail();
orderDetail.setCash(cart.getGoods().getCash());
orderDetail.setGoodsId(cart.getGoods().getGoodsId());
orderDetail.setNums(cart.getNum());
orderDetails.add(orderDetail);
}
// 添加订单到数据库中
orderDao.addorder(order, orderDetails);
response.sendRedirect("orderServlet?ope=list");
} else if (ope.equals("list")) {
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
private double count(List<Cart> carts) {
double result = 0.0;
for (Cart cart : carts) {
result += (cart.getGoods().getCash() * cart.getNum());
}
return result;
}
}