确认下单

发表时间:2017-05-15 17:14:47 浏览量( 23 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

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

1、dao层的实现。当然这里还有一个知识点,就是如何获得刚刚插入数据的id呢,因为订单和订单详细两个表是一对多的关系,在插入订单详细的数据时需要订单的id,而这个id是由数据库自增实现的,由于不同的数据库对主键的自增的实现不同,所以要想获得刚刚插入的这个自增的id的值,不同的数据库也有不同的实现方式。

mysql最为简单就是使用LAST_INSERT_ID()函数就可以了。

oracle的实现方式是:


这里我们先以mysql来实现,dao层的实现代码如下:

  public class OrderDao extends BaseDao {	/*	 * @param order 订单	 * 	 * @param orderDetails 订单详细信息	 * 	 * @throws SQLException	 */	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的实现。就是从购物车中获得购物信息,然后组织成为订单和订单详情对象,下单成功后清空购物车,并跳转到列表页面就可以了。代码如下:

  /** * 前台订单管理 结账 订单查询 *  * @author Administrator *  */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;	}}