数据表与简单Java类映射转换

数据表与简单Java类映射转换

  • 简单Java类是现在面向对象设计的主要分析基础,但是对于实际的开发之中简单Java类的定义来源是有依据的,往往都是根据数据表的结构来实现简单Java类。
  • 在数据库之中实际上是提供有若干个数据表的,那么每一张实体数据表都可以描述出一些具体的事物概念。
  • 程序类的定义形式实际上和这些实体表的差别并不大,所以在实际的项目开发之中数据表与简单Java类的基本映射关系如下:
    • 数据实体表设计 = 类的定义;
    • 表中的字段 = 类的成员属性;
    • 表的外键关联 = 引用关联;
    • 表的一行记录 = 类的一个实例化对象 ;
    • 表的多行数据 = 对象数组
部门--雇员关系表(此图来源于李兴华老师)
  • 上图中对应数据表关系:
    • 一个部门有多个雇员
    • 一个雇员属于一个部门
    • 一个雇员有一个领导
/*
  1. 根据部门信息获得以下内容:
    |- 一个部门的完整信息
    |- 一个部门所有雇员的的完整信息
    |- 一个雇员对应的领导信息
  2. 根据雇员信息获得以下内容:
    |- 一个雇员所在的部门信息
    |- 一个雇员对应的领导信息
  对于数据表与简单Java类之间的映射解决步骤:先抛开所有的关联字段不看,写出类的基本组成,而后再通过引用配置关联字段的关系
  第一步:分别定义Emp、Dept两个实体类
  第二步:配置所有关联字段
**/
/*
  第一步:根据表的结构关系进行对象配置
  第二步:根据要求通过结构获取数据
**/
class Dept {
  private long deptno;
  private String dname;
  private String loc;
  private Emp emps [];   //多个雇员信息
  public Dept() {}
  public Dept(long deptno, String dname, String loc) {
    this.deptno = deptno;
    this.dname = dname;
    this.loc = loc;
  }
  public String getInfo() {
    return "【部门信息】部门编号:" + this.deptno + "、【部门信息】部门名称:" + this.dname + "、【部门信息】部门位置:" + this.loc;
  }
  public void setEmps(Emp [] emps) {
    this.emps = emps;
  }
  public Emp [] getEmps() {
    return this.emps;
  }
  public void setDeptno(long deptno) {
    this.deptno = deptno;
  }
  public void setDname(String dname) {
    this.dname = dname;
  }
  public void setLoc(String loc) {
    this.loc = loc;
  }
  public long getDeptno() {
    return this.deptno;
  }
  public String getDname() {
    return this.dname;
  }
  public String getLoc() {
    return 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() {}
  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 getInfo() {
    return "【雇员信息】雇员编号:" + this.empno + "、【雇员信息】雇员姓名:" + this.ename + "、【雇员信息】雇员职位:" + this.job + "、【雇员信息】雇员工资:" + this.sal + "、【雇员信息】雇员佣金:" + this.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 void setEmpne(long empno) {
    this.empno = empno;
  }
  public void setEname(String ename) {
    this.ename = ename;
  }
  public void setJob(String job) {
    this.job = job;
  }
  public void setSal(double sal) {
    this.sal = sal;
  }
  public void setComm(double comm) {
    this.comm = comm;
  }
  public long getEmpno() {
    return this.empno;
  }
  public String getEname() {
    return this.ename;
  }
  public String getJob() {
    return this.job;
  }
  public double getSal() {
    return this.sal;
  }
  public double getComm() {
    return this.comm;
  }
}
public class JavaStudy {
  public static void main(String [] args) {
    //根据关系进行类的定义
    Dept dept = new Dept(10L, "财务部", "上海");
    Emp empA = new Emp(7369L, "SMITH", "CLERK", 800.00, 0.0);
    Emp empB = new Emp(7566L, "FORD", "MANAGER", 2450.00, 0.0);
    Emp empC = new Emp(7839L, "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(empA.getDept().getInfo());
    System.out.println(empA.getMgr().getInfo());
    System.out.println(empB.getDept().getInfo());
    System.out.println(empB.getMgr().getInfo());
    System.out.println(empC.getDept().getInfo());
  }
}

数据表与简单Java类(一对多)

此图来源于李兴华老师
  • 按照表的要求将表的结构转换为类结构,同时可以获取如下信息:
    • 获取一个分类的完整信息;
    • 可以根据分类获取其对应的所有子分类的信息;
class Item {
  private long iid;
  private String title;
  private Subitem subitems [];
  public Item() {}
  public Item(long iid, String title) {
    this.iid = iid;
    this.title = title;
  }
  public String getInfo() {
    return "【分类信息】iid=" + this.iid + "、title=" + this.title;
  }
  public void setSubitems(Subitem subitems []) {
    this.subitems = subitems;
  }
  public void setIid(long iid) {
    this.iid = iid;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public Subitem [] getSubitems() {
    return this.subitems;
  }
  public long getIid() {
    return this.iid;
  }
  public String getTitle() {
    return this.title;
  }
}
class Subitem {
  private long sid;
  private String title;
  private Item item;
  public Subitem() {}
  public Subitem(long sid, String title) {
    this.sid = sid;
    this.title = title;
  }
  public String getInfo() {
    return "【子分类信息】sid=" + this.sid + "、title=" + this.title;
  }
  public void setItem(Item item) {
    this.item = item;
  }
  public void setSid(long sid) {
    this.sid = sid;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public Item getItem() {
    return this.item;
  }
  public long getSid() {
    return this.sid;
  }
  public String getTitle() {
    return this.title;
  }
}
public class JavaStudy {
  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());
    }
  }
}

数据表与简单Java类(多对多)

此图来源于李兴华老师
  • 将以上的结构转换为类结构,并且可以获取如下信息:
    • 获取一个用户访问所有商品的详细信息;
    • 获取一个商品被浏览过的全部用户信息;
class Member {
  private String mid;
  private String name;
  private Product products [];
  public Member() {}
  public Member(String mid, String name) {
    this.mid = mid;
    this.name = name;
  }
  public String getInfo() {
    return "【用户信息】mid:" + this.mid + "、name:" + this.name;
  }
  public void setProducts(Product products []) {
    this.products = products;
  }
  public void setMid(String mid) {
    this.mid = mid;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Product [] getProducts() {
    return this.products;
  }
  public String getMid() {
    return this.mid;
  }
  public String getName(String name) {
    return this.name;
  }
}
class Product {
  private long pid;
  private String title;
  private double price;
  private Member members [];
  public Product() {}
  public Product(long pid, String title, double price) {
    this.pid = pid;
    this.title = title;
    this.price = price;
  }
  public String getInfo() {
    return "【商品信息】pid:" + this.pid + "、商品名称:" + this.title + "、商品价格:" + this.price;
  }
  public void setMembers(Member members []) {
    this.members = members;
  }
  public void setPid(long pid) {
    this.pid = pid;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public void setPrice(double price) {
    this.price = price;
  }
  public Member [] getMembers() {
    return this.members;
  }
  public long getPid() {
    return this.pid;
  }
  public String getTitle() {
    return this.title;
  }
  public double getPrice() {
    return this.price;
  }
}
public class JavaStudy {
  public static void main(String [] args) {
    //根据结构设置对象数据
    Member memberA = new Member("javascript", "张三");
    Member memberB = new Member("java", "李四");
    Product productA = new Product(1L, "Java放弃", 99.9);
    Product productB = new Product(2L, "Java从入门到放弃", 89.8);
    Product productC = new Product(3L, "Java从菜鸟到放弃", 79.7);
    memberA.setProducts(new Product [] {productA, productB});
    memberB.setProducts(new Product [] {productB, productC});
    productA.setMembers(new Member [] {memberA});
    productB.setMembers(new Member [] {memberA, memberB});
    productC.setMembers(new Member [] {memberB});
    //根据要求获取数据
    System.out.println("----------------根据用户查看浏览商品信息-------------------");
    System.out.println(memberA.getInfo());
    for(int x = 0; x < memberA.getProducts().length; x++) {
      System.out.println("\t|-" + memberA.getProducts()[x].getInfo());
    }
    System.out.println("----------------根据商品查看被浏览记录-------------------");
    System.out.println(productA.getInfo());
    for(int x = 0; x < productA.getMembers().length; x++) {
      System.out.println("\t|-" + productA.getMembers()[x].getInfo());
    }
  }
}

数据表与简单Java类(角色与权限)

  • 最常见的用户权限管理的表结构设计:
    • 一个用户可以拥有多个角色,一个角色可以有多个用户;
    • 一个角色可以拥有多个权限;


      此图来源于李兴华老师
  • 要求实现如下功能:
    • 可以根据一个用户找到该用户对应的所有角色,以及每个角色对应的所有权限信息;
    • 可以根据一个角色找到该角色下的所有权限,以及拥有此角色的全部用户信息;
    • 可以根据一个权限找到具备此权限的所有用户信息;
class Member {
  private String mid;
  private String name;
  private Role roles [];
  public Member() {}
  public Member(String mid, String name) {
    this.mid = mid;
    this.name = name;
  }
  public String getInfo() {
    return "【用户信息】mid:" + this.mid + "、name:" + this.name;
  }
  public void setRoles(Role roles []) {
    this.roles = roles;
  }
  public void setMid(String mid) {
    this.mid = mid;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Role [] getRoles() {
    return this.roles;
  }
  public String getMid() {
    return this.mid;
  }
  public String getName() {
    return this.name;
  }
}
class Role {
  private long rid;
  private String title;
  private Member members [];
  private Privilege privileges [];
  public Role() {}
  public Role(long rid, String title) {
    this.rid = rid;
    this.title = title;
  }
  public String getInfo() {
    return "【角色信息】rid:" + this.rid + "、title:" + this.title;
  }
  public void setMembers(Member members []) {
    this.members = members;
  }
  public void setPrivileges(Privilege privileges []) {
    this.privileges = privileges;
  }
  public void setRid(long rid) {
    this.rid = rid;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public Member [] getMembers() {
    return this.members;
  }
  public Privilege [] getPrivileges() {
    return this.privileges;
  }
  public long getRid() {
    return this.rid;
  }
  public String getTitle() {
    return this.title;
  }
}
class Privilege {
  private long pid;
  private String title;
  private Role role;
  public Privilege() {}
  public Privilege(long pid, String title) {
    this.pid = pid;
    this.title = title;
  }
  public String getInfo() {
    return "【权限信息】pid:" + this.pid + "、title:" + this.title;
  }
  public void setRole(Role role) {
    this.role = role;
  }
  public void setPid(long pid) {
    this.pid = pid;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public Role getRole() {
    return this.role;
  }
  public long getPid() {
    return this.pid;
  }
  public String getTitle() {
    return this.title;
  }
}
public class JavaStudy {
  public static void main(String [] args) {
    //根据结构设置对象数据
    Member memberA = new Member("001", "张三");
    Member memberB = new Member("002", "李四");
    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);
    //用户角色关系
    memberA.setRoles(new Role [] {roleA, roleB});
    memberB.setRoles(new Role [] {roleA, roleB, roleC});
    //角色用户关系
    roleA.setMembers(new Member [] {memberA, memberB});
    roleB.setMembers(new Member [] {memberA, memberB});
    roleC.setMembers(new Member [] {memberB});
    //根据要求获取数据
    System.out.println("----------------根据用户查找信息-----------------");
    System.out.println(memberB.getInfo());
    for(int x = 0; x < memberB.getRoles().length; x++) {
      System.out.println("\t|-" + memberB.getRoles() [x].getInfo());
      for(int y = 0; y < memberB.getRoles() [x].getPrivileges().length; y++) {
        System.out.println("\t\t|-" + memberB.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(privilegeB.getInfo());
    for(int x = 0; x < privilegeB.getRole().getMembers().length; x++) {
      System.out.println("\t|-" + privilegeB.getRole().getMembers() [x].getInfo());
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343