我正在构建一个数据工具,允许用户构建 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 数组列表进行响应。重载版本允许通过“谓词”映射指定 where 子句谓词。我想我可以检查传递给该方法的 Map 对象元素的类型并正确构建 where 子句(例如
"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String
等等..
其他方法的工作方式与更新方法谓词类似,与重载选择的工作方式类似。
我正在寻求您关于最佳实践、我的想法的缺点的指导(以及您按照自己的方式做事的优点:))。另外,构建一个名为 DB 元素的通用类型是否有意义,该类型接受我希望用作类型输入的所有已知 DB 数据类型,然后在映射/数组列表参数中使用它而不是“对象”类型?
提前致谢!
最佳答案
这确实是一个问题。
首先我不会自己实现这个。 有许多免费的库(Spring、Hibernate) 为您完成此操作,并且以 ORM 的形式更好 ( http://en.wikipedia.org/wiki/Object-relational_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。
关于java - java类设计指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25769236/