###Jsp+Servlet购物商城day04.2:订单模块难点总结。【购物商城最大的难点:【封装一个Order对象】查询封装三张表】
2017-09-14 10:30
1156 查看
/* ①首先是保存订单: 涉及到 插入多表数据,这里是插入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"; }
相关文章推荐
- ###Jsp+Servlet购物商城day04.1:显示订单。【重中之重:查询3张表信息,封装到Order】
- ###Jsp+Servlet购物商城day04.3:订单模块Order实体设计失误。【Bean属性设计两大原则】-MyBeanUtils使用注意事项。
- ###Jsp+Servlet购物商城day04.5:支付:订单支付遇到的问题总结。
- ###Jsp+Servlet购物商城day04.4:订单模块 【页面双层遍历】 显示本页所有订单。bootstrap分页下标。
- html修改为jsp、错误消息显示、错误消息回显、多个请求对应一个servlet、获取请求参数封装成对象
- ###Jsp+Servlet购物商城day03.3:生成订单。【重中之重:保存多表信息】:使用事物,dao两个方法分别插入主表和从表信息。
- ###Jsp+Servlet购物商城day03.2:生成订单。重点笔记
- ###Jsp+Servlet购物商城day02.2:首页显示 最新和热门商品
- 解决Servlet中BeanUtils对象通过populate方法封装JSP提交的String数据与JavaBean数据类型不一致
- Java web MVC(jsp,servlet,dao)+Bootstrap购物网站开发经验总结 (持续更新)
- JSP+Servlet+oracle 的一个分页查询小应用
- day42-43 (8.30~31)两天购物商城的【商品模块收获总结】
- 自动封装Servlet HttpServletRequest请求成为一个POJO对象
- 简单的JSP购物程序(综合运用JavaBean、JDBC、JSP隐含对象,开发一个小型网上购物系统)
- 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)
- ###Jsp+Servlet购物商城day03.1:商品添加到购物车。重点笔记
- 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注册模块(附完整源码)
- ###Jsp+Servlet购物商城day02.3:分页显示商品
- 总结servlet和jsp的对象及问题
- mybatise查询返回的一个集合封装多个对象的实现