满汉楼03
5.拓展_多表查询
前面都是对单表进行操作
思考一个问题:如果多表查询怎么处理?例如,查看账单时,希望现实菜品名称
查询的结果从上图变为下图:
- 方案一
由多张表组合查询的的结果,我们仍然可以将其映射成一个Javabean
例如MultTableBean类,该类的属性可以来自多张表的字段,即该类跟多张表进行映射
在这基础上,仍然可以使用之前的想法:在Dao层创建一个新的dao类,该类专门用于多表操作,在service层也创建相应的service类(根据实际情况),供界面层调用等
- 方案二
5.1方案一完成多表查询
以menu表和dill表为例

5.1.1代码实现
1.创建MultiTableBean类
package com.li.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; //增加menu表的字段 private String name; private Double price; public MultiTableBean() { } public MultiTableBean(Integer id, String billId, Integer menuId, Integer nums, Double money, Integer diningTableId, Date billDate, String state, String name, Double price) { this.id = id; this.billId = billId; this.menuId = menuId; this.nums = nums; this.money = money; this.diningTableId = diningTableId; this.billDate = billDate; this.state = state; this.name = name; this.price = 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; } @Override public String toString() { return id + "\t\t" + menuId + "\t\t\t" + name + "\t\t" + price + "\t\t" + nums + "\t\t\t" + money + "\t\t" + diningTableId + "\t\t" + billDate + "\t\t" + state; } }
2.创建MultiTableDAO类
package com.li.mhl.dao; import com.li.mhl.domain.MultiTableBean; /** * @author 李 * @version 1.0 */ public class MultiTableDAO extends BasicDAO{ }
3.修改BillService类
这里为了简单,不再创建MultiTableService,直接在BillService类中增加方法
修改处1:
//定义MultiTableDAO属性 private MultiTableDAO multiTableDAO = new MultiTableDAO();
修改处2:
//改进后的方法--返回所有的账单,提供给View使用 public List list2() { return multiTableDAO.queryMulti("SELECT " + "bill.id,menuId,NAME,price,nums,money,diningTableId,state,billDate " + "FROM bill,menu WHERE menuId=menu.id", MultiTableBean.class); }
4.修改MHLView类
修改处1:在该类中增加方法listBill2()
//显示账单信息-改进 public void listBill2() { List multiTableBeans = billService.list2(); 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\t\t状态"); for (MultiTableBean multiTableBean : multiTableBeans) { System.out.println(multiTableBean); } System.out.println("============显示完毕============"); }
修改处2:在里层循环中调用该方法
5.1.2测试

测试通过
后面想要跟别的表进行关联,只要在MultiTableBean中增加相应的属性字段,修改构造器,并增加相应的get和set方法。在对应的Service类中修改sql语句即可
可以根据业务来拆分MultiTableBean,分为不同的MultiTableBeanxxx
5.1.3细节
-
关于上面的方案,还存在一个问题,javabean的属性名是否一定要和表的列名一致?
答案是:要一致。
原因是:在对查询记录进行封装的时候,要根据列名Xxx来找到对应Javabean的setXxx方法,即根据列名来把列的值设置给Javabean的属性
通过反射来获取类的方法
-
那么新的问题来了->当多表查询的时候,如果存在不同表的列名是一样的情况,怎么解决呢?
答案是给列起别名
在sql语句查询的时候,给重名的列起别名。查询列名变了,根据列名调用的对象的setXxx方法就不会冲突。
6.拓展功能
-
员工信息的字段可能会很多,而且员工数可能也会很多,为了提高效率,可以采用分表设计employee和login

- 其他功能-登录管理,人事管理,统计报表,成本控制等
- 登录管理
- 人事管理--增加、删除、查询、修改员工信息
- 菜谱价格--增加、删除、查询、修改菜品种类、名称
- 成本控制