业务分析
前台页面
一般用户登录商城之后,查询订单后,我们需要给用显示展示订单信息,而有时候一页不能全部展示所有订单,所以我们需要分页给用户展示订单
红色:一个订单(包含多个订单项和其他信息)
橙色:一个订单项(包含一个商品信息和其他信息)
蓝色:一个商品信息
订单层次
通常一个用户拥有多个订单,而每个订单下面有包含很多订单项(因为一个订单,用户不可能只买一件商品,),每个订单项下面对应着一个商品信息
数据库搭建
了解好上面的业务逻辑后,我们需要搭建数据,如下表
订单表->订单项表:1对多的关系(因为1个订单里可以有很多个商品)
订单项表–>商品表:1对1的关系(一个订单项只能有一个商品)
实体类搭建
后面需要创建一些实体类,java实体类中,没有像数据库那样有直接的对应的关系,但是我们可以使用封装,将商品对象封装到订单项中,再将订单项封装到订单表中;
商品类
import java.util.Date;
public class Product {
private String pid;//商品id
private String pname;//商品名
private Double shop_price;//商城价格
private String pimage;//商品图片路径
private Date pdate;//商品日期
private String pdesc;//商品描述
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Double getShop_price() {
return shop_price;
}
public void setShop_price(Double shop_price) {
this.shop_price = shop_price;
}
public String getPimage() {
return pimage;
}
public void setPimage(String pimage) {
this.pimage = pimage;
}
public Date getPdate() {
return pdate;
}
public void setPdate(Date pdate) {
this.pdate = pdate;
}
}
订单项类
public class OrderItem {
//订单项id
private String itemId;
//订单项中的产品数量
private int count;
//订单项总金额
private double subtotal;
//订单项产品信息(这里将商品封装进来了)
private Product product;
//订单项所属的订单
private Order order;
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public double getSubtotal() {
return subtotal;
}
public void setSubtotal(double subtotal) {
this.subtotal = subtotal;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
订单类
import java.util.ArrayList;
import java.util.Date;
public class Order {
//订单号
private String oid;
//订单创建日期
private Date ordertime;
//订单总金额
private double total;
//订单状态
private int state;
//收货地址
private String address;
//收货人
private String name;
//联系方式
private String telephone;
//用户id
private String uid;
//订单包含的订单项(这里讲订单项封装了进来,因为一个订单拥有多个订单项)
private ArrayList<OrderItem> list = new ArrayList<OrderItem>();
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public ArrayList<OrderItem> getList() {
return list;
}
public void setList(ArrayList<OrderItem> list) {
this.list = list;
}
}
dao层代码
@Override
/**查询出指定页面的所有订单信息
* @startIndex 起始索引页面
* @pageSize 每页展示订单数量
* @uid 用户的订单号
*/
public List<Order> findOrdersByPage(int startIndex, int pageSize, String uid) throws Exception {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from orders where uid = ? limit ?,?";
// 查询出指定用户的订单
List<Order> orders = qr.query(sql, new BeanListHandler<>(Order.class), uid, startIndex, pageSize);
// 遍历循环每个订单
for (Order order : orders) {
// 下面代码是往每个订单里存放订单项以及商品信息
String sql1 = "select * from product pro,orderitem oi where pro.pid=oi.pid and oi.oid=?";
List<Map<String, Object>> list = qr.query(sql1, new MapListHandler(), order.getOid());
//遍历循环查询出来的map信息,对商品、订单项、订单进行封装
for (Map<String, Object> map : list) {
Product product = new Product();
// 将查询的数据封装到product中
BeanUtils.populate(product, map);
OrderItem oi = new OrderItem();
// 将查询的数据封装到orderitem中
BeanUtils.populate(oi, map);
// 将封装好的product再封装到orderitem中
oi.setProduct(product);
// 将orderitem封装到order中
order.getList().add(oi);
}
}
//循环结束后,订单集合中已经有了所有的订单项及商品信息
//最后返回到service,再返回到前台,前台可以直接展示给用户操作了
return orders;
}