目前,我有十个不同的查询,它们通过JDBC处理,并封装在返回ResultSet的函数中。这些ResultSet对象中的每一个都由外部程序迭代,并将通过它们的索引而不是每个需求的列名来访问。我正在考虑三种方法,并正在寻找当前的最佳实践,以了解如何在尽可能接近纯OO设计的同时处理这一问题。现在我的模式是这样的:
create table Cats
(
name varchar2,
age number,
length number,
location varchar2,
isStray varchar2
);
我的两个问题是这样的:
public ResultSet getAllCats()
{
Select * from Cats;
}
public ResultSet getCatAgeAndName(){
Select cat.age,cat.name from Cats cat
}
现在,我已经考虑了通过ResultSet.getXXX(index);
访问这些属性的方法
如下所示:
public static final int GET_CAT_AGE_AND_NAME_AGE_INDEX = 1;
public static final int GET_CAT_AGE_AND_NAME_NAME_INDEX = 2;
或
public enum GetCatAgeAndNamePosition
{
AGE(1),
NAME(2);
}
或
public class GetCatAgeAndNameQuery
{
public enum Position
{
AGE(1),
NAME(2);
}
private ResultSet results;
}
第一种方法是每个查询的每个索引有一个静态的final
第二个是每个查询的枚举
第三个是每个查询一个类。
以上哪一项或任何其他见解可以保持这种纯粹性和可维护性。
我喜欢使用enum
s。它们增加了灵活性。例如,可以同时提供序号值和列的名称。按名称检索而不是按序号检索应该会使事情更加健壮。对于像SELECT *
这样的查询也会更安全。使用enum
,更容易关联更多信息,例如type
信息。基于表元数据生成这些类是很好的。
我倾向于使用enum
作为服务类的私有成员,该服务类对表、视图或存储过程进行操作。它只在内部用于从关系结构到结果bean的映射。关系结构不需要对外公开,enum
也不需要。对于同一底层结构上的多个相关查询,重用相同的enum
也是很好的。在您的示例中,enum
应该具有表的所有列,并且不同的查询将使用所有或部分列。另一个原因是为什么按名字比按索引更好。