我正在构建一个允许用户构建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”中元素的类型,使用二维异构元素数组进行响应。重载版本允许通过“谓词”Map指定where子句谓词。我在想,我可以检查传递给方法的Map object元素的类型,并正确地构建where子句。
"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String 以此类推。
其他方法将类似于与重载select类似的update方法谓词的工作。
我正在寻找您对最佳实践的指导,我的想法的缺点(因此,您这样做的好处:)。另外,构建一个名为DB元素的泛型类型,它接受我希望使用的所有已知DB数据类型作为类型输入,然后使用它来代替map/arraylist参数中的"Object“类型,这是否有意义?
提前感谢!
发布于 2014-09-10 15:41:09
嗯,这是个相当大的问题。
首先,我不会亲自执行这一点。有许多免费的库(Spring、Hibernate)为您提供了这些功能,并且以ORM (mapping)的形式做得更好。
如果你真的想自己做这件事,我会这样做:
我将遵循ADO并为我拥有的每个表创建一个类。例如,我会为我的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。
https://stackoverflow.com/questions/25769236
复制相似问题