首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个类似的类高效地执行CRUD操作?

使用多个类似的类高效地执行CRUD操作?
EN

Stack Overflow用户
提问于 2012-12-24 01:28:51
回答 5查看 1.9K关注 0票数 2

我有一个抽象类,我们称之为Vehicle柴油机电气和扩展车辆。这3个类都有自己的方法和变量,以及它们从Vehicle继承的内容。

我想将来自、ElectricGas对象的变量放入数据库中的相同的表中。从Electric创建的记录只会有几个空列,在这些列中,它没有与国民经济对象相同的变量,等等。

我想要创建插入行、更新行和检索行的方法,所有这些方法都接受这些类中的对象作为参数。

我正在寻找解决这个问题的最佳办法,因为我认为我不知道这是什么。到目前为止,我可以想出几个解决办法,但我不喜欢其中任何一个:

  1. 创建以下每种方法中的4种:插入、更新、删除和检索/选择。这将导致重复代码的批量。 AddVehicle(柴油)公共空虚AddVehicle(电力)公共空虚AddVehicle(气体气体)公共电气ViewVehicles()公共柴油ViewVehicle()公共柴油ViewVehicle(柴油)公共空虚RemoveVehicle(柴油)公开空洞RemoveVehicle(电气)公共空虚RemoveVehicle(气体气体)公共空虚UpdateVehicle(柴油)公共空虚UpdateVehicle(电力)公共气体
  2. 创建每个方法以便它可以接受任何对象:(而不是接受任何对象,是否有一种方法可以指定它可以接受的对象列表,但仍然只接受其中的一个对象)?即。公共空隙AddVehicle (柴油、电、电、煤气) 公共目标车辆AddVehicle(目标车辆)公共物体ViewVehicle(目标车辆)公共车辆公共车辆公共
  3. 创建一个“主”类,该类可以包含任何类(柴油、电力或气体),然后传递给insert/update/view/delete方法。(将insert/update/view方法设置为接受此“主”类为参数。)“主”类的不完全构造函数: 公共MasterVehicle(柴油)公共MasterVehicle(电气)公共MasterVehicle(燃气)
  4. 一些正确、更干净、更有意义的其他解决方案。

但是第四种可能是什么呢?

EN

回答 5

Stack Overflow用户

发布于 2012-12-24 01:40:44

关于您的选项2:首先您可以使用Vehicle而不是Object,只要、ElectricE 110GasE 211实现/扩展<代码>E 112VehicleE 213。它应该能胜任这份工作。

另外,备选方案2中的ViewVehicle:

公共物体ViewVehicle(目标车辆)

您可以使用一个泛型方法,以便它总是返回它所进入的相同类型。这里有更多信息:http://docs.oracle.com/javase/tutorial/extra/generics/methods.html,...although,我不清楚为什么要将对象发送到方法,然后从方法返回对象。

票数 1
EN

Stack Overflow用户

发布于 2012-12-24 01:44:34

正如你在问题开始时所说:

我有一节抽象的课,我们称之为“车辆”。柴油、电动和燃气工具类车辆。

因此,车辆是超阶级,柴油、电力和天然气是其专长。

数据库上的表可以反映此布局。

代码语言:javascript
复制
Vehicle (id, brand, price, type) // type could help you selecting electric,gas,diesel

Electric(vehicle_id, volts, amp, ohms, other_specific_stuff)
Gas(vehicle_id, pressure, gas_type, other_specific_stuff) 
Diesel(vehicle_id, other_specific_stuff) 

当您查询您的车辆时,您可以使用左外接。

代码语言:javascript
复制
select * from vehicle as v
    left outer join electric as e on (v.id = e.vehicle_id)
    left outer join gas as g on (v.id = g.vehicle_id)
    left outer join diesel as d on (v.id = d.vehicle_id)

然后使用type字段映射到特定的子类。

在数据库中存储或更新对象时,需要一个方法来存储公共部分:

代码语言:javascript
复制
void update(Vehicle v) { 
    // store v.* in Vehicle table
}

以及存储特定汽车的其余部分的方法。

代码语言:javascript
复制
void update(Electric e) {
    update(v)
    // store e.* on Electric table
}

删除和插入也是一样的。

票数 1
EN

Stack Overflow用户

发布于 2012-12-24 01:46:09

幸运的是,其他人也必须处理这个问题:)

你实际上有两个问题。一个是您所标识的API的设计,另一个是如何处理实际的存储/读取到DB。

至于第一个问题,我会选择第二个选项,因为它最好遵循OO设计原则。但是我不会让这个方法接受一个Object。相反,让它接受Vehicle类型。

对于第二个问题,您可以查看以下链接:实体继承映射策略。即使您不打算使用JPA (或任何ORM框架),这些可能也是您想要研究的策略。

下面是对上述链接中提到的单个表策略的更详细解释。这应该给你一个好主意--> 继承:单一表策略

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14016118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档