day03-2-拓展

2022-12-04,

满汉楼03

5.拓展_多表查询

前面都是对单表进行操作

思考一个问题:如果多表查询怎么处理?例如,查看账单时,希望现实菜品名称

查询的结果从上图变为下图:

方案一

由多张表组合查询的的结果,我们仍然可以将其映射成一个Javabean

例如MultTableBean类,该类的属性可以来自多张表的字段,即该类跟多张表进行映射

在这基础上,仍然可以使用之前的想法:在Dao层创建一个新的dao类,该类专门用于多表操作,在service层也创建相应的service类(根据实际情况),供界面层调用等

方案二

DBUtils数据库连接池多表连接查询-CSDN博客

5.1方案一完成多表查询

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<MultiTableBean>{ }
3.修改BillService类

这里为了简单,不再创建MultiTableService,直接在BillService类中增加方法

修改处1:

//定义MultiTableDAO属性
private MultiTableDAO multiTableDAO = new MultiTableDAO();

修改处2:

//改进后的方法--返回所有的账单,提供给View使用
public List<MultiTableBean> 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<MultiTableBean> 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

其他功能-登录管理,人事管理,统计报表,成本控制等

登录管理
人事管理--增加、删除、查询、修改员工信息
菜谱价格--增加、删除、查询、修改菜品种类、名称
成本控制



day03-2-拓展的相关教程结束。

《day03-2-拓展.doc》

下载本文的Word格式文档,以方便收藏与打印。