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;
    }

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/80699480