JavaStudy12(27章-满汉楼)—B站hsp
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2BBcU79x-1654232733632)(C:\Users\tarena\AppData\Roaming\Typora\typora-user-images\image-20220531090355083.png)]](https://img-blog.csdnimg.cn/9d67c1646f5149d299e44d3921f9924c.png)
1.程序框架图
![在这里插入图片描述](https://img-blog.csdnimg.cn/e78e8b021b7343139b6005d62a5c3ca5.png)
2 代码演示
2.1 DAO层
package com.qinbo.mhl.dao;
import com.qinbo.mhl.utils.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public class BasicDAO<T> {
private QueryRunner qr = new QueryRunner();
public int update(String sql, Object... parameters) {
Connection connection = null;
try {
connection = JDBCUtilsByDruid.getConnection();
int update = qr.update(connection, sql, parameters);
return update;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null, null, connection);
}
}
public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {
Connection connection = null;
try {
connection = JDBCUtilsByDruid.getConnection();
return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null, null, connection);
}
}
public T querySingle(String sql, Class<T> clazz, Object... parameters) {
Connection connection = null;
try {
connection = JDBCUtilsByDruid.getConnection();
return qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null, null, connection);
}
}
public Object queryScalar(String sql, Object... parameters) {
Connection connection = null;
try {
connection = JDBCUtilsByDruid.getConnection();
return qr.query(connection, sql, new ScalarHandler(), parameters);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null, null, connection);
}
}
}
package com.qinbo.mhl.dao;
import com.qinbo.mhl.domain.Bill;
public class BillDAO extends BasicDAO<Bill>{
}
package com.qinbo.mhl.dao;
import com.qinbo.mhl.domain.DiningTable;
public class DiningTableDAO extends BasicDAO<DiningTable>{
}
package com.qinbo.mhl.dao;
import com.qinbo.mhl.domain.Employee;
public class EmployeeDAO extends BasicDAO<Employee>{
}
package com.qinbo.mhl.dao;
import com.qinbo.mhl.domain.Menu;
public class MenuDAO extends BasicDAO<Menu>{
}
package com.qinbo.mhl.dao;
import com.qinbo.mhl.domain.MultiTableBean;
public class MultiTableDAO extends BasicDAO<MultiTableBean>{
}
2.2 domain
package com.qinbo.mhl.domain;
import java.util.Date;
public class Bill {
private Integer id;
private String billId;
private Integer menuId;
private Integer nums;
private Double money;
private Integer diningTableId;
private Date billDate;
private String state;
public Bill() {
}
public Bill(Integer id, String billId, Integer menuId, Integer nums, Double money, Integer diningTableId, Date billDate, String state) {
this.id = id;
this.billId = billId;
this.menuId = menuId;
this.nums = nums;
this.money = money;
this.diningTableId = diningTableId;
this.billDate = billDate;
this.state = state;
}
@Override
public String toString() {
return id +
"\t\t" + menuId +
"\t\t\t" + nums +
"\t\t\t" + money +
"\t" + diningTableId +
"\t\t" + billDate +
"\t\t" + state;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBillId() {
return billId;
}
public void setBillId(String billId) {
this.billId = billId;
}
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
public Integer getNums() {
return nums;
}
public void setNums(Integer nums) {
this.nums = nums;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public Integer getDiningTableId() {
return diningTableId;
}
public void setDiningTableId(Integer diningTableId) {
this.diningTableId = diningTableId;
}
public Date getBillDate() {
return billDate;
}
public void setBillDate(Date billDate) {
this.billDate = billDate;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
package com.qinbo.mhl.domain;
public class DiningTable {
private Integer id;
private String state;
private String orderName;
private String orderTel;
public DiningTable() {
}
public DiningTable(Integer id, String state, String orderName, String orderTel) {
this.id = id;
this.state = state;
this.orderName = orderName;
this.orderTel = orderTel;
}
@Override
public String toString() {
return id + "\t\t\t" + state;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public String getOrderTel() {
return orderTel;
}
public void setOrderTel(String orderTel) {
this.orderTel = orderTel;
}
}
package com.qinbo.mhl.domain;
public class Employee {
private Integer id;
private String empId;
private String pwd;
private String name;
private String job;
public Employee() {
}
public Employee(int id, String empId, String pwd, String name, String job) {
this.id = id;
this.empId = empId;
this.pwd = pwd;
this.name = name;
this.job = job;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", empId='" + empId + '\'' +
", pwd='" + pwd + '\'' +
", name='" + name + '\'' +
", job='" + job + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
package com.qinbo.mhl.domain;
public class Menu {
private Integer id;
private String name;
private String type;
private double price;
public Menu() {
}
public Menu(Integer id, String name, String type, double price) {
this.id = id;
this.name = name;
this.type = type;
this.price = price;
}
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 getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return id + "\t\t\t" + name + "\t\t" + type + "\t\t" + price;
}
}
package com.qinbo.mhl.domain;
import java.util.Date;
public class MultiTableBean {
private Integer id;
private String billId;
private Integer menuId;
private Integer nums;
private Double money;
private Integer diningTableId;
private Date billDate;
private String state;
private String name;
private Double price;
public MultiTableBean() {
}
@Override
public String toString() {
return id +
"\t\t" + menuId +
"\t\t\t" + nums +
"\t\t\t" + money +
"\t" + diningTableId +
"\t\t" + billDate +
"\t\t" + state +
"\t\t" + name +
"\t\t" + price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBillId() {
return billId;
}
public void setBillId(String billId) {
this.billId = billId;
}
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
public Integer getNums() {
return nums;
}
public void setNums(Integer nums) {
this.nums = nums;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public Integer getDiningTableId() {
return diningTableId;
}
public void setDiningTableId(Integer diningTableId) {
this.diningTableId = diningTableId;
}
public Date getBillDate() {
return billDate;
}
public void setBillDate(Date billDate) {
this.billDate = billDate;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
2.3 service
package com.qinbo.mhl.service;
import com.qinbo.mhl.dao.BillDAO;
import com.qinbo.mhl.dao.MenuDAO;
import com.qinbo.mhl.dao.MultiTableDAO;
import com.qinbo.mhl.domain.Bill;
import com.qinbo.mhl.domain.Menu;
import com.qinbo.mhl.domain.MultiTableBean;
import java.util.List;
import java.util.UUID;
public class BillService {
private BillDAO billDAO = new BillDAO();
private MenuService menuService = new MenuService();
private DiningTableService diningTableService = new DiningTableService();
private MultiTableDAO multiTableDAO = new MultiTableDAO();
public boolean updateBill(int menuId, int nums, int diningTableId) {
String billId = UUID.randomUUID().toString();
int update = billDAO.update("insert into bill values (null, ?,?,?,?,?,now(),'未结账' )",
billId, menuId, nums, menuService.getMenuById(menuId).getPrice() * nums, diningTableId);
if (update <= 0) {
return false;
}
return diningTableService.updateDiningTableState(diningTableId, "就餐中");
}
public List<Bill> showBillList() {
return billDAO.queryMulti("select * from bill", Bill.class);
}
public List<MultiTableBean> showBillList2() {
return multiTableDAO.queryMulti("SELECT bill.*, NAME,price " +
"FROM bill, menu "+
"WHERE bill.menuId = menu.id", MultiTableBean.class);
}
public boolean hasPayBillByDiningTableId(int diningTableId) {
Bill bill = billDAO.querySingle("SELECT * FROM bill WHERE diningTableId=? AND state = '未结账' LIMIT 0, 1", Bill.class, diningTableId);
return bill != null;
}
public boolean payBill(int diningTableId, String payMode) {
int update = billDAO.update("update bill set state = ? where diningTableId = ? and state = '未结账'", payMode, diningTableId);
if (update <= 0) {
return false;
}
if (!diningTableService.updateDiningTableToFree(diningTableId)) {
return false;
}
return true;
}
}
package com.qinbo.mhl.service;
import com.qinbo.mhl.dao.DiningTableDAO;
import com.qinbo.mhl.domain.DiningTable;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.util.List;
public class DiningTableService {
private DiningTableDAO diningTableDAO = new DiningTableDAO();
public List<DiningTable> tableList() {
return diningTableDAO.queryMulti("select id,state from diningTable ", DiningTable.class);
}
public DiningTable getDiningTableById(int id) {
return diningTableDAO.querySingle("SELECT * FROM diningTable WHERE id = ? ", DiningTable.class, id);
}
public boolean orderDiningTable(int orderId, String orderName, String orderTel) {
int update =
diningTableDAO.update("UPDATE diningTable SET state='已经预定', orderName=?, orderTel=? WHERE id=?",
orderName, orderTel, orderId);
return update > 0;
}
public boolean updateDiningTableState(int id, String state) {
int update = diningTableDAO.update("UPDATE diningTable SET state= ? WHERE id=?", state, id);
return update > 0;
}
public boolean updateDiningTableToFree(int id) {
int update = diningTableDAO.update("update diningTable set state = '空',orderName = '',orderTel = '' where id = ?",id);
return update > 0;
}
}
package com.qinbo.mhl.service;
import com.qinbo.mhl.dao.EmployeeDAO;
import com.qinbo.mhl.domain.Employee;
import org.apache.commons.dbutils.handlers.BeanHandler;
public class EmployeeService {
private EmployeeDAO employeeDAO = new EmployeeDAO();
public Employee getEmployeeByIdAndPwd(String empId, String pwd){
return employeeDAO.querySingle("select * from employee where empId=? and pwd=md5(?)",Employee.class,empId,pwd );
}
}
package com.qinbo.mhl.service;
import com.qinbo.mhl.dao.MenuDAO;
import com.qinbo.mhl.domain.Menu;
import java.util.List;
public class MenuService {
private MenuDAO menuDAO = new MenuDAO();
public List<Menu> menuList(){
return menuDAO.queryMulti("select * from menu",Menu.class);
}
public Menu getMenuById(int id){
return menuDAO.querySingle("select * from menu where id = ?",Menu.class,id);
}
}
2.4utils
package com.qinbo.mhl.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtilsByDruid {
private static DataSource ds;
static {
Properties properties = new Properties();
try {
properties.load(new FileInputStream("src\\druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
package com.qinbo.mhl.utils;
import java.sql.Connection;
import java.sql.SQLException;
public class Test {
public static void main(String[] args) throws SQLException {
System.out.println("请输入一个整数:");
int i = Utility.readInt();
System.out.println("i=" + i);
Connection connection = JDBCUtilsByDruid.getConnection();
System.out.println(connection);
}
}
package com.qinbo.mhl.utils;
import java.util.*;
public class Utility {
private static Scanner scanner = new Scanner(System.in);
public static char readMenuSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static char readChar() {
String str = readKeyBoard(1, false);
return str.charAt(0);
}
public static char readChar(char defaultValue) {
String str = readKeyBoard(1, true);
return (str.length() == 0) ? defaultValue : str.charAt(0);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static int readInt(int defaultValue) {
int n;
for (; ; ) {
String str = readKeyBoard(10, true);
if (str.equals("")) {
return defaultValue;
}
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
public static char readConfirmSelection() {
System.out.println("确认是否预订(Y/N):");
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
}
2.5 view
package com.qinbo.mhl.view;
import com.qinbo.mhl.domain.*;
import com.qinbo.mhl.service.BillService;
import com.qinbo.mhl.service.DiningTableService;
import com.qinbo.mhl.service.EmployeeService;
import com.qinbo.mhl.service.MenuService;
import com.qinbo.mhl.utils.Utility;
import java.util.List;
public class MHLView {
private boolean loop = true;
private String key = "";
private EmployeeService employeeService = new EmployeeService();
private DiningTableService diningTableService = new DiningTableService();
private MenuService menuService = new MenuService();
private BillService billService = new BillService();
public static void main(String[] args) {
MHLView mhlView = new MHLView();
mhlView.mainView();
}
public void orderDiningTable() {
System.out.println("==============预定餐桌============");
System.out.print("请选择要预定的餐桌编号(-1退出): ");
int orderId = Utility.readInt();
if (orderId == -1) {
return;
}
char key = Utility.readConfirmSelection();
if (key == 'Y') {
DiningTable diningTableById = diningTableService.getDiningTableById(orderId);
if (diningTableById == null) {
System.out.println("==============预订餐桌不存在============");
return;
}
if (!(diningTableById.getState().equals("空"))) {
System.out.println("==============该餐桌已经预定或者就餐中============");
return;
}
System.out.print("预定人的名字: ");
String orderName = Utility.readString(50);
System.out.print("预定人的电话: ");
String orderTel = Utility.readString(50);
if (diningTableService.orderDiningTable(orderId,orderName,orderTel)){
System.out.println("==============预订餐桌成功============");
}else {
System.out.println("==============预订餐桌失败============");
}
}else {
System.out.println("==============取消预订餐桌============");
}
}
public void listDiningTable() {
List<DiningTable> diningTables = diningTableService.tableList();
System.out.println("\n餐桌编号\t\t餐桌状态");
for (DiningTable diningTable : diningTables) {
System.out.println(diningTable);
}
System.out.println("==============显示完毕============");
}
public void listMenu(){
List<Menu> menuList = menuService.menuList();
System.out.println("\n菜品编号\t\t菜品名\t\t类别\t\t价格");
for (Menu menu : menuList) {
System.out.println(menu);
}
System.out.println("==============显示完毕============");
}
public void orderMenu(){
System.out.println("==============点餐服务============");
System.out.print("请输入点餐的桌号(-1退出): ");
int orderDiningTableId = Utility.readInt();
if(orderDiningTableId ==-1){
System.out.println("==============取消点餐============");
return;
}
System.out.print("请输入点餐的菜品号(-1退出): ");
int orderMenuId = Utility.readInt();
if (orderMenuId == -1) {
System.out.println("==============取消点餐============");
return;
}
System.out.print("请输入点餐的菜品量(-1退出): ");
int orderNums = Utility.readInt();
if (orderNums == -1) {
System.out.println("==============取消点餐============");
return;
}
DiningTable diningTableById = diningTableService.getDiningTableById(orderDiningTableId);
if (diningTableById == null){
System.out.println("==============餐桌号不存在============");
return;
}
Menu menuById = menuService.getMenuById(orderMenuId);
if (menuById == null){
System.out.println("==============菜品不存在============");
return;
}
if (billService.updateBill(orderMenuId,orderNums,orderDiningTableId)) {
System.out.println("==============点餐成功============");
}else {
System.out.println("==============点餐失败============");
}
}
public void showBillList2(){
List<MultiTableBean> multiTableBeans = billService.showBillList2();
System.out.println("\n编号\t\t菜品号\t\t菜品量\t\t金额\t\t桌号\t\t日期\t\t\t\t\t\t\t状态\t\t菜品名\t\t价格");
for (MultiTableBean bill : multiTableBeans) {
System.out.println(bill);
}
System.out.println("==============显示完毕============");
}
public void payBill(){
System.out.println("==============结账服务============");
System.out.print("请选择要结账的餐桌编号(-1退出): ");
int diningTableId = Utility.readInt();
if (diningTableId == -1) {
System.out.println("=============取消结账============");
return;
}
DiningTable diningTableById = diningTableService.getDiningTableById(diningTableId);
if (diningTableById == null){
System.out.println("=============结账的餐桌不存在============");
return;
}
if (!billService.hasPayBillByDiningTableId(diningTableId)) {
System.out.println("=============该餐位没有未结账账单============");
return;
}
System.out.print("结账方式(现金/支付宝/微信)回车表示退出: ");
String payMode = Utility.readString(20, "");
if ("".equals(payMode)) {
System.out.println("=============取消结账============");
return;
}
char key = Utility.readConfirmSelection();
if (key == 'Y' || key == 'y') {
if (billService.payBill(diningTableId, payMode)) {
System.out.println("=============完成结账============");
}else {
System.out.println("=============结账失败============");
}
}else {
System.out.println("=============取消结账============");
}
}
public void mainView() {
while (loop) {
System.out.println("\n===============满汉楼================");
System.out.println("\t\t 1 登录满汉楼");
System.out.println("\t\t 2 退出满汉楼");
System.out.print("请输入你的选择: ");
key = Utility.readString(1);
switch (key) {
case "1":
System.out.println("请输入员工号");
String id = Utility.readString(50);
System.out.println("请输入密码");
String pwd = Utility.readString(50);
Employee employee = employeeService.getEmployeeByIdAndPwd(id, pwd);
if (employee != null) {
System.out.println("===============登录成功[" + employee.getName() + "]================\n");
while (loop) {
System.out.println("\n===============满汉楼(二级菜单)================");
System.out.println("\t\t 1 显示餐桌状态");
System.out.println("\t\t 2 预定餐桌");
System.out.println("\t\t 3 显示所有菜品");
System.out.println("\t\t 4 点餐服务");
System.out.println("\t\t 5 查看账单");
System.out.println("\t\t 6 结账");
System.out.println("\t\t 9 退出满汉楼");
System.out.print("请输入你的选择: ");
key = Utility.readString(1);
switch (key) {
case "1":
listDiningTable();
break;
case "2":
orderDiningTable();
System.out.println("预定餐桌");
break;
case "3":
listMenu();
System.out.println("显示所有菜品");
break;
case "4":
orderMenu();
System.out.println("点餐服务");
break;
case "5":
showBillList2();
System.out.println("查看账单");
break;
case "6":
payBill();
System.out.println("结账");
break;
case "9":
System.out.println("退出满汉楼");
loop = false;
break;
default:
System.out.println("输入有误,重新输入");
}
}
} else {
System.out.println("==============登陆失败===============");
}
break;
case "2":
System.out.println("退出满汉楼");
loop = false;
break;
default:
System.out.println("输入有误,重新输入");
}
}
System.out.println("已退出满汉楼");
}
}
2.6 properties
#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mhl?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/girls
username=root
password=root
#initial connection Size 初始
initialSize=10
#min idle connecton size 空闲时最小连接
minIdle=5
#max active connection size 最大
maxActive=20
#max wait time (5000 mil seconds)
maxWait=5000