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','zs@163.com');

实体类

/**
 * 会员
 */
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值