Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DAO设计与数据结构_Java_Database_Dao - Fatal编程技术网

Java DAO设计与数据结构

Java DAO设计与数据结构,java,database,dao,Java,Database,Dao,在我的java应用程序中,我想实现数据库操作的抽象层。我不想将我的应用程序绑定到任何类型的数据库(实现可以是任意的:SQL、XML、基于文档、一堆难看的文本文件等等) 实体之间有许多关系,大多数情况下,这种关系是1对多的 更新和免责声明:虽然示例很简单,但它们只是整个更复杂模型的一部分,很有可能不适合ORM/SQL模型(这两个原因都是因为数据量大:当标准化为关系时,记录数约为数十亿条,以及数据性质的变化)。这里我想问的是如何实现简单的关系,但这并不意味着它们是应用程序的唯一问题。 下面是一个简化

在我的java应用程序中,我想实现数据库操作的抽象层。我不想将我的应用程序绑定到任何类型的数据库(实现可以是任意的:SQL、XML、基于文档、一堆难看的文本文件等等)

实体之间有许多关系,大多数情况下,这种关系是1对多的

更新和免责声明:虽然示例很简单,但它们只是整个更复杂模型的一部分,很有可能不适合ORM/SQL模型(这两个原因都是因为数据量大:当标准化为关系时,记录数约为数十亿条,以及数据性质的变化)。这里我想问的是如何实现简单的关系,但这并不意味着它们是应用程序的唯一问题。

下面是一个简化的示例:

public class Vehicle {
    String mark;
    String model;
    String registrationId;
}

public class Depot {
    String name;
    String address;
}
每个实体都有自己的DAO接口:

public interface VehicleDAO {
    List<Vehicle> getVehicles();
    Vehicle getVehicleByRegistrationId(String registrationId);
}

public interface DepotDAO {
    List<Depot> getDepots();
    Depot getDepotByName(String name);
}
公共接口车辆DAO{
列出车辆();
Vehicle getVehicleByRegistrationId(字符串注册ID);
}
公共接口DepotDAO{
列出getDepot();
Depot getDepotByName(字符串名称);
}
这些DAO也被简化了,只是为了展示一些为特定实体隔离的方法(通过车辆的注册id获取车辆,我不需要知道任何关于其他实体的信息)

现在有趣的部分来了。 车辆段和车辆之间的关系为1对多。所以我必须在实体类和DAO方法中实现这种关系

现在我有两种方法:

  • 仓库
    类中放置
    列表
    属性,并在每次获取
    仓库
    实例时填充它(可能有延迟获取改进)。这样DAO接口就不会改变
  • 车辆段
    车辆
    引入特殊标识符,以便实体类获得额外的整数属性
    int-id并且我们向DAO
    列表getVehiclesForDepot(intDepotID)
    添加了一个方法。这种方法可以通过为标识符引入特殊类而不是普通整数来增强

也许还有其他方法?为实体和设计DAO接口之间的关系建模以保持数据库抽象易于使用且不绑定到任何类型的数据库,最好的方法是什么?我不一定要问完整和精确的解决方案,而是要问解决上述问题时的一些原则。

在您的示例中,如果您使用的方法局限于DAO类型,最好定义一组一致的DAO方法来覆盖这些函数,即

// load object of DAO type T
<T> load(id)
// load objects of DAO type T
List<T> load(List<id>)
// load all objects of DAO type T
List<T> find()
// load multiple objects of DAO type T
List<T> find(relation)
为与作为参数传递的数据持有者对象有关系的实体加载(外部)
id
。然后,您的经理/业务/服务层使用该id列表加载下一组实体,可能通过向id列表传递偏移量和要加载的实体数量来分块

或者,您可以通过添加DAO方法来分离关于关系的知识,以填充另一DAO类型的数据持有者对象中的外部关系:

// fill entity relations for T2 to this DAO tyoe T
void fill(T2)
T::fill()
方法将使用
T2
上的getter获取确定要加载的相关实体(或其
id
)所需的数据,并使用一个或多个setter将该信息存储在
T2
数据持有者对象中


大多数DAO的加载方法都会将关系数据集保留为
null
,以后再加载。这当然意味着他们的数据持有者对象获取者必须能够将
null
值作为契约的一部分来处理。

这被称为重新发明轮子-使用类似Hibernate的ORM。@使用ORM的PetarMinchev违反了不绑定到任何类型数据库的要求之一,然后仅对数据库部分使用ORM。此外,我还没有在实际项目中看到将数据存储从数据库更改为
xml
。很难理解为什么要抽象任何类型的数据源。您是否打算将
Depot
数据源从XML更改为“动态”关系数据源?您的示例似乎只适用于关系数据模型(例如SQL)。我不容易看出XML/文本/文档等是如何适应的。你为什么需要抽象?你应该先解释一下,然后才能期待一个好的答案。我认为关系数据库比
xml
文件或任何其他存储更适合存储大型信息。谢谢!至于泛型——从接口的角度来看,它们是有用的,但是当涉及到特定的实现时,这些方法将变得非常庞大。这是因为不同的实体具有不同的属性。那么,如果(t instanceof X)
,实际实现中不会充斥着检查吗?目前我认为第二种方法(使用id列表来维护关系)是最好的方法。大量的数据只用于一些小的实体子集(车辆的操作数据-对于它们,我可以使用稍微不同的策略),我宁愿坚持使用使设计更简洁的解决方案。@pavel_kazlou,你说得对,不要过多使用泛型。如果您的数据模型支持它,则只使用非泛型接口,只有
long
String
List
和DAO数据持有者类型作为参数。如果加载的列表没有更改,DAO方法可以返回数组If id和数据持有者对象,而不是
List
s。(处理大量数据和内存时会出现问题。)
// fill entity relations for T2 to this DAO tyoe T
void fill(T2)