数据表与简单Java类的转化
在数据库中提供有若干个数据表,每一张实体数据表实际上都可以描述出一些具体的事物概念,如:雇员信息表、部门信息表。
程序类的定义形式实际上与这些表差别不大,所以在实际开发中,数据表与简单Java类的映射关系如下:
1、数据实体表的设计 = 类的定义
2、表中的字段 = 类的成员属性
3、表的一行记录 = 类的一个实例化对象
4、表的多行记录 = 对象数组。
5、表的外键关联 = 引用关联
在以上所对象的关系表中,可以发现如下关联存在:
一个部门有多个雇员;
一个雇员属于一个部门;
一个雇员有一个领导;
下面将以上的数据表转化为简单Java类的定义形式,在整体代码中要求可以获得如下信息:
根据部门信息获得以下信息:
* 一个部门的完整信息;
* 一个部门中所有雇员的完整信息;
* 一个雇员对应的领导的信息;
根据雇员信息获取一下内容:
* 一个雇员所在部门信息;
* 一个雇员对应的领导信息;
对于数据表与简单Java类直接的映射最好的解决步骤:先抛开所有的关联字段不看,写出类的基本组成,而后再通过引用配置关联字段的关系。
第一步:分别定义Emp、Dept两个实体类
第二步:配置所有的关联字段
雇员有部门;领导是雇员;
private Department dept; //所属部门
private Employee mgr; //所属领导
一个部门有多个雇员
private Employee[] emps; //一个部门有多个雇员
关系配置完成
在进行实际项目开发的过程中一定是分两个步骤实现:
- 第一步:根据表的结构关系进行对象的配置;
- 第二部:根据要求通过结构获取数据
范式:实现项目的开发要求
//第一步:根据关系进行类的定义
//定义出各个的实例对象,此时并没有任何的关联定义
Department dept = new Department(10, "财务部", "上海");
Employee empA = new Employee(7368L, "SMITH", "CLERK", 800.00, 0.0);
Employee empB = new Employee(7569L, "FORD", "MANAGER", 2450.00, 0.0);
Employee empC = new Employee(7566L, "SMITH", "PRESIDENT", 5000.00, 0.0);
//需要为对象进行关联的设置
empA.setDept(dept); //设置雇员A与部门的关联
empB.setDept(dept); //设置雇员B与部门的关联
empC.setDept(dept); //设置雇员C与部门的关联
empA.setMgr(empB); //设置雇员与领导的关联
empB.setMgr(empC); //设置雇员与领导的关联
dept.setEmps(new Employee[] {empA, empB, empC}); //部门与雇员
//第二部:根据关系获取数据
System.out.println(dept.getInfo()); //部门信息
System.out.println();
for (int i = 0; i < dept.getEmps().length; i++) {
System.out.println("\t" + dept.getEmps()[i].getInfo()); //雇员信息
if (dept.getEmps()[i].getMgr() != null) { //当有领导时输出领导信息
System.out.println("\t\t" + dept.getEmps()[i].getMgr().getInfo()); //领导信息
}
}
System.out.println("-------------");
System.out.println(empB.getDept().getInfo()); //根据雇员B获取其部门信息
System.out.println(empB.getMgr().getInfo()); //根据雇员B获取其领导的信息
特别注意:有的雇员是没有领导的,需要做判定。
完整代码:
package 常规类型题;
import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLMessage;
class Department {
private long deptno;
private String dname;
private String loc;
private Employee[] emps; //一个部门有多个雇员
public Department(long deptno, String dname, String loc){
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public void setDeptno(long deptno) {
this.deptno = deptno;
}
public long getDeptno() {
return this.deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getDname() {
return this.dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
public String getLoc() {
return this.loc;
}
public void setEmps(Employee[] emps) {
this.emps = emps;
}
public Employee[] getEmps() {
return this.emps;
}
public String getInfo() {
return "【部门信息】部门编号:" + this.deptno +
",部门名称:" + this.dname +
",部门位置:" + this.loc;
}
}
class Employee {
private long empno;
private String ename;
private String job;
private double sal;
private double comm;
private Department dept; //所属部门
private Employee mgr; //所属领导
public long getEmpno() {
return empno;
}
public void setEmpno(long empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public void setDept(Department dept) {
this.dept = dept;
}
public Department getDept() {
return this.dept;
}
public void setMgr(Employee mgr) {
this.mgr = mgr;
}
public Employee getMgr() {
return this.mgr;
}
public Employee(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.job +
",基本工资:" + this.sal +
",雇员佣金:" + this.comm;
}
}
public class ArrayDemo06 {
public static void main(String[] args) {
//第一步:根据关系进行类的定义
//定义出各个的实例对象,此时并没有任何的关联定义
Department dept = new Department(10, "财务部", "上海");
Employee empA = new Employee(7368L, "SMITH", "CLERK", 800.00, 0.0);
Employee empB = new Employee(7569L, "FORD", "MANAGER", 2450.00, 0.0);
Employee empC = new Employee(7566L, "SMITH", "PRESIDENT", 5000.00, 0.0);
//需要为对象进行关联的设置
empA.setDept(dept); //设置雇员A与部门的关联
empB.setDept(dept); //设置雇员B与部门的关联
empC.setDept(dept); //设置雇员C与部门的关联
empA.setMgr(empB); //设置雇员与领导的关联
empB.setMgr(empC); //设置雇员与领导的关联
dept.setEmps(new Employee[] {empA, empB, empC}); //部门与雇员
//第二部:根据关系获取数据
System.out.println(dept.getInfo()); //部门信息
System.out.println();
for (int i = 0; i < dept.getEmps().length; i++) {
System.out.println("\t" + dept.getEmps()[i].getInfo()); //雇员信息
if (dept.getEmps()[i].getMgr() != null) { //当有领导时输出领导信息
System.out.println("\t\t" + dept.getEmps()[i].getMgr().getInfo()); //领导信息
}
}
System.out.println("-------------");
System.out.println(empB.getDept().getInfo()); //根据雇员B获取其部门信息
System.out.println(empB.getMgr().getInfo()); //根据雇员B获取其领导的信息
}
}
输出结果:
【部门信息】部门编号:10,部门名称:财务部,部门位置:上海
【雇员信息】雇员编号:7368,雇员职位:CLERK,基本工资:800.0,雇员佣金:0.0
【雇员信息】雇员编号:7569,雇员职位:MANAGER,基本工资:2450.0,雇员佣金:0.0
【雇员信息】雇员编号:7569,雇员职位:MANAGER,基本工资:2450.0,雇员佣金:0.0
【雇员信息】雇员编号:7566,雇员职位:PRESIDENT,基本工资:5000.0,雇员佣金:0.0
【雇员信息】雇员编号:7566,雇员职位:PRESIDENT,基本工资:5000.0,雇员佣金:0.0
-------------
【部门信息】部门编号:10,部门名称:财务部,部门位置:上海
【雇员信息】雇员编号:7566,雇员职位:PRESIDENT,基本工资:5000.0,雇员佣金:0.0
一对多映射实例
按照表的要求将表的结构转化为类结构,同时可以获取如下信息:
获取一个分类的完整信息
可以根据分类获取其对应的所有子分类的信息
完整代码:
package 常规类型题;
class Item { //主分类
private long iid;
private String title;
private Subitem[] subitems; //一个主分类下会有多个子分类
public Item(long iid, String title) {
this.iid = iid;
this.title = title;
}
public long getIid() {
return iid;
}
public void setIid(long iid) {
this.iid = iid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
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 slid;
private String title;
private Item item; //一个子分类隶属于一个主分类
public Subitem(long slid, String title) {
this.slid = slid;
this.title = title;
}
public long getSlid() {
return slid;
}
public void setSlid(long slid) {
this.slid = slid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public void setItem(Item item) {
this.item = item;
}
public Item getItem() {
return this.item;
}
public String getInfo() {
return "【子分类信息】iid = " + this.slid +
", title = " + this.title;
}
}
public class ArrayDemo07 {
public static void main(String[] args) {
//第一步:根据结构设置对象数据
Item item = new Item(1L, "图书");
Subitem[] subitems = new Subitem[] {
new Subitem(10L, "编程类图书"),
new Subitem(11L, "图形图像类图书")
};
//设置关系
item.setSubitems(subitems); //一个分类下有多个子分类
for (int i = 0; i < subitems.length; i++) {
subitems[i].setItem(item); //一个子分类有一个主分类
}
//第二步:根据要求获取数据
System.out.println(item.getInfo());
for (int i = 0; i < item.getSubitems().length; i++) {
System.out.println("\t" + item.getSubitems()[i].getInfo());
}
}
}
输出结果:
【分类信息】iid = 1, title = 图书
【子分类信息】iid = 10, title = 编程类图书
【子分类信息】iid = 11, title = 图形图像类图书
多对多实例
将以上的结构转换为类结构,并且可以获取如下的信息:
获取一个用户访问的所有商品的详细信息
获取一个商品被浏览过的全部的用户信息
对于此时的程序只需要考虑实体表的设计即可,也就是说对于中间的访问记录信息表不要求进行转换处理。只定义两个类即可。
package 面向对象;
class Member {
private String mid;
private String name;
private Product[] products; //一个用户有多个商品
public Member(String mid, String name) {
this.mid = mid;
this.name = name;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
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 long getPid() {
return pid;
}
public void setPid(long pid) {
this.pid = pid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public void setMembers(Member[] members) {
this.members = members;
}
public Member[] getMembers() {
return this.members;
}
public String getInfo() {
return "【商品信息】mid = " + this.pid +
",title = " + this.title +
", price = " + this.price;
}
}
public class JavaDemo00 {
public static void main(String[] args) {
//第一步:根据结构设置对象数据
Member memA = new Member("mldn", "张三");
Member memB = new Member("mldnjava", "李四");
Product proA = new Product(1L, "Java开发图书", 78.9);
Product proB = new Product(2L, "小米手机", 3000);
Product proC = new Product(3L, "软件测试图书", 50.4);
//设置关系
memA.setProducts(new Product[] {proA, proB, proC});
memB.setProducts(new Product[] {proA});
proA.setMembers(new Member[] {memA, memB});
proB.setMembers(new Member[] {memB});
proC.setMembers(new Member[] {memA});
//第二步:根据要求获取数据
System.out.println("---------根据用户查看浏览商品信息---------");
System.out.println(memA.getInfo()); //用户信息
for (int i = 0; i < memA.getProducts().length; i++) {
System.out.println("\t" + memA.getProducts()[i].getInfo());
}
System.out.println();
System.out.println("---------根据商品找到被浏览的记录---------");
System.out.println(proA.getInfo());
for (int i = 0; i < proA.getMembers().length; i++) {
System.out.println("\t" + proA.getMembers()[i].getInfo());
}
}
}
输出结果:
---------根据用户查看浏览商品信息---------
【用户信息】mid = mldn,name = 张三
【商品信息】mid = 1,title = Java开发图书, price = 78.9
【商品信息】mid = 2,title = 小米手机, price = 3000.0
【商品信息】mid = 3,title = 软件测试图书, price = 50.4
---------根据商品找到被浏览的记录---------
【商品信息】mid = 1,title = Java开发图书, price = 78.9
【用户信息】mid = mldn,name = 张三
【用户信息】mid = mldnjava,name = 李四