SSM 项目:企业权限管理系统(二)

本文是SSM项目实战的一部分,详细介绍了订单管理模块,包括订单表结构分析,订单查询、分页查询及订单详情展示。讨论了订单与会员、产品、旅客的关联关系,并给出了Controller和Dao层的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此博客用于个人学习,来源于ssm框架的书籍,对知识点进行一个整理。

第二章 SSM 订单操作:

1. 表结构分析:


1.1 订单表信息描述 orders:

序号字段名称字段类型字段描述
1idvarchar2(32)无意义、主键uuid
2orderNumvarchar2(50)订单编号 不为空 唯一
3orderTimetimestamp下单时间
4peopleCountint出行人数
5orderDescvarchar2(500)订单描述(其它信息)
6payTypeint支付方式(0 支付宝 1 微信 2其它)
7orderStatusint订单状态(0 未支付 1 已支付)
8productIdint产品 id 外键
9memberidint会员(联系人)id 外键

productId 描述了订单与产品之间的关系,memberid 描述了订单与会员之间的关系。

创建表 sql:

CREATE TABLE orders( 
	id varchar2(32) default SYS_GUID() PRIMARY KEY, 
	orderNum VARCHAR2(20) NOT NULL UNIQUE, 
	orderTime timestamp, peopleCount INT, 
	orderDesc VARCHAR2(500), payType INT, 
	orderStatus INT, productId varchar2(32), 
	memberId varchar2(32), 
	FOREIGN KEY (productId) REFERENCES product(id), 
	FOREIGN KEY (memberId) REFERENCES member(id) 
)

insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('0E7231DC797C486290E8713CA3C6ECCC', '12345', to_timestamp('02-03-2018 12:00:00.000000','dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('5DC6A48DD4E94592AE904930EA866AFA', '54321', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('2FF351C4AC744E2092DCF08CFD314420', '67890', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('A0657832D93E4B10AE88A2D4B70B1A28', '98765', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('E4DD4C45EED84870ABA83574A801083E', '11111', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('96CC8BD43C734CC2ACBFF09501B4DD5D', '22222', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('55F9AF582D5A4DB28FB4EC3199385762', '33333', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('CA005CF1BE3C4EF68F88ABC7DF30E976', '44444', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); 
insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
values ('3081770BC3984EF092D9E99760FDABDE', '55555', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB');

实体类 Orders:

private String id;
    private String orderNum;
    private Date orderTime;
    private String orderTimeStr;
    private int orderStatus;
    private String orderStatusStr;
    private int peopleCount;
    private Product product;
    private List<Traveller> travellers;
    private Member member;
    private Integer payType;
    private String payTypeStr;
    private String orderDesc;

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

1.2 会员表信息描述 member:

订单与会员之间是多对一关系,我们在订单表中创建一个外键来进行关联。

序号字段名称字段类型字段描述
1idvarchar2(32)无意义、主键uuid
2namevarchar2(20)姓名
3nickNamevarchar2(20)昵称
4phoneNumvarchar2(20)电话号码
5emailvarchar2(50)邮箱

创建表 sql:

CREATE TABLE member( 
	id varchar2(32) default SYS_GUID() PRIMARY KEY, 
	name VARCHAR2(20), 
	nickname VARCHAR2(20), 
	phoneNum VARCHAR2(20), 
	email VARCHAR2(20) 
)

insert into MEMBER (id, name, nickname, phonenum, email) 
values ('E61D65F673D54F68B0861025C69773DB', '张三', '小三', '18888888888', 'zs@163.com');

实体类 Member:

//会员
public class Member {
    private String id;
    private String name;
    private String nickname;
    private String phoneNum;
    private String email;
	//其他get/set方法
}

1.3 旅客表信息描述 traveller:

序号字段名称字段类型字段描述
1idvarchar2(32)无意义、主键uuid
2namevarchar2(20)订单编号 不为空 唯一
3sexvarchar2(20)性别
4phoneNumvarchar2(20)电话号码
5credentialsTypeint证件类型 0身份证 1护照 2军官证
6credentialsNumvarchar2(50)证件号码
7travellerTypeint旅客类型(人群) 0 成人 1 儿童

创建表 sql:

CREATE TABLE traveller( 
	id varchar2(32) default SYS_GUID() PRIMARY KEY, 
	NAME VARCHAR2(20), sex VARCHAR2(20), 
	phoneNum VARCHAR2(20), 
	credentialsType INT, 
	credentialsNum VARCHAR2(50), 
	travellerType INT 
)

insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) 
values ('3FE27DF2A4E44A6DBC5D0FE4651D3D3E', '张龙', '男', '13333333333', 0, '123456789009876543', 0); 
insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) 
values ('EE7A71FB6945483FBF91543DBE851960', '张小龙', '男', '15555555555', 0, '987654321123456789', 1);

实体类 Traveller:

//旅客
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;
    //其他get/set方法
}

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

序号字段名称字段类型字段描述
1orderIdvarchar2(32)订单id
2travellerIdvarchar2(32)旅客id

创建表 sql。

CREATE TABLE order_traveller( 
	orderId varchar2(32), 
	travellerId varchar2(32), 
	PRIMARY KEY (orderId,travellerId), 
	FOREIGN KEY (orderId) REFERENCES orders(id), 
	FOREIGN KEY (travellerId) REFERENCES traveller(id) 
)

insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('0E7231DC797C486290E8713CA3C6ECCC', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('2FF351C4AC744E2092DCF08CFD314420', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('3081770BC3984EF092D9E99760FDABDE', 'EE7A71FB6945483FBF91543DBE851960'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('55F9AF582D5A4DB28FB4EC3199385762', 'EE7A71FB6945483FBF91543DBE851960'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('5DC6A48DD4E94592AE904930EA866AFA', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('96CC8BD43C734CC2ACBFF09501B4DD5D', 'EE7A71FB6945483FBF91543DBE851960'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('A0657832D93E4B10AE88A2D4B70B1A28', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); 
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('CA005CF1BE3C4EF68F88ABC7DF30E976', 'EE7A71FB6945483FBF91543DBE851960');
insert into ORDER_TRAVELLER (orderid, travellerid) 
values ('E4DD4C45EED84870ABA83574A801083E', 'EE7A71FB6945483FBF91543DBE851960');

2. 订单查询:

创建订单查询页面 order-list.jsp。

2.1 Controller:

定义 OrdersController 类,注入 IOrdersService,并添加 findAll 方法。

@Controller 
@RequestMapping("/orders") 
public class OrdersController { 

	@Autowired 
	private IOrdersService ordersService; 
	
	//未分页 
	@RequestMapping("/findAll.do") 
	public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") Integer page, @RequestParam(name = "pageSize", required = true, defaultValue = "10") Integer pageSize) throws Exception {
		List<Orders> ordersList = ordersService.findAllByPage(page, pageSize); 
		ModelAndView mv = new ModelAndView(); 
		mv.setViewName("order-list"); 
		mv.addObject("ordersList", ordersList); 
		return mv; 
	} 
}

2.2 Dao:

定义 IOrderDao 接口,在其中添加 findAll 方法,但我们查询出订单详情,同样的也需要产品的信息,这个时候需要在 IProductDao 类中添加 findById 方法,用于获取产品对象。

public interface IOrdersDao {

    @Select("select * from orders")
    @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")),
    })
    public List<Orders> findAll() throws Exception;
}

public interface IProductDao {

    //根据id查询产品
    @Select("select * from product where id=#{id}")
    public Product findById(String id) throws Exception;

    //查询所有的产品信息
    @Select("select * from product")
    public List<Product> findAll() throws Exception;

    @Insert("insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
    void save(Product product);
}

3. 订单分页查询:

创建订单分页查询页面 Order-list.jsp。

3.1 在 pom.xml 中添加依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

3.2 配置:

在 applicationContext.xml 中配置拦截器插件,置于 SqlSessionFactory 的 bean 标签中。

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

在 OrdersServiceImpl 中,在方法调用 dao 层的方法前一句使用静态方法进行分页。

@Service
@Transactional
public class OrdersServiceImpl implements IOrdersService {

    @Autowired
    private IOrdersDao ordersDao;

    @Override
    public List<Orders> findAll(int page, int size) throws Exception {

        //参数pageNum 是页码值   参数pageSize 代表是每页显示条数
        PageHelper.startPage(page, size);
        return ordersDao.findAll();
    }
}

3.3 Controller:

在 OrdersController 中完善 findAll 方法,使得可以实现分页效果。

@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 {
    ModelAndView mv = new ModelAndView();
    List<Orders> ordersList = ordersService.findAll(page, size);
    //PageInfo就是一个分页Bean
    PageInfo pageInfo=new PageInfo(ordersList);
    mv.addObject("pageInfo",pageInfo);
    mv.setViewName("orders-page-list");
    return mv;
}

4. 订单详情:

在 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>

创建订单详情页面 order-show.jsp。

4.1 Controller:

在 OrdersController 类中,添加方法 findById。

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

4.2 Dao:

在 IOrderDao 接口中,添加方法 findById:

@Select("select * from orders where id=#{ordersId}")
@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")),
        @Result(property = "member",column = "memberId",javaType = Member.class,one = @One(select = "com.itheima.ssm.dao.IMemberDao.findById")),
        @Result(property = "travellers",column = "id",javaType =java.util.List.class,many = @Many(select = "com.itheima.ssm.dao.ITravellerDao.findByOrdersId"))
})
public Orders findById(String ordersId) throws Exception;

由于要一并查出产品信息(一对一),旅客信息(多对多),会员信息(多对一),使用 @Result 注解,同样的,创建 IMemberDao 接口和 ITtavellerDao 接口,分别添加 findById 和 findByOrdersId 方法。

public interface IMemberDao {

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

public interface ITravellerDao {

    @Select("select * from traveller where id in (select travellerId from order_traveller where orderId=#{ordersId})")
    public List<Traveller> findByOrdersId(String ordersId) throws Exception;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值