满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现
一:需求
1.完成一個酒店后臺管理系統(tǒng),當(dāng)然只是模擬,在控制臺就行模擬
 2.實現(xiàn)管理人員的登錄和酒店成本賬單的查看,以及正常的點餐,結(jié)賬和查看賬單等等功能
二:實現(xiàn)的功能展示
1.用戶登錄(這里輸入的員工號和密碼要與數(shù)據(jù)庫中存的進(jìn)行校驗)
2.顯示前臺和后臺成本信息
3:前臺
4:后臺
 其他細(xì)節(jié)功能展示不展示了
三:分層實現(xiàn)
1.圖示
2:代碼分析
1>:總體上先將框架寫好,然后在補(bǔ)充功能
 2>.具體的功能我們是從下往上開始寫,因為上方的邏輯結(jié)構(gòu)可能用到下方的
 3>:我們補(bǔ)充的功能先創(chuàng)建一個表,然后創(chuàng)建一個Javabean(將你想要獲取的表當(dāng)中的字段,寫成類的屬性,注意空構(gòu)造器和set,get方法),然后就是創(chuàng)建一個相關(guān)類的DAO,方便我們sql語句的操作,再然后就是Service層這是我們的業(yè)務(wù)層,我們把我們想要實現(xiàn)的功能在這里封裝成方法,提供給最后的View層調(diào)用,從這里實現(xiàn)的功能的步驟我們可以看出,這是一個自下向上的過程,
3:代碼層次分析
1>:德魯伊連接池+DBUtils+DAO+Mysql
 2>:我們首先要引入相關(guān)的jar包(druid.jar;dbu.jar,mysql.jar)
 3>:德魯伊連接池我們需要相關(guān)的配置文件,url=(數(shù)據(jù)庫的地址),password,username,
 初始化可以連接多少連接,最多可以有多少連接,指的是java程序連接數(shù)據(jù)庫,使用連接池,我們可以提高我們的連接效率,還有一個連接池是c3p0這個連接池比德魯伊要慢一些,所以我們采用的是德魯伊連接池.
 4>:
 關(guān)于DBUtils,這是通過select得到的那個結(jié)果只能在不關(guān)閉連接的時候可以看見,一旦關(guān)閉了連接,我們就無法獲得查詢的結(jié)果,然后就用到了Javbean(創(chuàng)建一個類包含其表的屬性),通過反射獲取到相關(guān)的屬性,然后放到一個容器當(dāng)中,這樣你關(guān)閉了連接,但查詢的結(jié)果還是可以看到的
5>:
 DAO的引出是因為我們頻繁的操作sql語句,每次都要寫來連接,寫sql,發(fā)送sql,返回sql語句,這其實是很麻煩的,所以BasicDAO做了一件事,將select和dml操作封裝起來,用的時候傳入相關(guān)的類和sql語句以及想要的操作賦的值。
四:代碼+創(chuàng)建的表
1.注意引進(jìn)的jar包,
其分的包也就是上訴的層次結(jié)構(gòu)
 
2:view包
package com.wyj.mhl.view;import com.wyj.mhl.domain.Employee; import com.wyj.mhl.domain.Menu; import com.wyj.mhl.domain.diningTable; import com.wyj.mhl.service.*; import com.wyj.mhl.utils.Utility;public class MHL_View {public static void main(String[] args) {new MHL_View().mainMenu();}//預(yù)定餐桌public void reser_food(){System.out.print("請選擇要預(yù)定的餐桌編號(1到6號餐桌)(-1退出):");int idd = Utility.readInt();if (idd != -1) {System.out.print("請確認(rèn)是否要預(yù)定(Y/N):");char ch = Utility.readChar();if (ch == 'Y') {System.out.print("請輸入預(yù)定人的名字:");String name = Utility.readString(10);System.out.print("請輸入預(yù)定人的電話:");String phone = Utility.readString(10);int i = diningTableService.book_table(idd, name, phone);if(i!= 0){System.out.println("======預(yù)定成功======");}else{return;}} else {return;}} else {return ;}}//點餐public void OrderMenu() {System.out.print("請輸入點餐的桌號(-1退出):");int idd2 = Utility.readInt();if (idd2 == -1)return;diningTable empty = diningTableService.isEmpty(idd2);if (!empty.getState().equals("空")) {System.out.println("===您選的座位已占==");return;}System.out.print("選擇菜品的編號(-1退出):");int menu_id1 = Utility.readInt();if (menu_id1 == -1)return;Menu singleBYid = menuService.getBillSingleBYid(menu_id1);if (singleBYid == null) {System.out.println("====您輸入的菜品單號本店沒有===");return;}System.out.print("選擇菜品的數(shù)量(-1退出):");int menu_nums = Utility.readInt();if (menu_nums == -1)return;System.out.print("確認(rèn)是否點這個菜(Y?N):");char ch = Utility.readChar();if (ch == 'Y') {if (billService.orderMenu(menu_id1, menu_nums, idd2)) {System.out.println("=====點餐成功=====");} else {System.out.println("====點餐失敗");}} else {System.out.println("==請重新輸入Y/N====");return;}}//結(jié)賬public void leave(){System.out.print("請選擇要結(jié)賬的餐桌編號(-1退出):");int leave_id = Utility.readInt();if(leave_id == -1){return ;}//檢驗餐桌號是否存在diningTable empty = diningTableService.isEmpty(leave_id);if(empty == null || empty.getState().equals("空")){if(empty == null)System.out.println("===您結(jié)賬的餐桌本店不存在===");elseSystem.out.println("===您并未在該餐桌就餐===");return;}//檢驗結(jié)賬的餐桌是否為空System.out.print("結(jié)賬方式(現(xiàn)金/支付寶/微信):");String leave_way = Utility.readString(10,"");if("".equals(leave_way)){System.out.println("===取消結(jié)賬===");return;}System.out.print("確認(rèn)是否結(jié)賬(Y/N):");char ch = Utility.readChar();if( ch == 'Y'){if (billService.invoicing(leave_id,leave_way)){System.out.println("====結(jié)賬成功====");}else{System.out.println("====結(jié)賬失敗====");}}else{System.out.println("===請您結(jié)賬離開本店===");return;}}private boolean loop = true;private String key = "";//一級菜單private String option = "";//二級菜單private EmployeeService service = new EmployeeService();//員工登錄的業(yè)務(wù)private DiningTableService diningTableService = new DiningTableService();//點餐的業(yè)務(wù)層private MenuService menuService = new MenuService();//顯示菜單private BillService billService = new BillService();//賬單private MulityTableService mulityTableService = new MulityTableService();//這個可以顯示賬單中帶菜名private CostSerivice costSerivice = new CostSerivice();//顯示成本信息public void mainMenu() {while (loop) {System.out.println("==========滿漢樓=========");System.out.println("\t\t1.登錄滿漢樓");System.out.println("\t\t2.退出滿漢樓");System.out.print("親輸入您的選項:");key = Utility.readString(1);switch (key) {case "1":System.out.print("請輸入員工號:");String empId = Utility.readString(20);System.out.print("請輸入 密碼:");String pwd = Utility.readString(20);Employee employee = service.getEmployeeEmpidandpwd(empId, pwd);if (employee != null) {System.out.println("===========登錄成功==========");System.out.println(employee.getEmpId() + " " + employee.getName());while(loop) {System.out.println("===滿漢樓的功能表===");System.out.println("1.前臺狀態(tài)");System.out.println("2.后臺成本");System.out.println("3.退出系統(tǒng)");System.out.print("請選擇您的選項:");int option2 = Utility.readInt();switch (option2) {case 1://顯示二級菜單while (loop) {System.out.println("===========滿漢樓二級菜單==========");System.out.println("\t\t1.顯示餐桌的狀態(tài)");System.out.println("\t\t2.預(yù)定餐桌");System.out.println("\t\t3.顯示所有菜品");System.out.println("\t\t4.點餐服務(wù)");System.out.println("\t\t5.查看賬單");System.out.println("\t\t6.結(jié)賬");System.out.println("\t\t7.退出滿漢樓");System.out.print("請輸入您的選項:");option = Utility.readString(1);switch (option) {case "1":diningTableService.showDiningTable();//顯示餐桌的狀態(tài)break;case "2":System.out.println("========預(yù)定餐桌========");new MHL_View().reser_food();break;case "3":System.out.println("======顯示菜單======");menuService.showMenu();break;case "4":System.out.println("======點餐服務(wù)======");new MHL_View().OrderMenu();break;case "5":System.out.println("===查看賬單====");//billService.showBill();mulityTableService.ShowBillandMenu();break;case "6":System.out.println("====結(jié)賬====");new MHL_View().leave();break;case "7":loop = false;break;default:System.out.println("輸入沒有在選項范圍內(nèi)");}}break;case 2:System.out.println("====成本控制====");costSerivice.showCost();break;case 3:loop = false;break;default:System.out.println("您的輸入有誤,請重新輸入");}}} else {System.out.println("===========登錄失敗==========");}break;case "2":loop = false;break;default:System.out.println("輸入的有問題,請重新輸入");}}System.out.println("退出滿漢樓!");}}3:utiles包中有一個輸入的的類和一個將德魯伊連接池變成工具類
(1):Utility
package com.wyj.mhl.utils;import java.util.Scanner;public class Utility {private static Scanner scanner;static {scanner = new Scanner(System.in);}public Utility() {}public static char readMenuSelection() {while (true) {String str = readKeyBoard(1, false);char c = str.charAt(0);if (c == 1 || c == 2 || c == 3 || c == 4 || c == 5) {return c;}System.out.print("選擇錯誤,請重新輸入:");}}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(){while (true){String str=readKeyBoard(2, false);try {int n=Integer.parseInt(str);return n;}catch (NumberFormatException var3){System.out.println("數(shù)字輸入錯誤,請重新輸入:");}}}public static int readInt(int defaultValue) {while(true) {String str = readKeyBoard(2, true);if (str.equals("")) {return defaultValue;}try {int n = Integer.parseInt(str);return n;} catch (NumberFormatException var4) {System.out.print("數(shù)字輸入錯誤,請重新輸入:");}}}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(){while (true){String str=readKeyBoard(1,false).toUpperCase();char c=str.charAt(0);if(c=='Y'||c=='N'){return c;}System.out.print("選擇錯誤,請重新輸入:");}}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 {if(line.length()>=1 && line.length()<=limit){break;}System.out.println("輸入長度(不大于" + limit + ")錯誤,請重新輸入:");}}return line;} }(2):JDBCUtilsBYDruid
package com.wyj.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 {//(1):定義一個數(shù)據(jù)源,作為連接池private static DataSource ds;//(2):靜態(tài)代碼塊 類加載的時候自動加載 而且只加載一次static {//獲取配置文件的信息Properties properties = new Properties();try {properties.load(new FileInputStream("src//druid.properties"));ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//設(shè)置成靜態(tài)的方法可以直接用類名進(jìn)行調(diào)用public static Connection getConnection() throws SQLException {return ds.getConnection();}//關(guān)閉連接,是關(guān)閉java程序與連接池的連接 而并不是關(guān)閉與數(shù)據(jù)庫的連接public static void close(ResultSet set, Statement statement,Connection connection){try {if(set != null){set.close();}if(statement != null){statement.close();}if(connection != null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}}4.Service包
(1):BillService
package com.wyj.mhl.service;import com.wyj.mhl.dao.BillDAO; import com.wyj.mhl.domain.Bill;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();/*** 實現(xiàn)點餐的功能:* 1.點菜品單號是否存在,點的餐桌號是否存在, 在view層中實現(xiàn)* 2.id:自增 不用管他* ,biilid:隨機(jī)字符串 不用管他* ,menuid:輸入的菜品號 形參* ,nums:點單數(shù)量 形參* ,money:計算出來的,需要MenuService 提供方法獲取菜品的價格* ,state:自己輸入的* billdate:當(dāng)前直接獲取* diningTable:輸入的餐桌號,形參*/public boolean orderMenu(int menuid,int nums,int dingtableid){String billid = (UUID.randomUUID().toString());//生成一個隨機(jī)賬單號billid = billid.substring(30);int i = billDAO.update("insert into bill values(null,?,?,?,?,?,now(),?)",billid, menuid, nums, menuService.getBillSingleBYid(menuid).getPrice() * nums, "未結(jié)賬", dingtableid);if(i < 0){return false;}//更新餐桌的狀態(tài)return diningTableService.updatestate(dingtableid,"就餐中");}//顯示賬單public void showBill(){List<Bill> list = billDAO.queryMulti("select * from bill", Bill.class);for (Bill bill : list) {System.out.println(bill);}}/*** 結(jié)賬:* 1.輸入餐桌號(檢驗餐桌是否存在,檢驗餐桌是否為空(為空的話 不用結(jié)賬))* 2.輸入結(jié)賬方式 支付寶,現(xiàn)金,微信* 3.更新餐桌的狀態(tài)** 就餐號 賬單單號 菜單號 點餐的份數(shù) 金額 餐桌狀態(tài) 餐桌號*/public boolean invoicing(int id,String check_way){int i = billDAO.update("update bill set state = ? where diningTable = ?", check_way, id);if(i < 0){return false;}//更新餐桌的狀態(tài)return diningTableService.updatestate(id,"空");}}(2):CostService
package com.wyj.mhl.service;import com.wyj.mhl.dao.CostDAO; import com.wyj.mhl.domain.Cost;import java.util.List;public class CostSerivice {private CostDAO costDAO = new CostDAO();//顯示成本:public void showCost(){List<Cost> list = costDAO.queryMulti("select * from cost", Cost.class);System.out.println("日期"+"\t\t"+"電費"+"\t\t"+"水費"+"\t\t"+"人工費"+"\t\t"+"食品費");for (Cost cost : list) {System.out.println(cost);}}}(3)DingtableService
package com.wyj.mhl.service;import com.wyj.mhl.dao.DingTableDAO; import com.wyj.mhl.domain.diningTable;import java.util.List;/*** 業(yè)務(wù)層:提供方法顯示餐桌的狀態(tài)**/ public class DiningTableService {private DingTableDAO dingTableDAO = new DingTableDAO();//1.顯示餐桌的狀態(tài)public void showDiningTable(){List<diningTable> list = dingTableDAO.queryMulti("select * from diningTable",diningTable.class );System.out.println("餐桌編號"+"\t\t"+"餐桌狀態(tài)");for (diningTable diningTable : list) {System.out.println(diningTable);}}//2.預(yù)定餐桌/*** 功能:* 請選擇要預(yù)定餐桌編號(-1退出):* 預(yù)定人名字:* 預(yù)定人電話:* 確認(rèn)是否預(yù)定(Y/N):** 注意的問題:* 1.輸入的餐桌編號是否存在的編號* 2.餐桌是否被預(yù)定*/public int book_table(int idd,String name,String phone){int update;//查詢要預(yù)定餐桌的狀態(tài)(看是否被預(yù)定)Object scalar = dingTableDAO.queryScalar("select state from diningTable where id = ?", idd);//查看是否存在diningTable table = dingTableDAO.querySingle("select * from diningTable where id = ?", diningTable.class, idd);if(table == null ){System.out.println("====輸入的idd號不存在,請重新輸入====");update = 0;return update;}else if(scalar.equals("已預(yù)定")){update = 0;System.out.println("====進(jìn)預(yù)定的餐桌號已經(jīng)被預(yù)定了,請重新選擇!====");return update;}else {update = dingTableDAO.update("update diningTable " +"set state = ? ,orderName = ?,orderTel = ? " +"where id = ?", "已預(yù)定", name, phone, idd);}return update;}//為billservice提供更新狀態(tài)的方法public boolean updatestate(int id,String state){int i = dingTableDAO.update("update diningTable set state = ? where id = ?", state, id);if(i < 0)return false;return true;}//顯示判斷餐桌是否為存在public diningTable isEmpty(int id){diningTable table = dingTableDAO.querySingle("select * from diningTable where id = ?", diningTable.class, id);return table;}}(4):EmployeeService
package com.wyj.mhl.service;import com.wyj.mhl.dao.EmployeeDAO; import com.wyj.mhl.domain.Employee;import java.util.List;/*** 業(yè)務(wù)層:這里通過調(diào)用EmployeeDAO來完成相關(guān)的操作*/public class EmployeeService {public static void main(String[] args) {EmployeeDAO employeeDAO = new EmployeeDAO();List<Employee> list = employeeDAO.queryMulti("select * from employee", Employee.class);for (Employee employee : list) {System.out.println(employee);}}private EmployeeDAO employeeDAO = new EmployeeDAO();/*** 我們在確定用戶輸入的賬號密碼是否正確的時候,并不是拿輸入的數(shù)據(jù)去和數(shù)據(jù)庫中的* 數(shù)據(jù)進(jìn)行比較,而是將輸入的數(shù)據(jù)在數(shù)據(jù)庫尋找,看是否可以找到*///如果返回結(jié)果為空 就是沒查到該數(shù)據(jù)public Employee getEmployeeEmpidandpwd(String empId,String pwd){Employee employee = employeeDAO.querySingle("select * from employee where empId = ? and pwd = md5(?)", Employee.class,empId,pwd);return employee;}}(5):MenuService
package com.wyj.mhl.service;import com.wyj.mhl.dao.MenuDAO; import com.wyj.mhl.domain.Bill; import com.wyj.mhl.domain.Menu;import java.util.List;public class MenuService {public static void main(String[] args) {new MenuService().showMenu();}private MenuDAO menuDAO = new MenuDAO();//顯示菜品public void showMenu(){List<Menu> list = menuDAO.queryMulti("select * from menu", Menu.class);for (Menu menu : list) {System.out.println(menu);}}//通過返回一個menu對象 菜單號來獲取到一行的數(shù)據(jù) 來求取價格public Menu getBillSingleBYid(int menuid){Menu single = menuDAO.querySingle("select * from menu where id = ?", Menu.class, menuid);return single;}//提供方法 來判斷這個菜品是否存在}(6)MulitytableService(這是一個多表)
package com.wyj.mhl.service;import com.wyj.mhl.dao.MulityTableDAO; import com.wyj.mhl.domain.Mulitytable;import java.util.List;public class MulityTableService {private MulityTableDAO mulityTableDAO = new MulityTableDAO();//顯示賬單和菜名public void ShowBillandMenu(){List<Mulitytable> list = mulityTableDAO.queryMulti("select bill.*,food_name,price from bill,menu " +" where bill.menuId = menu.id", Mulitytable.class);for (Mulitytable mulitytable : list) {System.out.println(mulitytable);}}}5.domain(javabain)
(1):BIll
package com.wyj.mhl.domain;import com.sun.org.apache.bcel.internal.generic.IINC;/*** 生成賬單:* id INT PRIMARY KEY AUTO_INCREMENT,-- 自增主鍵* billId VARCHAR(50) NOT NULL DEFAULT'', -- 賬單號* menuId INT NOT NULL DEFAULT 0,-- 菜單編號* nums INT NOT NULL DEFAULT 0,-- 菜的份數(shù)* money DOUBLE NOT NULL DEFAULT 0,-- 花的錢* state VARCHAR(32) NOT NULL DEFAULT '', -- 餐桌的狀態(tài) 結(jié)賬,未結(jié)賬,掛單,現(xiàn)金,支付寶* billdate DATETIME* diningTable INT NOT NULL DEFAULT 0;-- 餐桌號*/ public class Bill {private Integer id;//自增的主鍵private String billId;//賬單號private Integer menuId;//菜單號private Integer nums;//點菜的份數(shù)private Double money;//點菜花的錢private String state;//餐桌的狀態(tài)private Integer diningTable;//餐桌號public Bill() {} //空構(gòu)造器,為后面的(BasicDAO)反射底層的調(diào)用做準(zhǔn)備,public Bill(Integer id, String billId, Integer menuId, Integer nums, Double money, String state,Integer diningTable) {this.id = id;this.billId = billId;this.menuId = menuId;this.nums = nums;this.money = money;this.state = state;this.diningTable = diningTable;}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 String getState() {return state;}public void setState(String state) {this.state = state;}public Integer getDiningTable() {return diningTable;}public void setDiningTable(Integer diningTable) {this.diningTable = diningTable;}@Overridepublic String toString() {System.out.println("就餐號"+"\t"+"賬單單號"+"\t\t"+"菜單號"+"\t"+"點餐的份數(shù)"+"\t"+"金額"+"\t\t"+"狀態(tài)"+"\t\t"+"餐桌號");return id + "\t\t" + billId + "\t\t" + menuId + "\t\t" + nums + "\t\t\t" + money + "\t\t"+state + "\t\t"+diningTable+"\n";} }(2):Cost
package com.wyj.mhl.domain;/*** 成本表:* `date` VARCHAR(32) NOT NULL DEFAULT '',* electricity DOUBLE NOT NULL DEFAULT 0, -- 電費* water DOUBLE NOT NULL DEFAULT 0, -- 水費* people DOUBLE NOT NULL DEFAULT 0, -- 人工費* food DOUBLE NOT NULL DEFAULT 0 -- 食品費**/ public class Cost {private String date;private Double electricity;private Double water;private Double people;private Double food;public Cost(){}public Cost(String date, Double electricity, Double water, Double people, Double food) {this.date = date;this.electricity = electricity;this.water = water;this.people = people;this.food = food;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public Double getElectricity() {return electricity;}public void setElectricity(Double electricity) {this.electricity = electricity;}public Double getWater() {return water;}public void setWater(Double water) {this.water = water;}public Double getPeople() {return people;}public void setPeople(Double people) {this.people = people;}public Double getFood() {return food;}public void setFood(Double food) {this.food = food;}@Overridepublic String toString() {return date+"\t\t"+electricity+"\t\t"+water+"\t\t"+people+"\t\t"+food;} }(3):dingtable
package com.wyj.mhl.domain;/*** 創(chuàng)建餐桌表:顯示餐桌狀態(tài)*/public class diningTable {private Integer id;private String state;//餐桌狀態(tài)private String orderName;//點餐人姓名private String orderTel;//點餐人電話public diningTable() {//反射底層要用到,在DAO層中需要用到反射來獲取類的屬性}public diningTable(Integer id, String state, String orderName, String orderTel) {this.id = id;this.state = state;this.orderName = orderName;this.orderTel = orderTel;}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;}@Overridepublic String toString() {return id+"\t\t\t"+state+"\n";} }(4);Employee
package com.wyj.mhl.domain;/*** id INT PRIMARY KEY AUTO_INCREMENT,* empId VARCHAR(32) NOT NULL DEFAULT '', -- 員工號* pwd CHAR(32) NOT NULL DEFAULT '',-- 加密密碼* `name` VARCHAR(32) NOT NULL DEFAULT '',-- 名字* job VARCHAR(20) NOT NULL DEFAULT '' -- 工作*/ public class Employee {private Integer id;private String empId;private String pwd;private String name;private String job;public Employee(){//無參構(gòu)造器 底層apache-dbutils反射需要}public Employee(Integer id, String empId, String pwd, String name, String job) {this.id = id;this.empId = empId;this.pwd = pwd;this.name = name;this.job = job;}public Integer getId() {return id;}public void setId(Integer 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;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", empId='" + empId + '\'' +", pwd='" + pwd + '\'' +", name='" + name + '\'' +", job='" + job + '\'' +'}'+ "\n";} }(5):Menu
package com.wyj.mhl.domain;/*** javabean:顯示菜單*/ public class Menu {private Integer id;private String food_name;private String food_class;private Double price;public Menu() {}//空構(gòu)造器,反射底層要調(diào)用,在BasicDAO中需要用到public Menu(Integer id, String food_name, String food_class, Double price) {this.id = id;this.food_name = food_name;this.food_class = food_class;this.price = price;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getFood_name() {return food_name;}public void setFood_name(String food_name) {this.food_name = food_name;}public String getFood_class() {return food_class;}public void setFood_class(String food_class) {this.food_class = food_class;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}@Overridepublic String toString() {return id + "\t" + food_name + "\t\t" + food_class + "\t\t" + price+"\n";} }(6):Mulitytable
package com.wyj.mhl.domain;public class Mulitytable {private Integer id;//自增的主鍵private String billId;//賬單號private Integer menuId;//菜單號private Integer nums;//點菜的份數(shù)private Double money;//點菜花的錢private String state;//餐桌的狀態(tài)private Integer diningTable;//餐桌號private String food_name;//菜名//增加每種菜的價格private Double price;public Mulitytable() {}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 String getState() {return state;}public void setState(String state) {this.state = state;}public Integer getDiningTable() {return diningTable;}public void setDiningTable(Integer diningTable) {this.diningTable = diningTable;}public String getFood_name() {return food_name;}public void setFood_name(String food_name) {this.food_name = food_name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}@Overridepublic String toString() {System.out.println("就餐號"+"\t"+"賬單單號"+"\t\t"+"菜單號"+"\t"+"點餐的份數(shù)"+"\t"+"金額"+"\t\t"+"狀態(tài)"+"\t\t"+"餐桌號"+"\t\t"+"菜名"+"\t\t"+"價格");return id + "\t\t" + billId + "\t\t" + menuId + "\t\t" + nums + "\t\t\t" + money + "\t\t"+state + "\t\t"+diningTable+"\t\t"+food_name+"\t\t"+price+"\n";}}6:DAO包
(1):BasicDAO
package com.wyj.mhl.dao;import com.wyj.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;/*** dao的父類Basicdao** @param <T>*/ public class BasicDAO<T>{//可以指定具體類型private QueryRunner qr = new QueryRunner();//開發(fā)dml可以針對任意的表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) {//將編譯異常轉(zhuǎn)換成運行異常throw new RuntimeException(e);} finally {JDBCUtilsBYDruid.close(null,null,connection);}}//返回多個查詢的對象(即查詢結(jié)果返回多行)/**** @param sql:輸入的sql語句* @param clazz:傳入一個類的Class對象,比如Actor.class* @param parameters:給sql語句當(dāng)中的 ?? 進(jìn)行賦值* @return*/public List<T> queryMulti(String sql,Class<T> clazz,Object... parameters) {Connection connection = null;try {connection = JDBCUtilsBYDruid.getConnection();List<T> list = qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);return list;} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtilsBYDruid.close(null, null, connection);}return null;}//查詢單行的結(jié)果public T querySingle(String sql,Class<T> clazz,Object... parameters){Connection connection = null;try {connection = JDBCUtilsBYDruid.getConnection();T query = qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);return query;} catch (SQLException e) {e.printStackTrace();}finally {}return null;}//查詢單個數(shù)據(jù)public Object queryScalar(String sql,Object... paramenters){Connection connection = null;try {connection = JDBCUtilsBYDruid.getConnection();Object query = qr.query(connection, sql, new ScalarHandler<>(), paramenters);return query;} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtilsBYDruid.close(null,null,connection);}return null;}}(2):BillDAO
package com.wyj.mhl.dao;import com.wyj.mhl.domain.Bill;public class BillDAO extends BasicDAO<Bill>{//繼承BasicDAO的一些方法:select,整個表的數(shù)據(jù),單行數(shù)據(jù)(返回一個對象,可以通過get...// 方法獲取到一些屬性),單個數(shù)據(jù),dml操作 }(3):CostDAO
package com.wyj.mhl.dao;import com.wyj.mhl.domain.Cost;public class CostDAO extends BasicDAO<Cost>{/*** 繼承:BasicDAO當(dāng)中的方法* dml 和 select,可以直接輸入sql語句和操作就可以了***/ }(4):DingtableDAO
package com.wyj.mhl.dao;import com.wyj.mhl.domain.diningTable;public class DingTableDAO extends BasicDAO<diningTable>{/*** 直接繼承父類當(dāng)中的方法,供Service層使用*/ }(5):Employee
package com.wyj.mhl.dao;import com.wyj.mhl.domain.Employee;public class EmployeeDAO extends BasicDAO<Employee>{/*** 可以調(diào)用父類當(dāng)中的方法,* 1.查詢的整個表,查詢單行數(shù)據(jù),查詢單個數(shù)據(jù)* 2.dml*/}(6);Menu
package com.wyj.mhl.dao;import com.wyj.mhl.domain.Menu;public class MenuDAO extends BasicDAO<Menu>{/*** 繼承BasicDAO,這樣可以調(diào)用其的方法 select(整個表和單個數(shù)據(jù)和單行數(shù)據(jù)) 和 dml**/}(7):MulityDAO
package com.wyj.mhl.dao;import com.wyj.mhl.domain.Mulitytable;public class MulityTableDAO extends BasicDAO<Mulitytable>{}補(bǔ)充:德魯伊的配置文件(要根據(jù)自己的電腦信息進(jìn)行相應(yīng)的修改)
#key=value driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mhl?rewriteBatchedStatements=true #url=jdbc:mysql://localhost:3306/mhl username=root password=wyj #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五:相關(guān)在數(shù)據(jù)庫中的表
`wyj_dp02`-- 1.創(chuàng)建一個測試表CREATE TABLE text01(id INT KEY AUTO_INCREMENT,`name` VARCHAR(32) );DROP TABLE text01;INSERT INTO text01VALUES(1,'王永杰'),(NULL,'王大爺'),(NULL,'王二爺');SELECT * FROM text01;-- 員工表-- 字段(創(chuàng)建表 employee表(主鍵id, empId,name,pwd,jb等) CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,empId VARCHAR(32) UNIQUE NOT NULL DEFAULT '', -- 員工號pwd CHAR(32) NOT NULL DEFAULT '',-- 加密密碼`name` VARCHAR(32) NOT NULL DEFAULT '',-- 名字job VARCHAR(20) NOT NULL DEFAULT '' -- 工作 );INSERT INTO employeeVALUES(NULL,"9912",MD5("123456"),'王大美','經(jīng)理'),(NULL,"9913",MD5("123456"),'王小美','服務(wù)員'),(NULL,"9914",MD5("123456"),'王大力','收銀員'),(NULL,"9915",MD5("123456"),'王永杰','經(jīng)理');DROP TABLE employee DELETE FROM employeeWHERE id = 6;SELECT * FROM employee; -- 創(chuàng)建diningTable表(id,state,orderName,orderTel)CREATE TABLE diningTable(id INT PRIMARY KEY AUTO_INCREMENT,#自增,表示餐桌編號state VARCHAR(20) NOT NULL DEFAULT'',#餐桌的狀態(tài)orderName VARCHAR(50) NOT NULL DEFAULT'',#預(yù)訂人的名字orderTel VARCHAR (20) NOT NULL DEFAULT ''-- 預(yù)定人的電話 )CHARSET=utf8;INSERT INTO diningTable VALUES(NULL,'空','',''); INSERT INTO diningTable VALUES(NULL,'空','',''); INSERT INTO diningTable VALUES(NULL,'空','','');SELECT * FROM diningTableDROP TABLE diningtableUPDATE diningTable SET state = '已預(yù)定',orderName = "jack",orderTel = "00999"WHERE id = 6; UPDATE diningTable SET state = '空'WHERE id = 1;-- 菜單表 menuCREATE TABLE menu(id INT PRIMARY KEY AUTO_INCREMENT,food_name VARCHAR(32) NOT NULL DEFAULT '', -- 菜品名food_class VARCHAR(32) NOT NULL DEFAULT '',-- 類別price DOUBLE NOT NULL DEFAULT 0.0 );INSERT INTO menuVALUES(1,"八寶飯","主食",10.0),(NULL,"叉燒包","主食",20.0),(NULL,"宮保雞丁","熱菜",20.0),(NULL,"糖醋鯉魚","熱菜",120.0);SELECT * FROM menu;-- 創(chuàng)建賬單表 -- 字段:(id,biilid,menuid,nums,billdate,money,state,diningTable)CREATE TABLE bill(id INT PRIMARY KEY AUTO_INCREMENT,-- 自增主鍵billId VARCHAR(50) NOT NULL DEFAULT'', -- 賬單號menuId INT NOT NULL DEFAULT 0,-- 菜單編號nums INT NOT NULL DEFAULT 0,-- 菜的份數(shù)money DOUBLE NOT NULL DEFAULT 0,-- 花的錢state VARCHAR(32) NOT NULL DEFAULT '', -- 餐桌的狀態(tài) 結(jié)賬,未結(jié)賬,掛單,現(xiàn)金,支付寶billdate DATETIME );ALTER TABLE billADD diningTable INT NOT NULL DEFAULT 0;-- 餐桌號SELECT * FROM bill;DROP TABLE bill;DELETE FROM bill WHERE id = 3;DELETE FROM diningTable WHERE id = 2; SELECT * FROM diningTable;SELECT * FROM menu WHERE id = 1;SELECT * FROM diningTable WHERE id = 1UPDATE bill SET state = "就餐中" WHERE diningTable = 1;SELECT * FROM menu; SELECT * FROM bill;SELECT bill.*,food_nameFROM menu,billWHERE menu.id = bill.menuId;SELECT bill.*,food_name FROM menu,bill WHERE menu.id = bill.menuId-- 成本控制表(date,electricity,water,people,food)CREATE TABLE cost(`date` VARCHAR(32) NOT NULL DEFAULT '',electricity DOUBLE NOT NULL DEFAULT 0, -- 電費water DOUBLE NOT NULL DEFAULT 0, -- 水費people DOUBLE NOT NULL DEFAULT 0, -- 人工費food DOUBLE NOT NULL DEFAULT 0 -- 食品費 );DROP TABLE cost;INSERT INTO costVALUES('2019—12-11',1200,200,3000,4000),('2019—12-12',1300,200,2000,6000),('2019—12-13',1400,400,1000,8000),('2019—12-14',1300,500,4000,2000),('2019—12-15',1400,700,2000,1000);SELECT * FROM cost;SELECT * FROM cost六:總結(jié)
兄弟們滿漢樓是學(xué)完jdbc和mysql后可以用來鞏固你知識的,而且僅僅是在控制臺展示,是比較low的,但學(xué)習(xí)是循序漸進(jìn)的,加油BOY!!!!!,我們共勉,還有的是這是最后一次上傳這么長的碼,太傻了,我以為不多呢,太費時間了,下次直接上傳文件源碼!!!加油加油加油!!!!!!!!!!!!!!!!!!!!!!!!!! 多吃核桃哈哈哈哈哈哈
總結(jié)
以上是生活随笔為你收集整理的满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 粉丝的功效与作用、禁忌和食用方法
 - 下一篇: 麦苗榨汁的功效与作用、禁忌和食用方法