现有部门和雇员两个关系表:
数据表之间的对应信息为:

  • 一个部门有多个雇员;
  • 一个雇员属于一个部门;
  • 一个雇员有一个领导;

在简单Java类中实现,要求可以:

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

步骤:

  1. 分别定义Emp、Dept两个实体类
  2. 配置所有的关联字段
class Dept {
    private long deptno;
    private String dname;
    private String loc;
    private Emp emps[]; //多个雇员信息

    public Dept(long deptno, String dname, String loc) {
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }

    public Emp[] getEmps() {
        return emps;
    }

    public void setEmps(Emp[] emps) {
        this.emps = emps;
    }

    public String getInfo() {
        return "【部门信息】部门编号=" + this.deptno + "、部门名称=" + this.dname + "、部门位置=" + this.loc;
    }
}

class Emp {
    private long empno;
    private String ename;
    private String job;
    private double sal;
    private double comm;
    private Dept dept;  //所属部门
    private Emp mgr;    //所属领导

    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 Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public Emp getMgr() {
        return mgr;
    }

    public void setMgr(Emp mgr) {
        this.mgr = mgr;
    }

    public String getInfo() {
        return "【雇员信息】雇员编号=" + this.empno + "、雇员姓名=" + this.ename + "、雇员职位=" + this.job + "、基本工资=" + this.sal + "、佣金" + this.comm;
    }
}

public class JavaDemo {
    public static void main(String[] args) {
        //第一步:根据关系进行类的定义
        //定义处各个的实例化对象,此时并没有任何的关联定义
        Dept dept = new Dept(10, "财务部", "上海");
        Emp empA = new Emp(7369L, "SMITH", "CLERK", 800.00, 0.00);
        Emp empB = new Emp(6867L, "FORD", "MANAGER", 2450, 0.0);
        Emp empC = new Emp(3424L, "KING", "PRESIDENT", 5000.00, 0.0);
        //需要为对象进行关联的设置
        empA.setDept(dept); //设置雇员与部门的关联
        empB.setDept(dept); //设置雇员与部门的关联
        empC.setDept(dept); //设置雇员与部门的关联
        empA.setMgr(empB);  //设置雇员与领导的关联
        empB.setMgr(empC);
        dept.setEmps(new Emp[]{empA, empB, empC});    //部门与雇员的关联
        //第二步:根据关系获取数据
        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());
            }
        }
        System.out.println("----------------------------");
        System.out.println(empB.getDept().getInfo());   //根据雇员获取部门信息
        System.out.println(empB.getMgr().getInfo());    //根据雇员获取领导信息
    }
}

复杂多对多映射

要求实现如下查询功能:

  • 可以根据一个用户找到用户对应的所有角色,以及每一个角色对应的权限信息;
  • 可以根据一个角色找到该角色下的所有权限,以及拥有此角色的全部用户信息;
  • 可以根据一个权限找到具备此权限的所有用户信息。

代码实现:

class Member {
    private String mid;
    private String name;
    private Role roles[];

    public Member(String mid, String name) {
        this.mid = mid;
         = name;
    }

    public Role[] getRoles() {
        return roles;
    }

    public void setRoles(Role[] roles) {
        this.roles = roles;
    }

    public String getInfo() {
        return "【用户信息】id=" + this.mid + "、name=" + ;
    }
}

class Role {
    private long rid;
    private String title;
    private Member members[];
    private Privilege privileges[];

    public Role(long rid, String title) {
        this.rid = rid;
        this.title = title;
    }

    public Privilege[] getPrivileges() {
        return privileges;
    }

    public void setPrivileges(Privilege[] privileges) {
        this.privileges = privileges;
    }

    public Member[] getMembers() {
        return members;
    }

    public void setMembers(Member[] members) {
        this.members = members;
    }

    public String getInfo() {
        return "【角色信息】id=" + this.rid + "、title=" + this.title;
    }
}

class Privilege {
    private long pid;
    private String title;
    private Role role;

    public Privilege(long pid, String title) {
        this.pid = pid;
        this.title = title;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public String getInfo() {
        return "【权限信息】id=" + this.pid + "、title=" + this.title;
    }
}

//一个用户可以拥有多个角色,一个角色可能有多个用户
//一个角色可以拥有多个权限
public class JavaDemo {
    public static void main(String[] args) {
        //第一步:根据结构设置对象信息
        Member memA = new Member("mldn-a", "张三");
        Member memB = new Member("mldn-b", "李四");
        Role roleA = new Role(1L, "系统配置");
        Role roleB = new Role(2L, "备份管理");
        Role roleC = new Role(3L, "人事管理");
        Privilege privilegeA = new Privilege(1000L, "系统初始化");
        Privilege privilegeB = new Privilege(1001L, "系统还原");
        Privilege privilegeC = new Privilege(1002L, "系统环境修改");
        Privilege privilegeD = new Privilege(2000L, "备份员工数据");
        Privilege privilegeE = new Privilege(2001L, "备份部门数据");
        Privilege privilegeF = new Privilege(2002L, "备份公文数据");
        Privilege privilegeG = new Privilege(3000L, "增加员工");
        Privilege privilegeH = new Privilege(3001L, "编辑员工");
        Privilege privilegeI = new Privilege(3002L, "浏览员工");
        Privilege privilegeJ = new Privilege(3003L, "员工离职");
        //增加角色与权限的对应关系
        roleA.setPrivileges(new Privilege[]{privilegeA, privilegeB, privilegeC});
        roleB.setPrivileges(new Privilege[]{privilegeD, privilegeE, privilegeF});
        roleC.setPrivileges(new Privilege[]{privilegeG, privilegeH, privilegeI, privilegeJ});
        //增加权限与角色对应
        privilegeA.setRole(roleA);
        privilegeB.setRole(roleA);
        privilegeC.setRole(roleA);
        privilegeD.setRole(roleB);
        privilegeE.setRole(roleB);
        privilegeF.setRole(roleB);
        privilegeG.setRole(roleC);
        privilegeH.setRole(roleC);
        privilegeI.setRole(roleC);
        privilegeJ.setRole(roleC);
        //增加用户与角色的对应关系
        memA.setRoles(new Role[]{roleA, roleB});
        memB.setRoles(new Role[]{roleA, roleB, roleC});
        roleA.setMembers(new Member[]{memA, memB});
        roleB.setMembers(new Member[]{memA, memB});
        roleC.setMembers(new Member[]{memB});
        //第二步:根据要求获取数据
        System.out.println("-----------根据用户查找信息----------");
        System.out.println(memB.getInfo());
        for (int x = 0; x < memB.getRoles().length; x++) {
            System.out.println("\t|-" + memB.getRoles()[x].getInfo());
            for (int y = 0; y < memB.getRoles()[x].getPrivileges().length; y++) {
                System.out.println("\t\t|-" + memB.getRoles()[x].getPrivileges()[y].getInfo());
            }
        }
        System.out.println("-----------根据角色查找信息----------");
        System.out.println(roleB.getInfo());
        System.out.println("\t|- 浏览此角色下的所有权限信息");
        for (int x = 0; x < roleB.getPrivileges().length; x++) {
            System.out.println("\t\t|-" + roleB.getPrivileges()[x].getInfo());
        }
        System.out.println("\t|- 浏览此角色下的所有用户信息");
        for (int x = 0; x < roleB.getMembers().length; x++) {
            System.out.println("\t\t|-" + roleB.getMembers()[x].getInfo());
        }
        System.out.println("-----------根据权限查找信息----------");
        System.out.println(privilegeA.getInfo());
        for (int x = 0; x < privilegeA.getRole().getMembers().length; x++) {
            System.out.println("\t|-" + privilegeA.getRole().getMembers()[x].getInfo());
        }
    }
}