数据表与简单Java类映射关系

数据表

数据表与简单Java类映射关系

数据实体表的定义 类似 类的定义

  • 表中的字段 = 类的成员属性
  • 表的一条记录 = 类的实例化对象
  • 表的多行记录 = 对象数组
  • 表的外键关联 = 引用关联

在以上所对应数据表的关系之中可以发现有如下关联:

  1. 一个部门有多个雇员
  2. 一个雇员属于一个部门
  3. 一个雇员有一个领导

下面将以上的数据表转化为简单Java类的定义形式,要求如下:

  • 根据部门信息获得以下内容
    • 一个部门的完整信息
    • 一个部门之中所有雇员的完整信息
    • 一个雇员对应的领导信息
  • 根据雇员信息获以下内容
    • 一个雇员所在的部门信息
    • 一个雇员对应的领导信息

对于数据表与简单Java类的映射,先抛开关联字段,写出类的组成,然后通过引用配置关联字段的关系。

import java.util.Objects;

class Dept{
    private long deptno;
    private String dname;
    private String dloc;
    private Emp[] emps; // 一个部门有多个雇员

    public Dept(long deptno,String dname,String dloc){
        this.deptno = deptno ;
        this.dname = dname;
        this.dloc = dloc;
    }
    public String getInfo(){
        return "-----------\n"+"部门编号:" + this.deptno + "\n部门名称:" + this.dname + "\n部门位置:" + this.dloc +"\n-----------\n"
                ;
    }
    public void setEmp(Emp[] emps){
        this.emps = emps;
    }
    public Emp[] getEmps(){
        return this.emps;
    }
}
class Emp{
    private long empno;
    private String ename;
    private String job;
    private double sal;
    private double comm;
    private Dept dept;
    private Emp leader;

    public Emp(long 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 String getEname() {
        return ename;
    }

    public String getInfo(){
        return  "-----------\n" + "雇员编号:" +this.empno+ "\n姓名:" + this.ename + "\n职位:" + this.job + "\n基本工资:" + this.sal+ "\n佣金:" + this.comm + "\n-----------\n"
                ;
    }
    public void setDept(Dept dept){
        this.dept = dept;
    }
    public Dept getDept(){
        return this.dept;
    }
    public void setLeader(Emp leader){
        this.leader = leader;
    }
    public Emp getLeader(){
        return this.leader;
    }
}


public class JavaDemo {
    public static void main(String[] args) {
        // 根据关系进行类的定义
        // 定义出各个实例化对象
        Dept dept = new Dept(1001,"财务部","上海");
        Emp emp1 = new Emp(101,"ZC","扫地",2000.00,0.00);
        Emp emp2 = new Emp(102,"XQS","拖地",1800.00,0.00);
        Emp emp3 = new Emp(103,"YHX","擦玻璃",1500.00,0.00);
        // 为对象进行关联设置
        emp1.setDept(dept);
        emp2.setDept(dept);
        emp3.setDept(dept);

        emp1.setLeader(emp2);
        emp2.setLeader(emp3);
        dept.setEmp(new Emp[] {emp1,emp2,emp3}); // 部门与雇员
        // 获得部门完整信息
        System.out.println(dept.getInfo());
        // 获得部门中所有雇员的完整信息
        for (Emp emp:dept.getEmps()) {
            System.out.println(emp.getInfo());
            // 雇员所对应的领导信息
            if (!emp.getEname().equals("YHX")){
                System.out.println(emp.getEname() + "的领导信息:");
                System.out.println(emp.getLeader().getInfo());
            }
            else {
                System.out.println(emp.getEname() + "  没有领导");
            }

        }
        // 雇员所在部门信息
        System.out.println("雇员 101 的部门信息为:");
        System.out.println(emp1.getDept().getInfo());

        // 雇员的领导信息
        System.out.println("雇员 101 的领导信息为:");
        System.out.println(emp1.getLeader().getInfo());

    }
}

// 运行结果
-----------
部门编号:1001
部门名称:财务部
部门位置:上海
-----------

-----------
雇员编号:101
姓名:ZC
职位:扫地
基本工资:2000.0
佣金:0.0
-----------

ZC的领导信息:
-----------
雇员编号:102
姓名:XQS
职位:拖地
基本工资:1800.0
佣金:0.0
-----------

-----------
雇员编号:102
姓名:XQS
职位:拖地
基本工资:1800.0
佣金:0.0
-----------

XQS的领导信息:
-----------
雇员编号:103
姓名:YHX
职位:擦玻璃
基本工资:1500.0
佣金:0.0
-----------

-----------
雇员编号:103
姓名:YHX
职位:擦玻璃
基本工资:1500.0
佣金:0.0
-----------

YHX  没有领导
雇员 101 的部门信息为:
-----------
部门编号:1001
部门名称:财务部
部门位置:上海
-----------

雇员 101 的领导信息为:
-----------
雇员编号:102
姓名:XQS
职位:拖地
基本工资:1800.0
佣金:0.0
-----------

Process finished with exit code 0

一对多映射

class Item{
    private long iid;
    private String iname;
    private SubItem[] subitems;
    public Item(long iid,String name){
        this.iid = iid ;
        this.iname = name;
    }
    public String getInfo(){
        return "\tID: " + this.iid + "  类名: " + this.iname;
    }
    public void setSubitems(SubItem[] subitems){
        this.subitems = subitems;
    }
    public SubItem[] getSubitems(){
        return this.subitems;
    }
}

class SubItem{
    private long sid;
    private String sname;
    private Item item;
    public SubItem(long sid,String sname){
        this.sid = sid;
        this.sname = sname;
    }
    public String getInfo(){
        return "\t\tID: " + this.sid + "  子类名: " + this.sname;
    }
    public void setItem(Item item){
        this.item = item;
    }
    public Item getItem(){
        return this.item;
    }
}

public class JavaDemo {
    public static void main(String[] args) {
        // 实例化图书类
        Item item = new Item(1001L,"图书");
        // 实例化 3 个子类JAVA,C++,.NET
        SubItem subItem1 = new SubItem(101,"JAVA");
        SubItem subItem2 = new SubItem(102,"C++");
        SubItem subItem3 = new SubItem(103,".NET");
        // 给图书类设置这 3 个子类
        item.setSubitems(new SubItem[] {subItem1,subItem2,subItem3});
        // 为 3 个子类设置主类
        for (int i =0;i < item.getSubitems().length;i++){
            item.getSubitems()[i].setItem(item);
        }
		// 输出 图书类 信息
        System.out.println(item.getInfo());
        // 输出 子类 信息
        for (int i = 0;i<item.getSubitems().length;i++){
            System.out.println(item.getSubitems()[i].getInfo());
        }

    }
}

// 运行结果

ID: 1001  类名: 图书
		ID: 101  子类名: JAVA
		ID: 102  子类名: C++
		ID: 103  子类名: .NET

多对多映射

class Customer{
    private String cid;
    private String cname;
    private Product[] products;
    Customer(String cid,String cname){
        this.cid = cid;
        this.cname = cname;
    }
    public String getInfo() {
        return "用户ID:" + this.cid + "\t姓名:" + this.cname;
    }
    public void setProduct(Product[] product){
        this.products =product;
    }
    public Product[] getProduct(){
        return this.products;
    }
}

class Product{
    private String pid;
    private String pname;
    private double price;
    private Customer[] customers;
    Product(String pid,String pname,double price){
        this.pid = pid;
        this.pname = pname;
        this.price = price;
    }
    public String getInfo(){
        return "商品ID:"+this.pid + "\t商品名称:" + this.pname + "商品价格:" + this.price;
    }

    public void setCustomers(Customer[] customers) {
        this.customers = customers;
    }

    public Customer[] getCustomers(){
        return this.customers;
    }
}


public class JavaDemo {
    public static void main(String[] args) {
        Customer customerA = new Customer("101","ZC");
        Customer customerB = new Customer("102","XQS");

        Product productA = new Product("1001","iPhone",2000.00);
        Product productB = new Product("1002","HUAWEI",5000.00);
        Product productC = new Product("1003","MI",3000.00);

        customerA.setProduct(new Product[]{productA,productB,productC});
        customerB.setProduct(new Product[]{productA});

        productA.setCustomers(new Customer[]{customerA,customerB});
        productB.setCustomers(new Customer[]{customerA});
        productC.setCustomers(new Customer[]{customerA});

        System.out.println("顾客A浏览过的商品");
        for (int i =0;i<customerA.getProduct().length;i++){  // 顾客A浏览过的商品
            System.out.println(customerA.getProduct()[i].getInfo());
        }
        System.out.println("顾客B浏览过的商品");
        for (int i =0;i<customerB.getProduct().length;i++){  // 顾客A浏览过的商品
            System.out.println(customerB.getProduct()[i].getInfo());
        }
        System.out.println("商品A被以下用户浏览过:");
        for (int j = 0;j<productA.getCustomers().length;j++){
            System.out.println(productA.getCustomers()[j].getInfo());
        }
     }

        // 其他略.....
}


// 运行结果

顾客A浏览过的商品
商品ID:1001	商品名称:iPhone商品价格:2000.0
商品ID:1002	商品名称:HUAWEI商品价格:5000.0
商品ID:1003	商品名称:MI商品价格:3000.0
顾客B浏览过的商品
商品ID:1001	商品名称:iPhone商品价格:2000.0
商品A被以下用户浏览过:
用户ID:101	姓名:ZC
用户ID:102	姓名:XQS

复杂多对多映射

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值