1. 程式人生 > >JavaWeb dao層 使用者訂單 分頁查詢(三層封裝)

JavaWeb dao層 使用者訂單 分頁查詢(三層封裝)

業務分析

前臺頁面

一般使用者登入商城之後,查詢訂單後,我們需要給用顯示展示訂單資訊,而有時候一頁不能全部展示所有訂單,所以我們需要分頁給使用者展示訂單
紅色:一個訂單(包含多個訂單項和其他資訊)
橙色:一個訂單項(包含一個商品資訊和其他資訊)
藍色:一個商品資訊
這裡寫圖片描述

訂單層次

通常一個使用者擁有多個訂單,而每個訂單下面有包含很多訂單項(因為一個訂單,使用者不可能只買一件商品,),每個訂單項下面對應著一個商品資訊
這裡寫圖片描述

資料庫搭建

瞭解好上面的業務邏輯後,我們需要搭建資料,如下表
訂單表->訂單項表: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;
    }