数据表与简单Java类映射转换
简单Java类是面向对象设计的主要分析基础,实际开发中,简单Java类的定义来源是有依据的,是根据数据表的结构来实现简单Java类。
在数据库中实际提供有若干的数据表,每一张实体数据表实际上都可以描述一些具体的事物概念。例如:雇员信息表,部门信息表一看就知道描述的是雇员或者部门信息。
实际项目开发中数据表与简单Java类映射关系如下:
数据是实体表设计 = 类的定义; 表的字段 = 类的成员属性; 表的外键关联 = 引用关联; 表的一行记录 = 类的一个实例化对象‘ 表的多行记录 = 对象数组;观察上述数据表,可以发现有如下的关联:
一个部门有多个雇员; 一个雇员属于一个部门; 一个雇员有一个领导;将以上的数据表转换为简单Java类的定义:
//根据部门信息获得以下内容: 一个部门的完整信息; 一个部门之中所有雇员的完整信息; 一个雇员对应的领导的信息; //根据雇员信息获取以下内容: 一个雇员所在部门信息; 一个雇员对应的领导信息;核心思想:
先抛开所有的关联字段不看,写出类的基本组成,然后再通过引用配置关联字段的关系
第一步:分别定义Emp和Dept两个实体类
class Dept { private long deptno ; private String dname ; private String loc ; public Dept(long deptno,String dname,String loc) { this.deptno = deptno ; this.dname = dname ; this.loc = loc ; } // setter、getter、无参构造略 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 ; 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 ; } // setter、getter、无参构造略 public String getInfo() { return "【雇员信息】雇员编号 = " + this.empno + "、雇员姓名 = " + this.ename + "、雇员职位 = " + this.job + "、基本工资 = " + this.sal + "、佣金 = " + this.comm ; } }第二步:配置所有的关联字段
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 ; } // setter、getter、无参构造略 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 ; } // setter、getter、无参构造略 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 ; } }总结上述:
第一步:根据表的结构关系进行对象的配置; 第二步:根据要求通过结构获取数据;
具体实现如下:
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 ; } // setter、getter、无参构造略 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 ; } // setter、getter、无参构造略 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 class JavaDemo { public static void main(String args[]) { // 第一步:根据关系进行类的定义 // 定义出各个的实例化对象,此时并没有任何的关联定义 Dept dept = new Dept(10,"财务部","上海") ; 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(empB.getDept().getInfo()) ; // 根据雇员获取部门信息 System.out.println(empB.getMgr().getInfo()) ; // 根据雇员获取领导信息 } }实际开发中这种转换的定义形式一定要熟练完成。(类似与之前做的项目中EF的codeFirst,Dbfirst,MoudleFirst直接映射)
案例一(一对多)
按照表的结构将表的结构转换成类结构,同时可以获取如下的信息;
根据分类过去==获取对应的所有子分类的信息;
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 "【子分类信息】sid = " + this.sid + "、title = " + this.title ; } } public class JavaDemo { 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 products [] ; public Member(String mid,String name) { this.mid = mid ; this.name = name ; } public void setProducts(Product products []) { this.products = products ; } public Product [] getProducts() { return this.products ; } 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 JavaDemo { public static void main(String args[]) { // 第一步:根据结构设置对象数据 Member memA = new Member("mldn","张三") ; Member memB = new Member("mldnjava","李四") ; Product proA = new Product(1L,"Java开发图书",79.8) ; Product proB = new Product(2L,"非常大的B的耳机",2309.8) ; Product proC = new Product(3L,"小米手机",3000.8) ; memA.setProducts(new Product[] {proA,proB,proC} ) ; memB.setProducts(new Product[] {proA} ) ; proA.setMembers(new Member[] {memA,memB}) ; proB.setMembers(new Member[] {memA}) ; proC.setMembers(new Member[] {memA}) ; // 第二步:根据要求获取数据 System.out.println("--------------- 根据用户查看浏览商品信息 -----------------") ; System.out.println(memA.getInfo()) ; for (int x = 0 ; x < memA.getProducts().length ; x ++) { System.out.println("\t|- " + memA.getProducts()[x].getInfo()) ; } System.out.println("--------------- 根据商品找到被浏览的记录 -----------------") ; System.out.println(proA.getInfo()) ; for (int x = 0 ; x < proA.getMembers().length ; x ++) { System.out.println("\t|- " + proA.getMembers()[x].getInfo()) ; } } }