您的位置:首页 > Web前端 > JavaScript

###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";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐