文章目录
1. 创建表
1.1 表之间的关系
- 订单表和产品表之间的关系为:多对一
- 订单表和会员表之间的关系为:多对一
- 订单表和旅客表之间的关系为:多对多
1.2 会员表
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | int(11) | 主键,自增长 |
2 | name | varchar(20) | 姓名 |
3 | nickName | varchar(20) | 昵称 |
4 | phoneNum | varchar(20) | 电话号码 |
5 | varchar(50) | 邮箱 |
DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`nickName` varchar(20) DEFAULT NULL,
`phoneNum` varchar(20) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `member` VALUES ('1', '张三', '小三', '18888888888', '[email protected]');
1.3 旅客表
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | int(11) | 主键,自增长 |
2 | name | varchar(20) | 姓名 |
3 | sex | varchar(20) | 性别 |
4 | phoneNum | varchar(20) | 电话号码 |
5 | credentialsType | int(11) | 证件类型:0身份证 1护照 2军官证 |
6 | credentialsNum | varchar(50) | 证件号码 |
7 | travellerType | int(11) | 旅客类型:0成人 1儿童 |
DROP TABLE IF EXISTS `traveller`;
CREATE TABLE `traveller` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
`phoneNum` varchar(20) DEFAULT NULL,
`credentialsType` int(11) DEFAULT NULL,
`credentialsNum` varchar(50) DEFAULT NULL,
`travellerType` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `traveller` VALUES ('1', '张龙', '男', '13333333333', '0', '123456789009876543', '0');
INSERT INTO `traveller` VALUES ('2', '张小龙', '男', '15555555555', '0', '987654321123456789', '1');
1.4 订单表
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | int(11) | 主键,自增长 |
2 | orderNum | varchar(50) | 订单编号,唯一,不为空 |
3 | orderTime | datetime | 下单时间 |
4 | peopleCount | int(11) | 出行人数 |
5 | orderDesc | varchar(255) | 订单描述 |
6 | payType | int(11) | 支付方式(0支付宝 1 微信 2其它) |
7 | orderStatus | int(11) | 订单状态(0未支付 1已支付) |
8 | productId | int(11) | 产品 id(外键) |
9 | memberId | int(11) | 会员 id(外键) |
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orderNum` varchar(50) NOT NULL,
`orderTime` datetime DEFAULT NULL,
`peopleCount` int(11) DEFAULT NULL,
`orderDesc` varchar(255) DEFAULT NULL,
`payType` int(11) DEFAULT NULL,
`orderStatus` int(11) DEFAULT NULL,
`productId` int(11) DEFAULT NULL,
`memberId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `orderNum` (`orderNum`),
KEY `memberId` (`memberId`),
KEY `productId` (`productId`),
CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`memberId`) REFERENCES `member` (`id`),
CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`productId`) REFERENCES `product` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
INSERT INTO `orders` VALUES ('1', '12345', '2019-10-19 16:15:05', '2', '没什么', '0', '1', '1', '1');
INSERT INTO `orders` VALUES ('2', '54321', '2019-10-26 16:17:41', '2', '没什么', '0', '1', '3', '1');
INSERT INTO `orders` VALUES ('3', '56789', '2019-10-23 16:19:26', '3', '没什么', '1', '1', '7', '1');
INSERT INTO `orders` VALUES ('4', '98765', '2019-10-22 16:20:56', '3', '没什么', '2', '1', '8', '1');
INSERT INTO `orders` VALUES ('5', '11111', '2019-10-25 16:22:52', '4', '没什么', '2', '1', '8', '1');
INSERT INTO `orders` VALUES ('6', '22222', '2019-10-19 16:23:26', '4', '没什么', '0', '1', '2', '1');
INSERT INTO `orders` VALUES ('7', '33333', '2019-10-26 16:24:14', '4', '没什么', '0', '1', '3', '1');
1.5 订单与旅客中间表
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | orderId | int(11) | 订单 id(外键) |
2 | travellerId | int(11) | 旅客 id(外键) |
DROP TABLE IF EXISTS `order_traveller`;
CREATE TABLE `order_traveller` (
`orderId` int(11) NOT NULL,
`travellerId` int(11) NOT NULL,
PRIMARY KEY (`orderId`,`travellerId`),
KEY `travellerId` (`travellerId`),
CONSTRAINT `order_traveller_ibfk_1` FOREIGN KEY (`orderId`) REFERENCES `orders` (`id`),
CONSTRAINT `order_traveller_ibfk_2` FOREIGN KEY (`travellerId`) REFERENCES `traveller` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `order_traveller` VALUES ('1', '1');
INSERT INTO `order_traveller` VALUES ('2', '1');
INSERT INTO `order_traveller` VALUES ('3', '1');
INSERT INTO `order_traveller` VALUES ('1', '2');
INSERT INTO `order_traveller` VALUES ('2', '2');
INSERT INTO `order_traveller` VALUES ('3', '2');
2. 实现查询订单操作
2.1 编写实体类
/**
* 会员实体类
*/
public class Member implements Serializable {
private Integer id; // 主键
private String name; // 会员姓名
private String nickName; //会员昵称
private String phoneNum; //会员电话
private String email; // 会员邮箱
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Member{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
", phoneNum='" + phoneNum + '\'' +
", email='" + email + '\'' +
'}';
}
}
/**
* 旅客实体类
*/
public class Traveller implements Serializable {
private Integer id; // 主键
private String name; // 旅客姓名
private String sex; // 旅客性别
private String phoneNum; // 旅客电话
private Integer credentialsType; // 旅客证件类型(0身份证 1护照 2军官证)
private String credentialsTypeStr; // 旅客证件类型字符串
private String credentialsNum; // 旅客证件号
private Integer travellerType; // 旅客类型(0成人 1儿童)
private String travellerTypeStr; //旅客类型字符串
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public Integer getCredentialsType() {
return credentialsType;
}
public void setCredentialsType(Integer credentialsType) {
this.credentialsType = credentialsType;
}
public String getCredentialsTypeStr() {
if (credentialsType != null) {
if (credentialsType == 0) {
credentialsTypeStr = "身份证";
}
if (credentialsType == 1) {
credentialsTypeStr = "护照";
}
if (credentialsType == 2) {
credentialsTypeStr = "军官证";
}
}
return credentialsTypeStr;
}
public void setCredentialsTypeStr(String credentialsTypeStr) {
this.credentialsTypeStr = credentialsTypeStr;
}
public String getCredentialsNum() {
return credentialsNum;
}
public void setCredentialsNum(String credentialsNum) {
this.credentialsNum = credentialsNum;
}
public Integer getTravellerType() {
return travellerType;
}
public void setTravellerType(Integer travellerType) {
this.travellerType = travellerType;
}
public String getTravellerTypeStr() {
if (travellerType != null) {
if (travellerType == 0) {
travellerTypeStr = "成人";
}
if (travellerType == 1) {
travellerTypeStr = "儿童";
}
}
return travellerTypeStr;
}
public void setTravellerTypeStr(String travellerTypeStr) {
this.travellerTypeStr = travellerTypeStr;
}
@Override
public String toString() {
return "Traveller{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", phoneNum='" + phoneNum + '\'' +
", credentialsType=" + credentialsType +
", credentialsTypeStr='" + credentialsTypeStr + '\'' +
", credentialsNum='" + credentialsNum + '\'' +
", travellerType=" + travellerType +
", travellerTypeStr='" + travellerTypeStr + '\'' +
'}';
}
}
/**
* 订单实体类
*/
public class Orders implements Serializable {
private Integer id; // 主键
private String orderNum; // 订单编号
private Date orderTime; // 下单时间
private String orderTimeStr; // 下单时间字符串
private Integer peopleCount; // 出行人数
private String orderDesc; // 订单描述
private Integer payType; // 支付方式(0支付宝 1 微信 2其它)
private String payTypeStr; // 支付方式字符串
private Integer orderStatus; // 订单状态(0未支付 1 已支付)
private String orderStatusStr; // 订单状态字符串
private Product product; // 产品
private Member member; // 会员
private List<Traveller> travellers; // 旅客
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNum() {
return orderNum;
}
public void setOrderNum(String orderNum) {
this.orderNum = orderNum;
}
public Date getOrderTime() {
return orderTime;
}
public void setOrderTime(Date orderTime) {
this.orderTime = orderTime;
}
public String getOrderTimeStr() {
if (orderTime != null) {
orderTimeStr = DateUtils.date2String(orderTime, "yyyy-MM-dd HH:mm:ss");
}
return orderTimeStr;
}
public void setOrderTimeStr(String orderTimeStr) {
this.orderTimeStr = orderTimeStr;
}
public Integer getPeopleCount() {
return peopleCount;
}
public void setPeopleCount(Integer peopleCount) {
this.peopleCount = peopleCount;
}
public String getOrderDesc() {
return orderDesc;
}
public void setOrderDesc(String orderDesc) {
this.orderDesc = orderDesc;
}
public Integer getPayType() {
return payType;
}
public void setPayType(Integer payType) {
this.payType = payType;
}
public String getPayTypeStr() {
if (payType != null) {
if (payType == 0) {
payTypeStr = "支付宝";
} else if (payType == 1) {
payTypeStr = "微信";
} else if (payType == 2) {
payTypeStr = "其他";
}
}
return payTypeStr;
}
public void setPayTypeStr(String payTypeStr) {
this.payTypeStr = payTypeStr;
}
public Integer getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(Integer orderStatus) {
this.orderStatus = orderStatus;
}
public String getOrderStatusStr() {
if (orderStatus != null) {
if (orderStatus == 0) {
orderStatusStr = "未支付";
} else if (orderStatus == 1) {
orderStatusStr = "已支付";
}
}
return orderStatusStr;
}
public void setOrderStatusStr(String orderStatusStr) {
this.orderStatusStr = orderStatusStr;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public List<Traveller> getTravellers() {
return travellers;
}
public void setTravellers(List<Traveller> travellers) {
this.travellers = travellers;
}
@Override
public String toString() {
return "Orders{" +
"id='" + id + '\'' +
", orderNum='" + orderNum + '\'' +
", orderTime=" + orderTime +
", orderTimeStr='" + orderTimeStr + '\'' +
", peopleCount=" + peopleCount +
", orderDesc='" + orderDesc + '\'' +
", payType=" + payType +
", payTypeStr='" + payTypeStr + '\'' +
", orderStatus=" + orderStatus +
", orderStatusStr='" + orderStatusStr + '\'' +
", product=" + product +
", member=" + member +
", travellers=" + travellers +
'}';
}
}
2.2 编写持久层接口
@Repository
public interface OrdersDao {
/**
* 查询所有订单
* @return
*/
@Select("select * from orders")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "orderNum", column = "orderNum"),
@Result(property = "orderTime", column = "orderTime"),
@Result(property = "peopleCount", column = "peopleCount"),
@Result(property = "orderDesc", column = "orderDesc"),
@Result(property = "payType", column = "payType"),
@Result(property = "orderStatus", column = "orderStatus"),
@Result(property = "product", column = "productId",one = @One(select = "com.zt.dao.ProductDao.findById")),
})
List<Orders> findAll() throws Exception;
}
@Repository
public interface ProductDao {
/**
* 查询单个产品
* @param id
* @return
* @throws Exception
*/
@Select("select * from product where id=#{id}")
Product findById(Integer id) throws Exception;
}
2.3 编写业务层接口和实现类
public interface OrdersService {
/**
* 查询所有订单
* @return
* @throws Exception
*/
List<Orders> findAll() throws Exception;
}
@Transactional
@Service("ordersService")
public class OrdersServiceImpl implements OrdersService {
@Autowired
private OrdersDao ordersDao;
/**
* 查询所有订单
* @return
* @throws Exception
*/
@Override
public List<Orders> findAll() throws Exception {
return ordersDao.findAll();
}
}
2.4 编写控制层
@Controller
@RequestMapping("/orders")
public class OrdersController {
@Autowired
private OrdersService ordersService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
ModelAndView modelAndView = new ModelAndView();
List<Orders> orders = ordersService.findAll();
modelAndView.addObject("ordersList",orders);
modelAndView.setViewName("orders-list");
return modelAndView;
}
}
2.5 编写 JSP 页面
在 pages 包中创建 orders-list.jsp
3. 实现分页查询订单操作
3.1 PageHelper 介绍
PageHelper 是国内非常优秀的一款开源的 MyBatis 分页插件,它支持基本主流与常用的数据库。
3.2 PageHelper 的使用
-
导入依赖坐标
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
-
在 applicationContext.xml 中,在配置 SqlSessionFactory 工厂中传入 PageHelper 的插件
<!-- 配置 SqlSessionFactory 工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 传入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> </bean>
-
编写业务层
public interface OrdersService { /** * 分页查询所有订单 * @param pageNum 当前页数 * @param pageSize 每页条数 * @return * @throws Exception */ List<Orders> findAllByPage(int pageNum, int pageSize) throws Exception; }
@Transactional @Service("ordersService") public class OrdersServiceImpl implements OrdersService { @Autowired private OrdersDao ordersDao; /** * 分页查询所有订单 * @param pageNum 当前页数 * @param pageSize 每页条数 * @return * @throws Exception */ @Override public List<Orders> findAllByPage(int pageNum, int pageSize) throws Exception { PageHelper.startPage(pageNum,pageSize); return ordersDao.findAll(); } }
-
编写控制层
@Controller @RequestMapping("/orders") public class OrdersController { @Autowired private OrdersService ordersService; /** * 分页查询所有订单 * @param pageNum 当前页数 * @param pageSize 每页条数 * @return * @throws Exception */ @RequestMapping("/findAllByPage.do") public ModelAndView findAllByPage(@RequestParam(name = "pageNum", defaultValue = "1") int pageNum, @RequestParam(name = "pageSize", defaultValue = "5") int pageSize) throws Exception { ModelAndView modelAndView = new ModelAndView(); List<Orders> orders = ordersService.findAllByPage(pageNum, pageSize); PageInfo<Orders> ordersPageInfo = new PageInfo<>(orders); modelAndView.addObject("pageInfo", ordersPageInfo); modelAndView.setViewName("orders-page-list"); return modelAndView; } }
-
编写 JSP 页面
在 pages 包中创建 orders-page-list.jsp
4. 实现查询订单详情操作
4.1 编写持久层接口
@Repository
public interface OrdersDao {
/**
* 查询单个订单详细信息
*
* @return
* @throws Exception
*/
@Select("select * from orders where id=#{id}")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "orderNum", column = "orderNum"),
@Result(property = "orderTime", column = "orderTime"),
@Result(property = "peopleCount", column = "peopleCount"),
@Result(property = "orderDesc", column = "orderDesc"),
@Result(property = "payType", column = "payType"),
@Result(property = "orderStatus", column = "orderStatus"),
@Result(property = "product", column = "productId", one = @One(select = "com.zt.dao.ProductDao.findById")),
@Result(property = "member", column = "memberId", one = @One(select = "com.zt.dao.MemberDao.findById")),
@Result(property = "travellers", column = "id",many = @Many(select = "com.zt.dao.TravellerDao.findById"))
})
Orders findById(int id) throws Exception;
}
public interface MemberDao {
/**
* 查询单个会员
* @param id
*/
@Select("select * from member where id=#{id}")
Member findById(int id) throws Exception;
}
public interface TravellerDao {
/**
* 查询旅客
* @param id
* @return
* @throws Exception
*/
@Select("select * from traveller where id in(select travellerId from order_traveller where orderId = #{id})")
List<Traveller> findById(int id) throws Exception;
}
4.2 编写业务层接口和实现类
public interface OrdersService {
/**
* 查询单个订单详细信息
* @param id
* @return
* @throws Exception
*/
Orders findById(int id) throws Exception;
}
@Transactional
@Service("ordersService")
public class OrdersServiceImpl implements OrdersService {
@Autowired
private OrdersDao ordersDao;
/**
* 查询单个订单详细信息
* @param id
* @return
* @throws Exception
*/
@Override
public Orders findById(int id) throws Exception {
return ordersDao.findById(id);
}
}
4.3 编写控制层
@Controller
@RequestMapping("/orders")
public class OrdersController {
@Autowired
private OrdersService ordersService;
/**
* 查询单个订单详细信息
* @param id
* @return
* @throws Exception
*/
@RequestMapping("/findById.do")
public ModelAndView findById(@RequestParam(name = "id") int id) throws Exception {
ModelAndView modelAndView = new ModelAndView();
Orders orders = ordersService.findById(id);
modelAndView.addObject("orders",orders);
modelAndView.setViewName("orders-show");
return modelAndView;
}
}
4.4 编写 JSP 页面
在 pages 包中创建 orders-show.jsp