关于java类设计的指导

时间:2014-09-10 15:21:49

标签: java class design-patterns

我正在构建一个允许用户构建ETL代码的数据工具。在了解这个问题之前,我需要构建一个“代理”来处理该工具需要执行的所有数据库相关工作。具体来说,这将涉及 -

  • 选择,插入,更新和删除
  • 多条记录
  • 从/到/在具有不同布局的不同表格中

我的想法是用以下4种方法构建一个类 -

ArrayList[][] selectFromRepository  (String dbTable, String[] columnNames)
ArrayList[][] selectFromRepository  (String dbTable, String[] columnNames, Map<String, Object> predicate) 
void          insertToRepository    (String dbTable, Map<String, Object>[] payload)
void          updateInRepository    (String dbTable, Map<String, Object>[] payload, Map<String,Object>[] predicate)
void          deleteFromRepository  (String dbTable, Map<String, Object>[] payload)

selectFromRepository将根据从参数“dbTable”中检索到的“columnNames”中的元素类型,使用异构元素的2D arraylist进行响应。重载版本允许通过“谓词”Map指定where子句谓词。我想我可以检查传递给方法的Map对象元素的类型并正确构建where子句(例如

"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String 

依旧......

其他方法与update方法类似,谓词的工作方式类似于重载select。

我正在寻找关于最佳实践的指导,我的想法的缺点(因此你的方式的优点:))。另外,构建一个名为DB元素的泛型类型是否有意义,它接受我希望作为类型输入使用的所有已知DB数据类型,然后在map / arraylist参数中使用它而不是“Object”类型? / p>

提前致谢!

1 个答案:

答案 0 :(得分:3)

嗯,这是个问题。

首先,我不会自己实现这一点。 那里有很多免费的库(Spring,Hibernate) 为你做这件事,并以ORM(http://en.wikipedia.org/wiki/Object-relational_mapping)的形式做得更好。

如果您确实想自己这样做,我就是这样做的:

我会按照ADO为每个表创建一个类。 例如,我将为Employee表创建Employee类。

然后我会创建一个查询构建器,例如:

QueryBuilder
    .selectFrom(Employee.class)
    .equalTo(propery, value)
    .graterThenOrEqualTo(property, value);

我的属性看起来像这样:

interface Property<From, To>{
    To get(From from);
}

所以例如:

class EmployeeToId<Employee, Integer>{
    public Integer get(Employee emp){
        return emp.id;
    }
}

所以在我的前例中:

QueryBuilder
    .selectFrom(Employee.class)
    .equalTo(new EmployeeToId(), 15)
    .build().fetch(); // This returns an Optional<Collection<Employee>>;

我的查询构建器将有一些数字方法,例如:

class QueryBuilder{
   public <Entity> SelectBuilder<Entity> selectFrom(Class<Entity> clazz);
}

这只是它的主旨。 你可以随心所欲地制作它。 但为了使它好,这需要很多时间,只需要问hibernate或jooq。