好记性不如烂笔头——数据表与简单Java类映射转换

   日期:2020-05-06     浏览:92    评论:0    
核心提示:一、数据表与简单Java类映射转换-实际开发之中,往往根据数据表的结构来实现简单Java类。数据表与java
一、数据表与简单Java类映射转换-
  • 实际开发之中,往往根据数据表的结构来实现简单Java类。
  • 数据表与简单Java类的基本映射关系:
    • 数据实体表设计=类的定义;
    • 表中的字段=类的成员属性;
    • 表的外键关联=引用关联
    • 表的一行记录=类的一个实例化对象;
    • 表的多行记录=对象数组;

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

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

将以上数据表转化为简单Java类的形式,在整体的程序代码中要求可以获得如下信息:

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

对于数据表与简单Java类之间的映射,最好的解决步骤:先抛开所有的关联字段不看,写出类的基本组成;而后再通过引用配置关联字段的关系。

  1. 先定义Dept、Emp;
  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 void setEmps(Emp[] emps){
        this.emps = emps;
    }
    public Emp[] getEmps(){
        return this.emps;
    }

    public String getInfo(){
        return "【部门信息】部门编号:" + this.deptno + "、部门名称:" +
                this.dname + "、部门位置:" + this.loc;
    }
    //setter、getter方法和无参构造略
}
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 void setDept(Dept dept){
        this.dept = dept;
    }
    public void setMgr(Emp mgr){
        this.mgr = mgr;
    }
    public Dept getDept(){
        return this.dept;
    }
    public Emp getMgr(){
        return this.mgr;
    }

    public String getInfo(){
        return "【雇员信息】雇员编号:" + this.empno + "、雇员姓名:" + this.ename +
                "、雇员职位:" + this.job + "、基本工资:" + this.sal + "、佣金:" + this.comm;
    }
    //setter、getter方法和无参构造略

}
public class ArrayDemo {
    public static void main(String[] args) {
        //第一步:根据关系进行类的定义
        //定义出各自的实例化对象,此时并没有任何的关联定义
        Dept dept = new Dept(10,"财务部","上海");
        Emp empA = new Emp(7369L,"张三","办事员",800.00,0.0);
        Emp empB = new Emp(7555L,"李四","管理",8000.00,0.0);
        Emp empC = new Emp(7899L,"王五","总经理",12352.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 Item{
    private long iid;
    private String title;
    private Subitem[] subitems;//一个分类有多个子分类

    public Item(long iid,String title){
        this.iid = iid;
        this.title = title;
    }

    public void setSubitems(Subitem[] subitems){
        this.subitems = subitems;
    }
    public Subitem[] getSubitems(){
        return this.subitems;
    }

    public String getInfo(){
        return "【分类信息】iid:" + this.iid + "、title" + this.title;
    }
}
class Subitem{
    private long sid;
    private String title;
    private Item item;

    public Subitem(long sid,String title){
        this.sid = sid;
        this.title = title;
    }

    public void setItem(Item item){
        this.item = item;
    }
    public Item getItem(){
        return this.item;
    }

    public String getInfo(){
        return "【分类信息】iid:" + this.sid + "、title" + this.title;
    }
}
public class ArrayDemo {
    public static void main(String[] args) {
        //第一步:根据结构设置对象数据
        Item item = new Item(1L,"图书");
        Subitem[] subitems = new Subitem[]{
                new Subitem(10L,"编程类图书"),
                new Subitem(10L,"图形类图书")
        };
        //设置关系
        item.setSubitems(subitems);//一个分类下有多个子分类
        for (int x =0 ; x < subitems.length ; x++){
            subitems[x].setItem(item);
        }
        //第二步:根据要求获取数据
        System.out.println(item.getInfo());
        for (int x = 0 ; x < item.getSubitems().length ; x++){
            System.out.println("\t|-"+item.getSubitems()[x].getInfo());
        }
        
    }
}
三、多对多映射

对于此时的程序只要考虑实体表的设计即可,也就是说对于中间的访问记录信息表不要求进行转换处理。

class Member{//用户
    private String mid;
    private String name;
    private Product[] product;//一个用户可能看过多个商品

    public Member(String mid,String name){
        this.mid = mid;
        this.name = name;
    }
    public void setProduct(Product[] product){
        this.product = product;
    }
    public Product[] getProduct(){
        return this.product;
    }
    public String getInfo(){
        return "【用户信息】mid="+this.mid+"、name:"+this.name;
    }
}
class Product{//商品
    private long pid;
    private String title;
    private double price;
    private Member[] members;//一个商品可能被多个用户看过

    public Product(long pid,String title,double price){
        this.pid = pid;
        this.title = title;
        this.price = price;
    }
    public void setMembers(Member[] members){
        this.members = members;
    }
    public Member[] getMembers(){
        return this.members;
    }
    public String getInfo(){
        return "【商品信息】pid="+this.pid+"、title:"+this.title+"、price:"+this.price;
    }
}
public class ArrayDemo {
    public static void main(String[] args) {
        //第一步:根据结构设置对象数据
        Member memA = new Member("php","张三");
        Member memB = new Member("java","李四");
        Product proA = new Product(1L,"java图书开发",78.5);
        Product proB = new Product(2L,"php图书开发",50.5);
        Product proC = new Product(3L,"javaweb图书开发",100.5);
        //设置关系
        memA.setProduct(new Product[]{proA,proB,proC});//A用户可能看了所有三个商品
        memB.setProduct(new Product[]{proA});//B用户可能只看了A商品
        proA.setMembers(new Member[]{memA,memB});//A商品被A和B用户看了
        proB.setMembers(new Member[]{memA});//B商品只有被A用户看了
        proC.setMembers(new Member[]{memA});//C商品也只有被A用户看了
        //第二步:根据要求获取数据
        System.out.println("------------根据商品找到被哪些用户浏览过的这些用户的信息-------------");
        System.out.println(proA.getInfo());//输出A商品信息
        for (int x = 0 ; x < proA.getMembers().length ; x++){
            //输出A商品被浏览的记录
            System.out.println("\t|-"+proA.getMembers()[x].getInfo());
        }
        System.out.println("------------根据用户查看浏览的商品信息-------------");
        System.out.println(memA.getInfo());//输出A用户信息
        for (int x = 0 ; x < memA.getProduct().length ; x++){
            System.out.println("\t|-"+memA.getProduct()[x].getInfo());
        }
        
    }
}
四、复杂多对多映射

class Member{//用户
   private String mid;
   private String name;
   private Role[] roles;//一个用户有多个角色

   public Member(String mid,String name){
       this.mid = mid;
       this.name = name;
   }
   public void setRole(Role[] role){
       this.roles = role;
   }
   public Role[] getRole(){
       return this.roles;
   }
   public String getInfo(){
       return "【用户信息】mid="+this.mid+"、name:"+this.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 void setMember(Member[] member){
        this.members = member;
    }
    public Member[] getMember(){
        return this.members;
    }
    public void setPrivileges(Privilege[] privileges){
        this.privileges = privileges;
    }
    public Privilege[] getPrivileges(){
        return this.privileges;
    }
    public String getInfo(){
        return "【角色信息】rid="+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 void setRole(Role role){
        this.role = role;
    }
    public Role getRole(){
        return this.role;
    }
    public String getinfo(){
        return "【权限信息】pid="+this.pid+"、title:"+this.title;
    }
}
public class ArrayDemo {
    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 priA = new Privilege(1000L,"系统初始化");
        Privilege priB = new Privilege(1001L,"系统还原");
        Privilege priC = new Privilege(1002L,"系统环境修改");
        Privilege priD = new Privilege(2000L,"备份员工数据");
        Privilege priE = new Privilege(2001L,"备份部门数据");
        Privilege priF = new Privilege(2002L,"备份公文数据");
        Privilege priG = new Privilege(3000L,"增加员工");
        Privilege priH = new Privilege(3001L,"编辑员工");
        Privilege priI = new Privilege(3002L,"浏览员工");
        Privilege priJ = new Privilege(3003L,"员工离职");
        //设置角色与权限的关系
        roleA.setPrivileges(new Privilege[]{priA,priB,priC});
        roleB.setPrivileges(new Privilege[]{priD,priE,priF});
        roleC.setPrivileges(new Privilege[]{priG,priH,priI,priJ});
        //设置权限与角色关系
        priA.setRole(roleA);
        priB.setRole(roleA);
        priC.setRole(roleA);
        priD.setRole(roleB);
        priE.setRole(roleB);
        priF.setRole(roleB);
        priG.setRole(roleC);
        priH.setRole(roleC);
        priI.setRole(roleC);
        priJ.setRole(roleC);
        //设置用户与角色的对应关系
        memA.setRole(new Role[]{roleA,roleB});
        memB.setRole(new Role[]{roleA,roleB,roleC});
        roleA.setMember(new Member[]{memA,memB});
        roleB.setMember(new Member[]{memA,memB});
        roleC.setMember(new Member[]{memB});
        //第二步:根据要求获取数据
        System.out.println("---------根据用户查找信息----------");
        System.out.println(memB.getInfo());//输出B用户信息
        for (int x = 0 ; x < memB.getRole().length ; x++){
            //输出B用户下所有角色信息
            System.out.println("\t|-"+memB.getRole()[x].getInfo());
            for (int y = 0 ; y < memB.getRole()[x].getPrivileges().length ; y++){
                //输出B用户下每个角色对应的所有权限信息
                System.out.println("\t\t|-"+memB.getRole()[x].getPrivileges()[y].getinfo());
            }
        }
        System.out.println("---------根据角色查找信息----------");
        System.out.println(roleB.getInfo());//输出角色B信息
        System.out.println("\t|-浏览此角色下所有权限信息");
        for (int x = 0 ; x < roleB.getPrivileges().length ; x++){
            //输出角色B下所有权限信息
            System.out.println("\t\t|-"+roleB.getPrivileges()[x].getinfo());
        }
        System.out.println("\t|-浏览此角色下所有用户信息");
        for (int x = 0 ; x < roleB.getMember().length ; x++){
            System.out.println("\t\t|-"+roleB.getMember()[x].getInfo());
        }
        System.out.println("---------根据权限查找信息----------");
        System.out.println(priA.getinfo());
        for (int x = 0 ; x < priA.getRole().getMember().length ; x++){
            System.out.println("\t|-"+priA.getRole().getMember()[x].getInfo());
        }
      
    }
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服