我正在构建一个允许用户构建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>
提前致谢!
答案 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。