对于如上的关系表,现在要求实现如下的数据关联:
- 一个部门有多个雇员
- 一个雇员有一个或零个领导
部门表(dept):部门编号(deptno)、部门名称(dname)、部门位置(loc);
雇员表(emp):雇员编号(empno)、姓名(ename)、职位(job)、工资(sal)、佣金(comm)、领导编号(mgr)、部门编号(deptno)
例.代码实现
class Dept{
private int deptno;
private String dname;
private String loc;
private Emp emps[];
public Dept(int deptno,String dname,String loc){
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public void setEmps(Emp emps[]){
this.emps = emps;
}
public Emp[] getEmps(){
return emps;
}
public String getInfo(){
return "部门编号:" + this.deptno + "; 名称:" + this.dname + "; 位置:" + this.loc;
}
}
class Emp{
private int empno;
private String ename;
private String job;
private double sal;
private double comm;
private Dept dept;
private Emp mgr; //表示雇员对应的领导
public Emp(int empno,String ename,String job,double sal,double comm){
this.empno = empno;
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(){
return "雇员编号:" + this.empno + "; 姓名:" + this.ename + "; 职位:" + this.job
+ "; 工资:" + this.sal + "; 佣金:" + this.comm;
}
}
本程序中可以发现Emp类和Dept类中存在如下引用关系:
- 一个雇员属于一个部门,应该在雇员里面保存部门信息,因此在Emp类中定义一个dept属性,如果有部门则设置一个Dept类的实例化对象,否则设置为null;
- 一个部门有多个雇员,要描述这个概念,应该使用对象数组完成,因此在Dept类中设置一个Emp类的对象数组;
- 一个雇员有一个领导,领导信息也是雇员信息,因此在Emp类中增加领导的自身关联
例.设置并取得数据
public class TestDemo{
public static void main(String args[]){
//一、根据表结构描述设置数据
//1.产生各自的独立的对象
Dept dept = new Dept(10,"ACCOUNTING","NEW YORK");
Emp ea = new Emp(7369,"SMITH","CLERK",800.0,0.0);
Emp eb = new Emp(7902,"FORD","MANAGER",2450.0,0.0);
Emp ec = new Emp(7839,"KING","PRESIDENT",50000.0,0.0);
//2.设置雇员和领导关系
ea.setMgr(eb);
eb.setMgr(ec);
//3.设置雇员和部门关系
ea.setDept(dept);
eb.setDept(dept);
ec.setDept(dept);
dept.setEmps(new Emp[]{ea,eb,ec});
//二、根据表结构描述取得设置的数据
System.out.println(ea.getInfo()); //取得雇员信息
System.out.println("\t|-" + ea.getMgr().getInfo()); //取得雇员领导信息
System.out.println("\t|-" + ea.getDept().getInfo());//取得雇员部门信息
//取得部门完整信息,包括部门基础信息和部门中的所有员工和每个员工的领导信息
System.out.println(dept.getInfo());
for(int x=0;x<dept.getEmps().length;x++){
System.out.println("\t|-" + dept.getEmps()[x].getInfo());
if (dept.getEmps()[x].getMgr() != null){
System.out.println("\t\t|-" +
dept.getEmps()[x].getMgr().getInfo());
}
}
}
}
雇员编号:7369; 姓名:SMITH; 职位:CLERK; 工资:800.0; 佣金:0.0
|-雇员编号:7902; 姓名:FORD; 职位:MANAGER; 工资:2450.0; 佣金:0.0
|-部门编号:10; 名称:ACCOUNTING; 位置:NEW YORK
部门编号:10; 名称:ACCOUNTING; 位置:NEW YORK
|-雇员编号:7369; 姓名:SMITH; 职位:CLERK; 工资:800.0; 佣金:0.0
|-雇员编号:7902; 姓名:FORD; 职位:MANAGER; 工资:2450.0; 佣金:0.0
|-雇员编号:7902; 姓名:FORD; 职位:MANAGER; 工资:2450.0; 佣金:0.0
|-雇员编号:7839; 姓名:KING; 职位:PRESIDENT; 工资:50000.0; 佣金:0.0
|-雇员编号:7839; 姓名:KING; 职位:PRESIDENT; 工资:50000.0; 佣金:0.0
本程序首先根据表的结构进行数据以及数据关联的配置,然后在数据取出时会根据表的结构进行取出;例如:通过部门可以找到对应的领导和所在部门,以及通过部门可以找到部门中的所有雇员