阿里云【名师课堂】Java面向对象开发41:【第03个代码模型】综合案例:数据表与简单Java类(一对多)

阿里云【名师课堂】Java面向对象开发41:【第03个代码模型】综合案例:数据表与简单Java类(一对多)

一对多

要求程序描述出如下的对应关系

  • 一个部门有多个雇员,并且可以输出一个部门的完整信息(包括雇员信息);
  • 可以根据一个雇员找到雇员对应的领导信息和雇员所在的部门信息。

既然是数据表与简单Java类,有如下要求(实际开发中的简单Java类的设计原则):

  • 简单Java类的名称 = 实体表名称;
  • 简单Java类的属性 = 实体表的字段;
  • 简单Java类的一个对象 = 表的一行记录;
  • 对象数组 = 表的多行记录;
  • 外键关系 = 引用配置。

1、先将所有的基础字段转化为类。

class Emp{
	private int eid ;
	private String ename ;
	private String job ;
	private double sal ;
	private double comm ;
	
	public Emp(int eid,String ename,String job,double sal,double comm) {
		this.eid = eid ;
		this.ename = ename ;
		this.job = job ;
		this.sal = sal ;
		this.comm = comm ;
	}
	
	public String getInfo() {  // 返回类完整信息的方法,觉得混淆可以写getEmpInfo()
		return "【EMP】id = " + this.eid + ",name = " + this.ename + 
		",job = " + this.job + ",salary = " + this.sal + ",commission = " + this.comm ;
	}
}

class Dept{
	private int did ;
	private String dname ;
	private String loc ;
	
	public Dept(int did,String dname,String loc) {
		this.did = did ;
		this.dname = dname ;
		this.loc = loc ;
	}
	
	public String getInfo() {  // 返回类完整信息的方法,觉得混淆可以写getDeptInfo()
		return "【DEPT】id = " + this.did + ",name = " + this.dname + 
		",location = " + this.loc ;
	}
}

2、然后进行关系设计,列出数据表中对应的关系

  • 一个雇员属于一个部门,需要追加部门引用;
  • 一个雇员有一个领导,领导一定是自身关联,自身引用。
  • 一个部门有多个雇员,需要一个对象数组来描述多个雇员信息。

在Emp类中加入:

	private Emp mgr ;  // 描述雇员的领导
	private Dept dept ;  // 描述雇员所在部门
	
	public void setMgr(Emp mgr){
		this.mgr = mgr ;
	}
	public Emp getMgr(){
		return this.mgr ;
	}
	public void setDept(Dept dept){
		this.dept = dept ;
	}
	public Dept getDept(){
		return this.dept ;
	}

在Dept类中加入:

	private Emp [] emps	;

	public void setEmps(Emp [] emps){
		this.emps = emps ;
	}
	public Emp[] getEmps(){
		return this.emps ;
	}

3、最后根据开发需求设计

  • 一个部门有多个雇员,并且可以输出一个部门的完整信息(包括雇员信息);
  • 可以根据一个雇员找到雇员对应的领导信息和雇员所在的部门信息。
class Emp{
	private int eid ;  // 员工工号
	private String ename ;  // 员工姓名
	private String job ;  // 职位
	private double sal ;  // 薪水
	private double comm ;  // 佣金
	private Emp mgr ;  // 描述雇员的领导
	private Dept dept ;  // 描述雇员所在部门
	
	public Emp(int eid,String ename,String job,double sal,double comm) {
		this.eid = eid ;
		this.ename = ename ;
		this.job = job ;
		this.sal = sal ;
		this.comm = comm ;
	}
	
	public void setMgr(Emp mgr){
		this.mgr = mgr ;
	}
	public Emp getMgr(){
		return this.mgr ;
	}
	public void setDept(Dept dept){
		this.dept = dept ;
	}
	public Dept getDept(){
		return this.dept ;
	}
	public String getInfo() {  // 返回类完整信息的方法,觉得混淆可以写getEmpInfo()
		return "【EMP】id = " + this.eid + ",name = " + this.ename + 
		",job = " + this.job + ",salary = " + this.sal + ",commission = " + this.comm ;
	}
}

class Dept{
	private int did ;  // 部门编号
	private String dname ;  // 部门名称
	private String loc ;  // 所在位置
	private Emp[] emps	;
	
	public Dept(int did,String dname,String loc) {
		this.did = did ;
		this.dname = dname ;
		this.loc = loc ;
	}
	
	public void setEmps(Emp[] emps){
		this.emps = emps ;
	}
	public Emp[] getEmps(){  // 注意这里返回值是数组,输出时使用for循环
		return this.emps ;
	}
	public String getInfo() {  // 返回类完整信息的方法,觉得混淆可以写getDeptInfo()
		return "【DEPT】id = " + this.did + ",name = " + this.dname + 
		",location = " + this.loc ;
	}
}

public class TestDemo {  // 设置开发需求
	public static void main(String args[]) {
		// 第一步:设置类对象间的关系
		
		// 1、分别创建各类的实例化对象
		Dept depta = new Dept(10,"ACCOUNTING","New York") ;
		Emp ema = new Emp(4396,"Dexter","CLERK",800.0,0.0) ;
		Emp emb = new Emp(4728,"Tsukishima Kei","MANAGER",2500.0,0.0) ;
		Emp emc = new Emp(1230,"Toono Takaki","PRESIDENT",4500.0,0.0) ;
		
		// 2、设置对象间的引用关系
		// 2.1 设置雇员与领导的关系
		ema.setMgr(emb) ;  // emb是ema的领导
		emb.setMgr(emc) ;  // emc是emb的领导,emc没有领导
		// 2.2 设置雇员与部门的关系
		ema.setDept(depta) ;
		emb.setDept(depta) ;
		emc.setDept(depta) ;
		// 2.3 设置部门与雇员的关系
		depta.setEmps(new Emp[] {ema,emb,emc}) ;  // Emp[] emps = new Emp[] {ema,emb,emc}
		
		// 第二步:根据关系取出数据
		
		// 3、一个部门有多个雇员,并且可以输出一个部门的完整信息(包括雇员信息)
		System.out.println(depta.getInfo()) ;  // 输出部门的信息
		for(int x= 0 ; x < depta.getEmps().length ; x++){  // 输出部门所有部员的信息
			System.out.println("\t##" + depta.getEmps()[x].getInfo()) ;
			if(depta.getEmps()[x].getMgr() != null){  // 领导不为空(有领导)时输出部员的领导信息
				System.out.println("\t\t@@" + depta.getEmps()[x].getMgr().getInfo()) ;
			}
		}
		System.out.println("===============================================================") ;
		
		// 4、可以根据一个雇员找到雇员对应的领导信息和雇员所在的部门信息
		System.out.println(ema.getInfo()) ;  // 输出雇员(任意一个)的信息
		if(ema.getMgr() != null){  // 领导不为空(有领导)时输出部员的领导信息
			System.out.println("\t##" + ema.getMgr().getInfo()) ;
		}
		if(ema.getDept() != null){  // 部门不为空(有部门)时输出部员的部门信息
			System.out.println("\t\t@@" + ema.getDept().getInfo()) ;
		}
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值