day03-2-拓展
满汉楼03
5.拓展_多表查询
前面都是对单表进行操作
思考一个问题:如果多表查询怎么处理?例如,查看账单时,希望现实菜品名称
查询的结果从上图变为下图:
![image-20221021181451199](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021181451199.png)
![image-20221021181508799](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021181508799.png)
- 方案一
由多张表组合查询的的结果,我们仍然可以将其映射成一个Javabean
例如MultTableBean类,该类的属性可以来自多张表的字段,即该类跟多张表进行映射
在这基础上,仍然可以使用之前的想法:在Dao层创建一个新的dao类,该类专门用于多表操作,在service层也创建相应的service类(根据实际情况),供界面层调用等
![](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/%E6%BB%A1%E6%B1%89%E6%A5%BC%E6%A1%86%E6%9E%B6%E5%9B%BE-5-fix.png)
- 方案二
5.1方案一完成多表查询
以menu表和dill表为例
![image-20221021225008865](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021225008865.png)
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 +
" " + menuId +
" " + name +
" " + price +
" " + nums +
" " + money +
" " + diningTableId +
" " + billDate +
" " + 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("
编号 菜品号 菜品名 单价 菜品量 金额 桌号 日期 状态");
for (MultiTableBean multiTableBean : multiTableBeans) {
System.out.println(multiTableBean);
}
System.out.println("============显示完毕============");
}
修改处2:在里层循环中调用该方法
![image-20221021193527324](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021193527324.png)
5.1.2测试
测试通过
后面想要跟别的表进行关联,只要在MultiTableBean中增加相应的属性字段,修改构造器,并增加相应的get和set方法。在对应的Service类中修改sql语句即可
可以根据业务来拆分MultiTableBean,分为不同的MultiTableBeanxxx
5.1.3细节
-
关于上面的方案,还存在一个问题,javabean的属性名是否一定要和表的列名一致?
答案是:要一致。
原因是:在对查询记录进行封装的时候,要根据列名Xxx来找到对应Javabean的setXxx方法,即根据列名来把列的值设置给Javabean的属性
通过反射来获取类的方法
-
那么新的问题来了->当多表查询的时候,如果存在不同表的列名是一样的情况,怎么解决呢?
答案是给列起别名
在sql语句查询的时候,给重名的列起别名。查询列名变了,根据列名调用的对象的setXxx方法就不会冲突。
6.拓展功能
-
员工信息的字段可能会很多,而且员工数可能也会很多,为了提高效率,可以采用分表设计employee和login
- 其他功能-登录管理,人事管理,统计报表,成本控制等
- 登录管理
- 人事管理--增加、删除、查询、修改员工信息
- 菜谱价格--增加、删除、查询、修改菜品种类、名称
- 成本控制
![image-20221021222507062](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021222507062.png)
![image-20221021222637649](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021222637649.png)
![image-20221021222526554](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221021222526554.png)
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制