44、确认下单

学习过程:

完成了购物车后,下面我们需要做的就是确认下单操作了,大家可以先看看数据库的设计,这个保存我们需要保持订单以及订单的所有的详细信息,所有在添加订单的时候需要同时添加几条信息,为了保证数据的完整性,这里必须使用事务进行处理。

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;

	}

}

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/84072219
44