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

数据表与简单Java类的转化

在数据库中提供有若干个数据表,每一张实体数据表实际上都可以描述出一些具体的事物概念,如:雇员信息表、部门信息表。

程序类的定义形式实际上与这些表差别不大,所以在实际开发中,数据表与简单Java类的映射关系如下:

1、数据实体表的设计 = 类的定义

2、表中的字段 = 类的成员属性

3、表的一行记录 = 类的一个实例化对象

4、表的多行记录 = 对象数组。

5、表的外键关联 = 引用关联

image.png
在以上所对象的关系表中,可以发现如下关联存在:

    一个部门有多个雇员;

   一个雇员属于一个部门;

   一个雇员有一个领导;

下面将以上的数据表转化为简单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

一对多映射实例

image.png

按照表的要求将表的结构转化为类结构,同时可以获取如下信息:

获取一个分类的完整信息
可以根据分类获取其对应的所有子分类的信息

完整代码:

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 = 图形图像类图书

多对多实例

image.png

将以上的结构转换为类结构,并且可以获取如下的信息:

获取一个用户访问的所有商品的详细信息
获取一个商品被浏览过的全部的用户信息
对于此时的程序只需要考虑实体表的设计即可,也就是说对于中间的访问记录信息表不要求进行转换处理。只定义两个类即可。

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 = 李四

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353