ssm02 订单操作

一、表结构分析

1、订单表信息

订单表信息描述 orders
在这里插入图片描述
productId描述了订单与产品之间的关系。
memberid描述了订单与会员之间的关系。
SQL语句

CREATE TABLE ssmorders(
id VARCHAR(32) PRIMARY KEY,
orderNum VARCHAR(20) NOT NULL UNIQUE,
orderTime DATE,
peopleCount INT,
orderDesc VARCHAR(500),
payType INT,
orderStatus INT,
productId VARCHAR(32),
memberId VARCHAR(32),
FOREIGN KEY (productId) REFERENCES product(id),
FOREIGN KEY (memberId) REFERENCES ssmmember(id)
);

DELIMITER $$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `orcl`.`id_ssmorders_trigger` BEFORE INSERT
    ON `orcl`.`ssmorders`
    FOR EACH ROW BEGIN
	SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
    END$$
DELIMITER ;

实体类

/**
 * 订单
 */
public class Orders {

    private String id;
    private String orderNum;
    private Date orderTime;
    private String orderTimeStr;
    private int orderStatus;
    private String orderStatusStr;
    private int peopleCount;
    private Integer payType;
    private String payTypeStr;
    private String orderDesc;

    private Product product;
    //旅客和订单通过第三张表来关联
    private List<Traveller> travellers;
    private Member member;
//省略getter/setter
}

2、会员表信息

会员表信息描述member
订单与会员之间是多对一关系,我们在订单表中创建一个外键来进行关联。
在这里插入图片描述
SQL语句

CREATE TABLE ssmmember(
	id VARCHAR(32) PRIMARY KEY,
	membername VARCHAR(20),
	nickname VARCHAR(20),
	phoneNum VARCHAR(20),
	email VARCHAR(20)
);


DELIMITER $$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `orcl`.`id_ssmmember_trigger` BEFORE INSERT
    ON `orcl`.`ssmmember`
    FOR EACH ROW BEGIN
	SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
    END$$
DELIMITER ;

INSERT INTO ssmmember(id,NAME,nickname,phonenum,email) 
VALUES('E61D65F673D54F68B0861025C69773DB','张三','小三','18888888888','[email protected]');

实体类

/**
 * 会员
 */
public class Member {
    private String id;
    private String name;
    private String nickname;
    private String phoneNum;
    private String email;
//省略getter/setter
}

3、旅客表信息

旅客表信息描述 traveller
在这里插入图片描述

CREATE TABLE ssmtraveller(
	id VARCHAR(32) PRIMARY KEY,
	NAME VARCHAR(20),
	sex VARCHAR(20),
	phoneNum VARCHAR(20),
	credentialsType INT,
	credentialsNum VARCHAR(50),
	travellerType INT
);

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `orcl`.`id_ssmTRAVELLER _trigger` BEFORE INSERT
    ON `orcl`.`ssmTRAVELLER `
    FOR EACH ROW BEGIN
	SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
    END$$

DELIMITER ;

INSERT INTO ssmTRAVELLER (NAME, sex, phonenum, credentialstype, credentialsnum, travellertype)
VALUES ('小颖', '女', '13282343373', 0,'12389009876543', 0);
INSERT INTO ssmTRAVELLER (id, NAME, sex, phonenum, credentialstype, credentialsnum, travellertype)
VALUES ('EE7A71FB6945483FBF91543DBE851960', '张小龙', '男', '15555555555', 0,
'987654321123456789', 1);
/**
 * 旅客
 */
public class Traveller {
    private String id;
    private String name;
    private String sex;
    private String phoneNum;
    private Integer credentialsType;
    private String credentialsTypeStr;
    private String credentialsNum;
    private Integer travellerType;
    private String travellerTypeStr;
//省略getter/setter

4、order_traveller

旅客与订单之间是多对多关系,所以我们需要一张中间表(order_traveller)来描述。
在这里插入图片描述

CREATE TABLE order_traveller(
orderId VARCHAR(32),
travellerId VARCHAR(32),
PRIMARY KEY (orderId,travellerId),
FOREIGN KEY (orderId) REFERENCES ssmorders(id),
FOREIGN KEY (travellerId) REFERENCES ssmtraveller(id)
);
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73e27eedd0811eab7b2005056c00001', 'eaf2fac6dd0911eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73e27eedd0811eab7b2005056c00001', '9a252c18dd0711eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73e27eedd0811eab7b2005056c00001', 'fb6bc264dd0911eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73e27eedd0811eab7b2005056c00001', '9a27d425dd0711eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73c84b1dd0811eab7b2005056c00001', 'fb6bc264dd0911eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73c84b1dd0811eab7b2005056c00001', '9a27d425dd0711eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f73c84b1dd0811eab7b2005056c00001', '9a252c18dd0711eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f1570552dd0811eab7b2005056c00001', 'eaf2fac6dd0911eab7b2005056c00001');
INSERT INTO ORDER_TRAVELLER (orderid, travellerid)
VALUES ('f1570552dd0811eab7b2005056c00001', '9a252c18dd0711eab7b2005056c00001');

5、订单表及其关联表关系

在这里插入图片描述

二、订单查询

在这里插入图片描述

1、 订单查询页面 order-list.jsp

在这里插入图片描述
详细代码请查看今天课程资料

2、Controller

@Controller
@RequestMapping("/orders")
public class OrderControlller {
    @Autowired
    private IOrderService orderService;

    //查询所有订单未分页
    @RequestMapping("/findAll.do")
    public ModelAndView findAll() throws Exception {
        List<Orders> orderslist = orderService.findAll();
        ModelAndView mv = new ModelAndView();
        mv.setViewName("orders-list");
        mv.addObject("ordersList",orderslist);
        return mv;
    }

3、Service

@Service
public class OrdersServiceImpl implements IOrderService {

    @Autowired
    private IOrdersDao ordersDao;
    @Override
    public List<Orders> findAll() throws Exception {
        return ordersDao.findAll();
    }
}

4、实体类

order

/**
 * 订单
 */
public class Orders {

    private String id;
    private String orderNum;
    private Date orderTime;
    private String orderTimeStr;
    private int orderStatus;
    private String orderStatusStr;
    private int peopleCount;
    private Integer payType;
    private String payTypeStr;
    private String orderDesc;

    private Product product;
    private List<Traveller> travellers;
    private Member member;
//省略getter/setter

  public String getOrderStatusStr() {
        //订单状态(0未支付 1支付)
        if (orderStatus==0){
            orderStatusStr = "未支付";
        }
        else if (orderStatus==1){
            orderStatusStr = "已支付";
        }
        return orderStatusStr;
    }
    
  public String getOrderTimeStr() {
        if(orderTime!=null){
            orderTimeStr = DateUtils.data2String(orderTime,"yyyy-MM-dd");
        }
        return orderTimeStr;
    }
    
  public String getPayTypeStr() {
        //0支付宝 1微信  2其他
        if (payType==0)
            payTypeStr = "支付宝";
        if (payType==1)
            payTypeStr = "微信";
        if (payType==2)
            payTypeStr = "其他";

        return payTypeStr;
    }
}

5、Dao

@Repository
public interface IOrdersDao {

    @Select("select * from ssmorders")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "orderNum",column = "orderNum"),
            @Result(property = "orderTime",column = "orderTime"),
            @Result(property = "orderStatus",column = "orderStatus"),
            @Result(property = "peopleCount",column = "peopleCount"),
            @Result(property = "peopleCount",column = "peopleCount"),
            @Result(property = "payType",column = "payType"),
            @Result(property = "orderDesc",column = "orderDesc"),

            @Result(property = "product",column = "productId",javaType = Product.class
            ,one = @One(select = "com.itheima.ssm.dao.IProductDao.findById"))

    })
    List<Orders> findAll() throws Exception;
}

IProductDao的findById

    @Select("select * from product where id = #{id}")
    Product findById(String id) throws Exception;

三、订单分页查询

在这里插入图片描述

(1)使用 Maven

在 pom.xml 中添加如下依赖:

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>最新版本</version>
</dependency>

(2)在 Spring 配置文件中配置拦截器插件

使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
在这里插入图片描述

<!-- 传入PageHelper的插件开始 -->
<property name="plugins">
    <array>
        <!-- 传入插件的对象 -->
        <bean class="com.github.pagehelper.PageInterceptor">
            <property name="properties">
                <props>
                    <prop key="helperDialect">mysql</prop>
                    <prop key="reasonable">true</prop>
                </props>
            </property>
        </bean>
    </array>
</property>
<!-- 传入PageHelper的插件结束 -->

(3)Service层配置

在真正执行SQL前使用PagHelper来完成分页

@Service
public class OrdersServiceImpl implements IOrderService {

    @Autowired
    private IOrdersDao ordersDao;
    @Override
    public List<Orders> findAll(int page,int size) throws Exception {
        //参数pageNum是页码值,参数pageSize代表是每页显示的条数
        /**
         * 开始分页
         * @param pageNum  页码
         * @param pageSize 每页显示数量
         */
        PageHelper.startPage(page,size);
        return ordersDao.findAll();
    }
}

(4)编写aside.jsp

aside.jsp

<li id="system-setting"><a
	href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=4"> <i
		class="fa fa-circle-o"></i> 订单管理
</a></li>

(5)orderController

@Controller
@RequestMapping("/orders")
public class OrderControlller {
    @Autowired
    private IOrderService orderService;

//    //查询所有订单未分页
//    @RequestMapping("/findAll.do")
//    public ModelAndView findAll() throws Exception {
//        List<Orders> orderslist = orderService.findAll();
//        ModelAndView mv = new ModelAndView();
//        mv.setViewName("orders-list");
//        mv.addObject("ordersList",orderslist);
//        return mv;
//    }


    //查询所有订单未分页
    @RequestMapping("/findAll.do")
    public ModelAndView findAll(
      @RequestParam(name="page",required = true,defaultValue = "1") int page,
      @RequestParam(name="size",required = true,defaultValue = "4") int size) throws Exception {
        //查询订单
        List<Orders> orderslist = orderService.findAll(page,size);
        //pageinfo就是一个分页bean
        PageInfo pageInfo = new PageInfo(orderslist);

        ModelAndView mv = new ModelAndView();
        mv.setViewName("orders-page-list");
        mv.addObject("pageInfo",pageInfo);
        return mv;
    }
}

(6)orders-page-list.jsp

<c:forEach items="${pageInfo.list}" var="orders">

	<tr>
		<td><input name="ids" type="checkbox"></td>
		<td>${orders.id }</td>
		<td>${orders.orderNum }</td>
		<td>${orders.product.productName }</td>
		<td>${orders.product.productPrice }</td>
		<td>${orders.orderTimeStr }</td>
		<td class="text-center">${orders.orderStatusStr }</td>
		<td class="text-center">
			<button type="button" class="btn bg-olive btn-xs">订单</button>
			<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
			<button type="button" class="btn bg-olive btn-xs">编辑</button>
		</td>
	</tr>
</c:forEach>


function changePageSize() {
	//获取下拉框的值
	var pageSize = $("#changePageSize").val();

	//向服务器发送请求,改变没页显示条数
	location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&size="+pageSize;
}


<div class="form-group form-inline">
  总共 ${pageInfo.pages} 页,共 ${pageInfo.total} 条数据。 每页
  <select class="form-control" id="changePageSize" onchange="changePageSize()" >
	  <option></option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
  </select></div>

 <ul class="pagination">
	<li>
		<a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" 
		aria-label="Previous">首页</a>
	</li>
	
	<li>
		<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a>
	</li>
	
	<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
		<li>
			<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a>
		</li>
	</c:forEach>
	
	<li>
		<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a>
	</li>
	
	<li>
		<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
	</li>
</ul>

(7)图解

在这里插入图片描述

四、订单详情

在这里插入图片描述

1、在order-list.jsp页面上对"详情"添加链接

<button type="button" class="btn bg-olive btn-xs"
onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">
详情</button>

2、订单详情 order-show.jsp

在这里插入图片描述

3、Controller

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

4、Dao

IOrdersDao

@Select("select * from ssmorders where id=#{id}")
@Results({
        @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",one = @One(select =
                "com.itheima.ssm.dao.IProductDao.findById")),
        @Result(column = "id",property = "travellers",many = @Many(select =
                "com.itheima.ssm.dao.ITravellerDao.findByOrdersId")),
        @Result(column = "memberId",property = "member",one = @One(select =
                "com.itheima.ssm.dao.IMemberDao.findById")),
})
Orders findById(String id) throws Exception;

product

@Select("select * from product where id = #{id}")
Product findById(String id) throws Exception;

member

public interface IMemberDao {
    @Select("select * from ssmmember where id=#{id}")
    Member findById(String id) throws Exception;
}

Traveller

public interface ITravellerDao {
    @Select("select * from ssmtraveller where id in (select travellerId from order_traveller where orderId=#{ordersId})")
    List<Traveller> findByOrdersId(String ordersId) throws Exception;
}

猜你喜欢

转载自blog.csdn.net/qq_42390340/article/details/108039901