说明:学习本内容需要对简单Java类及其熟悉


基本概念(综合应用)


根据数据表的结构实现简单Java类。数据库之中提供数据表,实体数据表描述实体概念。程序类的定义与实体表定义差距不大。数据表与简单Java设计关系如下:
1·数据实体表设计=类的定义;
2·表中的字段=类的成员属性;
3·表的外键关联=引用关联;
4·表的一行记录=类的一个实例化对象;
5·表的多行记录=对象数组;

在以后实际项目开发过程中一定是分两步实现;
第一步·根据表的结构关系进行对象配置;
第二步·根据要求通过结构获取数据;
例子:假如现在有一个员工信息表和一个部门信息表。一个员工只属于一个部门,一个部门拥有多个员工,一个员工只有一个领导,领导也是员工。
通过员工,可以获得该员工领导信息和该员工所属部门信息;
通过部门,可以获得该部门所拥有全部员工信息;

代码实现:

//部门类
class Dep{
private long dno;     //定义属性
private String name;
private String place;
private Emp emp[]; //一个部门有多个员工
public Dep(){}   //无参构造方法
public Dep(long dno,String name,String place){   //有参构造方法
   this.dno=dno;
   this.name=name;
   this.place=place;
   }
public void setEmp(Emp []emp){  //set方法
   this.emp=emp;
   }
 public Emp [] getEmp(){   //get方法
   return this.emp;
   }
public String getInfo1(){    //获得全部信息方法
   return +this.dno+"、"+this.name+"、"+this.place;
   } 
}
//员工类
class Emp{
private long eno;
private String name;
private Dep dep; //一个员工属于一个部门
private Emp leader;
 public Emp(){}
 public Emp(long eno,String name) {
 this.eno=eno;
 this.name=name;
}
public void setDep(Dep dep) {
    this.dep=dep;
}
public Dep getDep() {
    return this.dep;
}
public void setLeader(Emp leader) {
    this.leader=leader;
}
public Emp  getLeader() {
    return this.leader;
} 
public String getInfo2() {
    return this.eno+"、"+this.name;
}
}
//主类
 public class yingshe{
public static void main(String args[]){
    Dep dep1 =new Dep(1234,"七宝琉璃宗","天斗帝国");
    Dep dep2 =new Dep(1354,"昊天宗","星罗帝国");
    Emp a=new Emp(1111,"唐三");
    Emp b=new Emp(2222,"戴姆拜");
    Emp c=new Emp(2222,"仍盈盈");
    Emp leader1 =new Emp(1,"大师");
    Emp leader2 =new Emp(2,"柳二龙");
//设置关系:一个员工只属于一个部门
    a.setDep(dep1);
    b.setDep(dep2);
    c.setDep(dep1);
//设置关系:一个部门拥有多个员工
    dep1.setEmp(new Emp[] {a,c});
    dep2.setEmp(new Emp[] {b});
//设置关系:一个员工只有一个领导
    a.setLeader(leader1);
    b.setLeader(leader2);
//输出
    System.out.println("部门dep1信息:"+dep1.getInfo1());//部门dep1信息
    for(int x=0;x<dep1.getEmp().length;x++) {
	    System.out.println("该部门第"+(x+1)+"号员工:"+dep1.getEmp()[x].getInfo2()); //通过部门获得员工信息
	    if(dep1.getEmp()[x].getLeader()!=null) {
	    	System.out.println((x+1)+"号员工领导:"+dep1.getEmp()[x].getLeader().getInfo2()); //通过部门间接获取员工领导信息
	    }else{
		System.out.println((x+1)+"号员工无领导");
	}
}
System.out.println();
System.out.println("部门dep2信息:"+dep2.getInfo1());//部门dep2信息
for(int y=0;y<dep2.getEmp().length;y++) {
	System.out.println("该部门第"+(y+1)+"号员工:"+dep2.getEmp()[y].getInfo2());//通过部门获得员工信息
	if(dep1.getEmp()[y].getLeader()!=null) {
		System.out.println((y+1)+"号员工领导:"+dep2.getEmp()[y].getLeader().getInfo2());//通过部门间接获得员工领导信息
	}else{
		System.out.println((y+1)+"号员工无领导");
	}
}
    System.out.println();
    System.out.println("员工a的领导:"+a.getLeader().getInfo2());//通过员工直接获得领导信息
    System.out.println("员工a的部门:"+a.getDep().getInfo1());//通过员工获得部门信息
  }
}

输出结果:
部门dep1信息:1234、七宝琉璃宗、天斗帝国
该部门第1号员工:1111、唐三
1号员工领导:1、大师
该部门第2号员工:2222、仍盈盈
2号员工无领导
部门dep2信息:1354、昊天宗、星罗帝国
该部门第1号员工:2222、戴姆拜
1号员工领导:2、柳二龙
员工a的领导:1、大师
员工a的部门:1234、七宝琉璃宗、天斗帝国


一对多映射


将上述例题分解,其中部门与职员之间存在一对多关系,即一个部门有多名员工。
通过部门可以获得该部门所有员工的信息;

//部门类
class Dep{
private long dno;
private String name;
private String place;
private Emp emp[]; //一个部门有多个员工
public Dep(){}
public Dep(long dno,String name,String place){
   this.dno=dno;
   this.name=name;
   this.place=place;
   }
public void setEmp(Emp []emp){
   this.emp=emp;
   }
public Emp [] getEmp(){
   return this.emp;
   }
public String getInfo1(){
   return +this.dno+"、"+this.name+"、"+this.place;
   } 
}
//员工类
class Emp{
private long eno;
private String name;
public Emp(){}
public Emp(long eno,String name) {
    this.eno=eno;
    this.name=name;
}
public String getInfo2() {
    return this.eno+"、"+this.name;
}
}
//主类
 public class yingshe{
public static void main(String args[]){
    Dep dep1 =new Dep(1234,"七宝琉璃宗","天斗帝国");
    Emp a []=new Emp [] {new Emp(1111,"唐三"),new Emp(2222,"戴姆拜"),new Emp(2222,"仍盈盈")};
   //设置关系:一个部门拥有多个员工
   dep1.setEmp(a);
   //输出
   System.out.println("部门dep1信息:"+dep1.getInfo1());//部门dep1信息
    for(int x=0;x<dep1.getEmp().length;x++) {
	    System.out.println("该部门第"+(x+1)+"号员工:"+dep1.getEmp()[x].getInfo2()); //通过部门获得员工信息
   }
   }
  }

输出结果:
部门dep1信息:1234、七宝琉璃宗、天斗帝国
该部门第1号员工:1111、唐三
该部门第2号员工:2222、戴姆拜
该部门第3号员工:2222、仍盈盈


多对多映射


顾客去超市购物,一个顾客浏览多个商品,一个商品被多个顾客浏览,顾客和商品之间存在多对多的关系。
通过商品,可以显示其所有浏览过该商品的顾客信息;
通过顾客,可以打印该顾客浏览过的所有商品信息;

class User{
  private long uid;
  private String name;
  private Product product [];
  public User(){}
  public User(long uid,String name){
    this.uid=uid;
    this.name=name;
  }
//getter,setter略
public void setProduct(Product [] product){
    this.product=product;
    }
public Product [] getProduct(){
    return this.product;
    }
public  String getInfo(){
    return  "用户id:"+this.uid+"、用户名:"+this.name;
    }
}
class Product{
  private long pid;
  private String name;
  private double price;
  private User user [];//定义顾客属性
  public Product(){}
public Product(long pid,String name,double price){
   this.pid=pid;
   this.name=name;
   this.price=price;
  }
//getter,setter略
public void setUser(User [] user){
    this.user=user;
    }
public User [] getUser(){
    return this.user;
    }
public String getInfo(){
    return "商品id:"+this.pid+"、商品名称:"+this.name+"、商品价格:"+this.price;
    }
}
public class yingshe{
  public static void main (String args[]){
	//1、设置对象及关系
	User m=new User(123,"盖聂");
	User n=new User(456,"卫庄");
	Product a=new Product(01,"毛巾",10.5);
	Product b=new Product(02,"脸盆",20.0);
	Product c=new Product(03,"牙刷",12.0);
	m.setProduct(new Product [] {a,b,c});
	n.setProduct(new Product [] {a});
	a.setUser(new User [] {m,n});
	b.setUser(new User [] {m});
	c.setUser(new User [] {n});
	//2、获取数据
    System.out.println("**********根据浏览记录显示顾客信息");
    for(int x=0;x<a.getUser().length;x++){
	System.out.println("a商品浏览顾客:"+a.getUser()[x].getInfo());
	}
	for(int x=0;x<b.getUser().length;x++){
	System.out.println("b商品浏览顾客:"+a.getUser()[x].getInfo());
	}
	for(int x=0;x<c.getUser().length;x++){
	System.out.println("c商品浏览顾客:"+c.getUser()[x].getInfo());
	}
	System.out.println("**********根据顾客信息显示浏览记录");
	for(int x=0;x<m.getProduct().length;x++){
	System.out.println("m顾客浏览记录:"+m.getProduct()[x].getInfo());
	}
	for(int y=0;y<=n.getProduct().length-1;y++){
	System.out.println("n顾客浏览记录:"+n.getProduct()[y].getInfo());
	}
}
}

输出结果:
**********根据浏览记录显示顾客信息
a商品浏览顾客:用户id:123、用户名:盖聂
a商品浏览顾客:用户id:456、用户名:卫庄
b商品浏览顾客:用户id:123、用户名:盖聂
c商品浏览顾客:用户id:456、用户名:卫庄
**********根据顾客信息显示浏览记录
m顾客浏览记录:商品id:1、商品名称:毛巾、商品价格:10.5
m顾客浏览记录:商品id:2、商品名称:脸盆、商品价格:20.0
m顾客浏览记录:商品id:3、商品名称:牙刷、商品价格:12.0
n顾客浏览记录:商品id:1、商品名称:毛巾、商品价格:10.5


复杂多对多映射


在进行实际项目国产中,对于用户的授权管理是一项重要的任务,下面为一个常见用户权限管理的表结构设计,基本关系如下:
·一个用户可以拥有多个角色,一个角色可能有多个用户;
·一个角色可以拥有多个权限;

要求实现如下功能:
·根据一个用户找到该用户所对应的所有角色,以及每一个角色所对应的权限信息;
·根据一个角色找到该角色下的所有权限,以及拥有此角色的全部用户信息;
·根据一个权限找到具备此权限的所有用户。

//用户类
class User{
private long uid;
private String uname;
private Role roles[];  //角色
public User(){}
public User(long uid,String uname){  //有参构造
this.uid=uid;
this.uname=uname;
}
//setter,getter略
public void setRoles(Role roles[]){
    this.roles=roles;
    }
public Role [] getRoles(){
    return this.roles;
    }
public String getInfo(){   //用于输出用户信息
    return "用户id:"+this.uid+"、用户名:"+this.uname;
    }
}
//角色类
class Role{
private long rid;
private String rname;
private User users[]; //用户
private	Pri pris[]; //权限
public Role(){}
public Role(long rid,String rname){
this.rid=rid;
this.rname=rname;
}
 //setter,getter略
public void setUsers(User users []){
	this.users=users;
} 
public User [] getUsers(){
    return this.users;
	}
public void setPris(Pri [] pris){
    this.pris=pris;
	}
public Pri [] getPris(){
    return this.pris;
	}
public String getInfo(){
    return "角色id:"+this.rid+"、角色名:"+this.rname;
    }
}
//权限类
class Pri{
private long pid;
private String pname;
private Role roless ;  //角色
public Pri(){}
public Pri(long pid,String pname){
this.pid=pid;
this.pname=pname;
}
//setter,getter略
public void setRoless(Role roless){
    this.roless=roless;
	}
public Role getRoless(){
    return this.roless;
	}
public String getInfo(){
    return "权限id:"+this.pid+"、权限名:"+this.pname;
    }
}
public class Company{
public static void main (String args[]){
	//1、声明对象实例化,设置权限
	User a=new User(1,"温宁");//2个用户
	User b=new User(2,"江城");
	Role x=new Role(101,"岐山");//3个角色
	Role y=new Role(202,"云梦");
	Role z=new Role(303,"兰陵");
	Pri m=new Pri(11,"检察寮");//5个权限
	Pri n=new Pri(22,"炼药房");
	Pri p=new Pri(33,"兵器谱");
	Pri q=new Pri(44,"演武场");
	Pri c=new Pri(55,"太学厅");
	//角色与权限关系:一个角色拥有多个权限
	x.setPris(new Pri [] {m,n});
	y.setPris(new Pri [] {p,q});
	z.setPris(new Pri [] {c});
	//权限与角色关系:一个权限可以被多个角色拥有
	m.setRoless(x);
	n.setRoless(x);
	p.setRoless(y);
	q.setRoless(y);
	c.setRoless(z);
	//用户与角色关系:一个用户拥有多个角色
	a.setRoles(new Role [] {x,y});
	b.setRoles(new Role [] {x,z});
	//角色与用户关系:一个角色有多个用户扮演
    x.setUsers(new User [] {a,b});
	y.setUsers(new User [] {a});
	z.setUsers(new User [] {b});
	//2、获取数据
    System.out.println("通过用户查找信息******************");
	  System.out.println("用户【a】全部信息:"+a.getInfo());
	  for(int d=0; d<a.getRoles().length;d++){
	    System.out.println("用户【a】扮演【"+(d+1)+"】号角色信息:"+a.getRoles()[d].getInfo());
		for (int e=0; e<a.getRoles()[d].getPris().length; e++){
        System.out.println("用户【a】的【"+(d+1)+"】号角色的第【"+(e+1)+"】个权限信息:"+a.getRoles()[d].getPris()[e].getInfo());
		}
	  }
	System.out.println("通过角色查找信息******************");
	System.out.println("角色【x】全部信息:"+x.getInfo());
	for(int f=0;f<x.getPris().length;f++){
		System.out.println("角色【x】的【"+(f+1)+"】号权限信息:"+x.getPris()[f].getInfo());
		}
	for (int g=0;g<x.getUsers().length ; g++){
		System.out.println("角色【x】的第【"+(g+1)+"】用户信息:"+x.getUsers()[g].getInfo());
	    }
    System.out.println("通过权限查找信息*******************");
	System.out.println("权限【m】全部信息:"+m.getInfo());
	System.out.println("权限【m】角色信息:"+m.getRoless().getInfo());
	for (int h=0;h<m.getRoless().getUsers().length ;h++ ){
		System.out.println("权限【m】所对应的角色对应的第【"+(h+1)+"】个用户信息为;"+m.getRoless().getUsers()[h].getInfo());
	}
}
}

输出结果:
通过用户查找信息******************
用户【a】全部信息:用户id:1、用户名:温宁
用户【a】扮演【1】号角色信息:角色id:101、角色名:岐山
用户【a】的【1】号角色的第【1】个权限信息:权限id:11、权限名:检察寮
用户【a】的【1】号角色的第【2】个权限信息:权限id:22、权限名:炼药房
用户【a】扮演【2】号角色信息:角色id:202、角色名:云梦
用户【a】的【2】号角色的第【1】个权限信息:权限id:33、权限名:兵器谱
用户【a】的【2】号角色的第【2】个权限信息:权限id:44、权限名:演武场
通过角色查找信息******************
角色【x】全部信息:角色id:101、角色名:岐山
角色【x】的【1】号权限信息:权限id:11、权限名:检察寮
角色【x】的【2】号权限信息:权限id:22、权限名:炼药房
角色【x】的第【1】用户信息:用户id:1、用户名:温宁
角色【x】的第【2】用户信息:用户id:2、用户名:江城
通过权限查找信息*******************
权限【m】全部信息:权限id:11、权限名:检察寮
权限【m】角色信息:角色id:101、角色名:岐山
权限【m】所对应的角色对应的第【1】个用户信息为;用户id:1、用户名:温宁
权限【m】所对应的角色对应的第【2】个用户信息为;用户id:2、用户名:江城