将关系数据库表关联到Java类的最佳方式是什么?

将关系数据库表关联到Java类的最佳方式是什么?,java,database,class,relational,Java,Database,Class,Relational,我不知道这里是否有人能给我建议;我有一个应用程序,其类如下: 代码: public class Order implements Serializable { private int orderNo; private int customerNo; private date orderDate; public int getOrderNo () { return orderNo; } public int g

我不知道这里是否有人能给我建议;我有一个应用程序,其类如下:

代码:

public class Order implements Serializable { 
    private int orderNo; 
    private int customerNo;    
    private date orderDate; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getCustomerNo () { 
        return customerNo; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    // And so on with set methods. 

} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private int prodID; 

    // Get and set methods for each of the above. 
    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int prodID () { 
        return prodID; 
    } 
    // And so on with set methods. 
}
public class Order implements Serializable { 
    private int orderNo; 
    private Customer;    
    private date orderDate; 
    private ArrayList<OrderLine>lineItems; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public Customer getCustomer () { 
        return Customer; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    public ArrayList<OrderLine> getOrderLines () { 
        return lineItems; 
    } 

    public OrderLine[] getOrderLines () { 
        return lineItems; 
    } 
    // And so on with set methods.     
} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private Product; 

    // Get and set methods for each of the above. 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int getProduct () { 
        return Product; 
    } 
}
这将直接转换为关系表:

订单:订单号、客户号、订单日期 订单行:订单号、行号、数量、产品ID

因此,每个类直接转换为一个数据库表,每个属性都有get和set对

现在我想知道的是,如果在Java web应用程序中,类应该是上面的类还是更像下面的类,其中获取返回对象:

代码:

public class Order implements Serializable { 
    private int orderNo; 
    private int customerNo;    
    private date orderDate; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getCustomerNo () { 
        return customerNo; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    // And so on with set methods. 

} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private int prodID; 

    // Get and set methods for each of the above. 
    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int prodID () { 
        return prodID; 
    } 
    // And so on with set methods. 
}
public class Order implements Serializable { 
    private int orderNo; 
    private Customer;    
    private date orderDate; 
    private ArrayList<OrderLine>lineItems; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public Customer getCustomer () { 
        return Customer; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    public ArrayList<OrderLine> getOrderLines () { 
        return lineItems; 
    } 

    public OrderLine[] getOrderLines () { 
        return lineItems; 
    } 
    // And so on with set methods.     
} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private Product; 

    // Get and set methods for each of the above. 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int getProduct () { 
        return Product; 
    } 
}
公共类顺序实现可序列化{
私人int订单号;
私人客户;
私有日期orderDate;
私有ArrayListlineItems;
public int getOrderNo(){
退货订单号;
} 
公共客户getCustomer(){
退货客户;
} 
公共日期getOrderDate(){
退货日期;
} 
公共ArrayList getOrderLines(){
返回行项目;
} 
公共医嘱行[]获取医嘱行(){
返回行项目;
} 
//等等,使用set方法。
} 
公共类OrderLine实现可序列化的{
私人int订单号;
私人国际线路号;
私人整数数量;
私人产品;
//获取并设置上述各项的方法。
public int getOrderNo(){
退货订单号;
} 
public int getLineNo(){
返回线路号;
} 
public int getQty(){
退货数量;
} 
public int getProduct(){
退货产品;
} 
}
哪种方法更好?或者,只要处理数据的类正确执行操作,并且系统高效运行,那么采用哪种方法真的很重要吗

谢谢


Morgan先生

绝对没有理由使用第一种形式——在Java代码中使用它会困难得多,而且会导致很多错误

所有合适的O/R映射程序(Hibernate是最流行的一种)都将从DB模式转换为适当的OO对象图,不会出现任何问题


但是,缺点是,为您完成所有这些操作可能会导致您将所有内容都留给或映射器,而它从数据库中获取的数据太多或太少,因此您必须注意缓存以及您的集合是否干净。

如果您的业务对象像这样干净,我建议您使用ORM映射器,如Hibernate或ActiveObjects

如果您更愿意构建自己的数据访问层,我建议让这些类尽可能轻量级。例如,在
Order
中,我将有一个表示外键的
CustomerID
整数字段,而不是
getCustomer()
Order
业务类中返回一个
Customer
对象

诸如
getCustomer()
之类的获取方法可能最好放在另一个类中,例如
CustomerDAO
等,它包含您的数据访问功能


从效率的角度来看,使用哪种方法并不重要,但拥有松散耦合的对象始终是一种良好的做法。

您应该了解一些对象关系映射(ORM)映射工具,如or,或者更简单的查询映射工具,如


我想如果你选择ORM,你会得到更像你的第二个建议。

通常的方法是使用对象关系映射库(ORM)。常见的有:

  • (基于的开源部分)

所有这些都是开源库,并实现了JPA(Java持久性体系结构)标准。

我还鼓励您研究对象关系映射工具(如Hibernate)或更简单的SQL映射工具(如iBatis)。(我在iBatis方面有很好的经验。)

关于对订单及其订单行之间的主-细节关系建模的问题,在Java对象级别上,它们肯定是同一概念层次结构的一部分,因此我会选择将它们建模为包含列表的订单对象。这样,我就可以在我的代码中传递完整的命令,而不必担心丢失部分命令


如果您使用的是像iBatis这样的SQL映射器,您应该在数据库中设置一个Order表和一个OrderLine表,并为iBatis提供一个XML映射,告诉它如何通过将两个SQL表连接在一起来组装复合Java Order/OrderLine对象层次结构。ORM以相反的方式运行,根据您的Java数据模型生成SQL表。

您看过像Hibernate这样的ORM吗?系统使用NetBeans和Java JSP/servlet代码库,并通过Apache服务器作为web服务器使用MySQL后端数据库。+1回答:所有提到ORM映射器的人,特别是Hibernate。这就是我要走的路!就这么简单明了=但是如果第一个表单已经被使用,并且当前工作正常,没有已知的错误,该怎么办?是离开它更好还是重新设计它更好?当前系统有一组数据库访问类,例如,为了获取订单行,调用一个以订单号为参数的方法。如果当前系统很大,运行良好,并且您不打算进行重大更改,则最好保持原样。如果它很小,并且您知道必须对其进行大量扩展,我会花时间切换到使用OR matter。大约25个核心表,其中包含许多动态创建的表,这些表具有不同的列类型,因此这些表不算在内。但可能是25张表格。我将其归类为“中等规模”,因此主要取决于还有多少进一步的开发工作要做。作为一个正在进行的项目,很难说。当前的数据访问层工作得很好,可以很容易地扩展,而无需更改类定义,但我是开放的