说明:学习本内容需要对简单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、用户名:江城