JavaWeb dao層 使用者訂單 分頁查詢(三層封裝)
阿新 • • 發佈:2019-01-04
業務分析
前臺頁面
一般使用者登入商城之後,查詢訂單後,我們需要給用顯示展示訂單資訊,而有時候一頁不能全部展示所有訂單,所以我們需要分頁給使用者展示訂單
紅色:一個訂單(包含多個訂單項和其他資訊)
橙色:一個訂單項(包含一個商品資訊和其他資訊)
藍色:一個商品資訊
訂單層次
通常一個使用者擁有多個訂單,而每個訂單下面有包含很多訂單項(因為一個訂單,使用者不可能只買一件商品,),每個訂單項下面對應著一個商品資訊
資料庫搭建
瞭解好上面的業務邏輯後,我們需要搭建資料,如下表
訂單表->訂單項表: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;
}