###Jsp+Servlet购物商城day04.2:订单模块难点总结。【购物商城最大的难点:【封装一个Order对象】查询封装三张表】

/*

①首先是保存订单:
涉及到 插入多表数据,这里是插入Order表和orderItem两张表。
只要数据封装完整(MapListHandler封装两张表数据到主表Bean,不难),
插入表,要先插入主表(Order),再插入从表(OrderItem)。

②然后是显示订单:
这个难度目前是,自认为【购物商城最大的难点】所在了。
首先,
功能入口:“我的订单”。===根据用户uid查询所有Order。
功能出口:页面显示

功能入口:“我的订单”。===根据用户uid查询所有Order。
首先要练习:根据uid 查询一个订单(【封装一个Order对象】)。
这个熟练了。查询所有订单就简单了。
service层查出所有oid。遍历调用Order getOrderByOid(oid)即可。

===首先要练习:根据uid 查询一个订单(【封装一个Order对象】)。===参考《###Jsp+Servlet购物商城day03.4》

*/

①练习:根据uid查询【一个订单】,封装一个完整的Order对象。

//==######=练习:【三层关联关系查询(三张表),必须使用两个SQL。】----老师代码:去掉注释。
		public static void main2(String[] args) throws Exception {
			//根据一个订单oid,查询一个订单的详细信息。
			//oid = 6e66b0ae4a4143fe99a30e4602f43355
			QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
			String sql = "select * from orders where oid = ?";
			Orders orders = qr.query(sql, new BeanHandler<Orders>(Orders.class),"6e66b0ae4a4143fe99a30e4602f43355");
			//System.out.println(orders);
			//根据一个订单oid,查询一个商品的详细信息。
			String sql2 = "SELECT * FROM orderitem LEFT OUTER JOIN PRODUCT ON orderitem.pid = product.pid WHERE oid = '6e66b0ae4a4143fe99a30e4602f43355'";
			List<Map<String, Object>> list = qr.query(sql2, new MapListHandler());
			
			//===封装OrderItem。两张表数据封装。
			List<OrderItem> oList = new ArrayList<OrderItem>();
			for(Map m : list){
				OrderItem oi = new OrderItem();
				MyBeanUtils.setObject(oi, m);
				Product pro = new Product();
				MyBeanUtils.setObject(pro, m);
				//===封装OrderItem。完毕
				oi.setPro(pro);
				oList.add(oi);
			}
			//===封装Order。完毕
			orders.setOrderItems(oList);
			
			System.out.println(orders);
			List<OrderItem> ois =  orders.getOrderItems();
			//List<OrderItem> ois = (List<OrderItem>) orders.getOrderItems();
			for(OrderItem oi : ois){
				System.out.println(oi);
			}
		}

②我直接把练习main里,封装Order代码,复制到一个 dao方法Orders findByOid(oid)里。返回一个完整Order对象。

====这样功能没问题。只是封装数据的业务没有 放在service。而且不符合“dao一个方法只有一个SQL语句”的原则。

【我的dao: 】

findByOid:

也可以改:

就是

===把findByOid()拆封为两个dao方法(一个方法一个SQL):Orders findOrderByOid(oid) 和 OrderItems findOrderItemsByOid(oid)。

===然后在service()调用这两个方法,给order 对象添加OrderItems。

===总之,改动的本质就是:把order添加OrderItems放到service层。

/*
	 =============【购物商城:最难点】:【封装一个 完整的Order对象】
	 * */
	@Override
	public Orders findByOid(String oid) throws SQLException {//===teacher
		//===【这里要封装一个 完整的Order对象】
		//根据一个订单oid,查询一个订单的详细信息。
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from orders where oid = ?";
		Orders orders = qr.query(sql, new BeanHandler<Orders>(Orders.class),oid);
		//System.out.println(orders);
		//根据一个订单oid,查询一个商品的详细信息。
		String sql2 = "SELECT * FROM orderitem LEFT OUTER JOIN PRODUCT ON orderitem.pid = product.pid WHERE oid = ?";
		List<Map<String, Object>> list = qr.query(sql2, new MapListHandler(),oid);
		
		//===封装OrderItem。两张表数据封装。
		List<OrderItem> oList = new ArrayList<OrderItem>();
		for(Map m : list){
			OrderItem oi = new OrderItem();
			MyBeanUtils.setObject(oi, m);
			Product pro = new Product();
			MyBeanUtils.setObject(pro, m);
			//===封装OrderItem。完毕
			oi.setPro(pro);
			oList.add(oi);
		}
		//===封装Order。完毕
		orders.setOrderItems(oList);
		
		/*//测试
		System.out.println(orders);
		List<OrderItem> ois =  orders.getOrderItems();
		//List<OrderItem> ois = (List<OrderItem>) orders.getOrderItems();
		for(OrderItem oi : ois){
			System.out.println(oi);
		}*/
		return orders;
	}

findByPage():

@Override
	public List<Orders> findByPage(PageBean<Orders> pb, User user) throws SQLException {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from orders where uid = ? limit ?,?";
		Object[] params = {user.getUid(),pb.getStartIndex(),pb.getPageSize()};
		 List<Orders> list = qr.query(sql, new BeanListHandler<Orders>(Orders.class), params);
		return list;
	}

=========上面两个dao方法(最难点),OrderService,以及OrderServlet要用。

【实现:查询封装Order,再封装PageBean,页面分页显示,当前用户所有订单。】


=====Service:

@Override
	public PageBean findByPage(int pageNum, User user) throws SQLException {
		// ===service 封装PageBean一部分数据,用于dao查询参数。
		// ===查询完Order信息,返回service,在封装完整的PageBean返回servlet。===总思想。
		//(为了把业务逻辑封装在service,代码变得繁琐了。但是dao代码复用性提高。)
		//===否则直接用MapListHandler在dao层封装Order对象,代码更简单。
//		PageBean pb = new PageBean();//泛型。================PageBean加深理解。(博客记录一下,便于拿来用)
		PageBean<Orders> pb = new PageBean<Orders>();
		pb.setPageNumber(pageNum);
		pb.setPageSize(3);
//		pb.setStartIndex(startIndex);//pageNum计算来的,不需要设置
		
		OrderDao od = new OrderDaoImpl();
		int totalRecord  = od.getTotalRecord( user);
		pb.setTotalRecord(totalRecord);
		//pb.setTotalPage(totalPage);//计算出来的
		List<Orders> orderList = od.findByPage(pb,user);//===这里的OrderList Order信息不全。
		//===封装完整的Order
		List<Orders> orderList2 = new ArrayList<Orders>();
		for (Orders order : orderList) {
			//===dao BeanListHander肯定信息不全:没有OrderItem,更别提Product。但肯定有自身的oid。
			//==######=这里的思想值得借鉴:【先查出所有基本信息,再根据oid,查一个 完整的Order,最后加到OrderList。】
			//===“先整体后局部”思想。===而这一切都只是为了“业务逻辑放在service”
			String oid = order.getOid();
			Orders ord = od.findByOid(oid);
			/*====findByOid(oid)里Order信息封装不全。===只封装了orderItems
			//===【封装订单所属用户,页面显示;BeanUtils连Date都封装不了,需要注册:MyBeanUtils;
			所以这里也封装不了Order的User】		*/
			ord.setUser(user);
			orderList2.add(ord);
		}
		//pb.setResult(result);//dao返回后封装
		pb.setResult(orderList2);//dao返回后封装
//		pb.setTotalRecord(totalRecord);//不用封装,页面只需要totalPage
		// ===查询完Order信息,返回service,在封装完整的PageBean返回servlet。
		return pb;
	}

======Servlet:

public String findByPage(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//===分页查询当前用户订单,需要的参数。
		String pageNumStr = request.getParameter("pageNum");
		if (pageNumStr==null) {
			pageNumStr="1";
		}
		int pageNum = Integer.parseInt(pageNumStr);
		User user = (User) request.getSession().getAttribute("logingUser");
		//===开始查询:
		OrderService os = new OrderServiceImpl();
		try {
			PageBean pb = os.findByPage(pageNum,user);
			
			request.setAttribute("pb", pb);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return "order_list.jsp";
	}




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值