SSM整合案例企業權限管理系統(2):訂單操作

一、表結構分析

1.訂單表:orders

1.1建表語句

CREATE TABLE orders(
id INT AUTO_INCREMENT PRIMARY KEY,
orderNum VARCHAR(20) NOT NULL UNIQUE,
orderTime TIMESTAMP,
peopleCount INT,
orderDesc VARCHAR(500),
payType INT,
orderStatus INT,
productId INT,
memberId INT,
FOREIGN KEY (productId) REFERENCES product(id),
FOREIGN KEY (memberId) REFERENCES member(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4

1.2測試數據

INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('54311', 20180302120000, 2, '沒什麼', 0, 1, 2,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('54331', 20180302120000, 2, '沒什麼', 0, 1, 2,2);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('54351', 20180302120000, 2, '沒什麼', 0, 1, 1,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('14321', 20180302120000, 2, '沒什麼', 0, 1, 1,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('34321', 20180302120000, 2, '沒什麼', 0, 1, 1,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('84321', 20180302120000, 2, '沒什麼', 0, 1, 2,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('13321', 20180302120000, 2, '沒什麼', 0, 1, 2,1);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('42321', 20180302120000, 2, '沒什麼', 0, 1, 1,2);
INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus,
productid, memberid) VALUES ('56321', 20180302120000, 2, '沒什麼', 0, 1, 2,2);

1.3字段含義

在這裏插入圖片描述

2.會員信息表:member

2.1建表語句

CREATE TABLE member(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(32),
nickname VARCHAR(32),
phoneNum VARCHAR(32),
email VARCHAR(32)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4

2.2測試數據

INSERT INTO MEMBER (id, NAME, nickname, phonenum, email)
VALUES (1, '張三', '小三', '18888888888', '[email protected]');

2.3字段含義

在這裏插入圖片描述

3.旅客信息表:traveller

3.1建表語句

CREATE TABLE traveller(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(32),
sex VARCHAR(32),
phoneNum VARCHAR(32),
credentialsType INT,
credentialsNum VARCHAR(50),
travellerType INT
)

3.2測試數據

INSERT INTO TRAVELLER (id, NAME, sex, phonenum, credentialstype, credentialsnum, travellertype)
VALUES (1, '張龍', '男', '13333333333', 0,
'123456789009876543', 0);
INSERT INTO TRAVELLER (id, NAME, sex, phonenum, credentialstype, credentialsnum, travellertype)
VALUES (2, '張小龍', '男', '15555555555', 0,
'987654321123456789', 1);

3.3字段含義

在這裏插入圖片描述

4.中間表:order_traveller

一張訂單下:可以有多個旅客
一個旅客:可以屬於多個訂單

4.1建表語句

CREATE TABLE order_traveller(
orderId INT,
travellerId INT,
FOREIGN KEY (orderId) REFERENCES orders(id),
FOREIGN KEY (travellerId) REFERENCES traveller(id)
)

4.2測試數據

INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (1, 1);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (1, 2);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (2, 1);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (2, 2);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (2, 3);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (2, 4);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (2, 5);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (3, 1);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (3, 2);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (3, 3);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (4, 4);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES (4, 5);

5.表關係可視化

在這裏插入圖片描述

6.實體類創建

6.1Member

public class Member {

    private String id;
    private String name;
    private String nickname;
    private String phoneNum;
    private String email;
    //省略getter/setter
}

6.2Traveller

  private String id;
    private String name;
    private String sex;
    private String phoneNum;
    private Integer credentialsType;
    //注意根據 credentialsType進行賦值
    private String credentialsTypeStr;
    private String credentialsNum;
    private Integer travellerType;
    //注意根據 travellerType進行賦值
    private String travellerTypeStr;
}

6.3Orders

public class Orders {
    private String id;
    private String orderNum;
    private Date orderTime;
    //date -> str用於頁面顯示
    private String orderTimeStr;
    private int orderStatus;
    //str用於頁面顯示
    private String orderStatusStr;
    private int peopleCount;
    private Product product;
    private List<Traveller> travellers;
    private Member member;
    private Integer payType;
    //str用於頁面顯示
    private String payTypeStr;
    private String orderDesc;
}

二、訂單查詢

1.需求

在這裏插入圖片描述

2.過程分析

在這裏插入圖片描述

3.OrdersController

@Controller
@RequestMapping("/orders")
public class OrdersController {
    @Autowired
    IOrdersService ordersService;
    @RequestMapping("/findAll.do")
    public ModelAndView findAll() throws Exception{
        ModelAndView mv = new ModelAndView();
        List<Orders> orders = ordersService.findAll();
        mv.addObject("ordersList",orders);
        mv.setViewName("orders-list");
        return mv;
    }
}

4.服務層

4.1IOrdersService

public interface IOrdersService {


    public List<Orders> findAll();

}

4.2OrdersServiceImpl

@Service
@Transactional
public class OrdersServiceImpl implements IOrdersService {

    @Autowired
    IOrdersDao ordersDao;


    @Override
    public List<Orders> findAll() {
        return ordersDao.findAll();
    }
}

5.IOrdersDao(關鍵)

public interface IOrdersDao {

    //這裏查詢訂單信息的時候,要把其中關聯的產品信息查詢出來
    //這裏就涉及到多表查詢
    //也是這個小功能當中的一個小難點
    //下面就是利用註解來實現 一個 一對一的多表操作
    //在orders的屬性中有一個 product
    //而在 orders表中有一個productId字段,就是要通過這個字段,去product表中根據productId查詢出對應的產品
    //這是典型的在Mybatis用註解來實現一對一的查詢

    @Select("select * from orders")
    @Results(id = "ordersMap",value = {
            //id=true表示爲主鍵 column 表示字段名 property 表示Orders類中的屬性名
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "orderNum",property = "orderNum"),
            @Result(column = "orderTime",property = "orderTime"),
            @Result(column = "orderStatus",property = "orderStatus"),
            @Result(column = "peopleCount",property = "peopleCount"),
            @Result(column = "payType",property = "payType"),
            @Result(column = "orderDesc",property = "orderDesc"),
            @Result(column = "productId", property = "product",
                //根據 productId 在 product表中查詢,然後把結果封裝到Orders類中的product屬性中
                    //所以這裏就需要IProductDao提供這個findById方法
                    one = @One(select = "com.xpt.dao.IProductDao.findById")
            )
    })
    List<Orders> findAll();
}

6.效果演示

在這裏插入圖片描述

7.難點分析

  • 首先這個功能點的本質就是一個數據庫查詢
  • 流程就是:
    • 前端頁面點擊:訂單管理,向後臺發出了/orders/findAll.do請求
    • OrdersController中的findAll()方法響應請求
    • 調用業務層的findAll()方法
    • 業務層調用持久層的findAll()方法
    • 最終的查詢操作就是業務層的一個多表查詢操作
  • 難點在於:
    • 我們想要把orders表中的數據封裝到Orders類中
    • 但是Orders類中含有實體類Product屬性
    • 這個時候就需要在對orders表查詢的時候,利用表中productId字段的值去product表中完成查詢,然後再封裝到Orders類中的實體類Product屬性
  • 綜上的操作本質上就是:如何利用Mybatis中的註解方式完成一個一對一的多表操作,並完成數據封裝

三、訂單頁面分頁

如果我們需要顯示的訂單數量特別多的化,就一定是需要分頁功能的

1.PageHelper

PageHelper是國內非常優秀的一款開源的mybatis分頁插件,它支持基本主流與常用的數據庫,例如mysql、
oracle、mariaDB、DB2、SQLite、Hsqldb等。

  • 這裏我們重點不在對PageHelper的學習上,而是以可以使用實現基本的分頁爲目的

2.使用步驟

在這裏插入圖片描述

3.分頁效果

在這裏插入圖片描述

4注意點:注意Controller中的參數綁定

 @RequestMapping("/findAll.do")
    //這裏的@RequestParam就是把前端的參數傳入 這裏函數的參數,然後函數的參數就可以是任意名字
    // true表示這個參數必須綁定
    public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page,
                                @RequestParam(name = "size", required = true, defaultValue = "4") int size)
            throws Exception{
        ModelAndView mv = new ModelAndView();
        List<Orders> orders = ordersService.findAll(page,size);
        //pageInfo 就是一個分頁bean
        PageInfo pageInfo = new PageInfo(orders);
        mv.addObject("pageInfo",pageInfo);
        mv.setViewName("orders-page-list");
        return mv;
    }

在這裏插入圖片描述

四、訂單詳情

1.需求

在這裏插入圖片描述

  • 在全部訂單頁面,點擊某個訂單的詳情會跳轉到該訂單的詳情頁面
  • 包括訂單本身的信息
  • 訂單中旅客信息
  • 訂單中的會員信息

2.過程分析

在這裏插入圖片描述

3OrdersController.findById

 @RequestMapping("/findById.do")
    public ModelAndView findById(@RequestParam(name = "id",required = true) String orderId) throws Exception{
        ModelAndView mv = new ModelAndView();
        Orders orders = ordersService.findById(orderId);
        mv.addObject("orders",orders);
        mv.setViewName("orders-show");
        return mv;
    }

4OrdersServiceImpl.findById

 @Override
    public Orders findById(String orderId) {
        //把String的id 轉爲int
        int int_id = Integer.parseInt(orderId);
        return ordersDao.findById(int_id);

    }

5dao層

5.1 IOrdersDao.findById

//根據id查詢訂單->結果封裝到訂單對象中,但是需要注意的是,Orders類中包含了Member對象和Traveller對象
    //查詢的時候,這兩個類也需要進行封裝 這裏的難點和上面查詢所有的訂單時 需要把產品的信息封裝進來完全一樣
    //但是這裏要注意 orders和 traveller是一對多的關係 這裏需要通過orders的id查詢出對應的traveller的id
    //然後保存到一個List中

    @Select("select * from orders where id = #{orderId}")
    @Results(value = {
            //id=true表示爲主鍵 column 表示字段名 property 表示Orders類中的屬性名
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "orderNum",property = "orderNum"),
            @Result(column = "orderTime",property = "orderTime"),
            @Result(column = "orderStatus",property = "orderStatus"),
            @Result(column = "peopleCount",property = "peopleCount"),
            @Result(column = "payType",property = "payType"),
            @Result(column = "orderDesc",property = "orderDesc"),
            @Result(column = "productId", property = "product",
                    //根據 productId 在 product表中查詢,然後把結果封裝到Orders類中的product屬性中
                    //所以這裏就需要IProductDao提供這個findById方法
                    javaType = Product.class,
                    one = @One(select = "com.xpt.dao.IProductDao.findById")),
            @Result(column = "memberID", property = "member",
                      javaType = Member.class,
                      one = @One(select = "com.xpt.dao.IMemberDao.findById")),
            @Result(column = "id", property = "travellers",
            //一個order下面有多個旅客
                    javaType = java.util.List.class,
                    many = @Many(select = "com.xpt.dao.ITravellerDao.findByOrdersId" ))
    })
    Orders findById(int orderId);

5.2IMemberDao.findById

  @Select("select * from member where id = #{id}")
    Member findById(int id);

5.3ITravellerDao.findByOrdersId

 //注意這裏先要根據orderId 去中間表中做查詢 查詢到travellerID
    //然後再在traveller表中查詢
    @Select("select * from traveller where id in(select travellerId from order_traveller where orderId=#{orderId})")
    List<Traveller> findByOrdersId(int orderId);

6.難點分析

  • 難點依然在於dao層的實現
  • 根據訂單的id查詢訂單詳情的時候需要把product和member以及traveller的信息封裝到orders對象彙總
  • product和member的封裝很容易
  • 注意traveller的封裝需要通過一箇中間表的查詢來實現
    • 先通過訂單id在中間表中獲取到旅客id
    • 然後再在traveller中查詢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章