数据表与简单Java类映射关系
数据实体表的定义 类似 类的定义
- 表中的字段 = 类的成员属性
- 表的一条记录 = 类的实例化对象
- 表的多行记录 = 对象数组
- 表的外键关联 = 引用关联
在以上所对应数据表的关系之中可以发现有如下关联:
- 一个部门有多个雇员
- 一个雇员属于一个部门
- 一个雇员有一个领导
下面将以上的数据表转化为简单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
复杂多对多映射