首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java类设计指南

java类设计指南
EN

Stack Overflow用户
提问于 2014-09-10 15:21:48
回答 1查看 73关注 0票数 0

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

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

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

代码语言:javascript
复制
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子句。

代码语言:javascript
复制
"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String 

以此类推。

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

我正在寻找您对最佳实践的指导,我的想法的缺点(因此,您这样做的好处:)。另外,构建一个名为DB元素的泛型类型,它接受我希望使用的所有已知DB数据类型作为类型输入,然后使用它来代替map/arraylist参数中的"Object“类型,这是否有意义?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-10 15:41:09

嗯,这是个相当大的问题。

首先,我不会亲自执行这一点。有许多免费的库(Spring、Hibernate)为您提供了这些功能,并且以ORM (mapping)的形式做得更好。

如果你真的想自己做这件事,我会这样做:

我将遵循ADO并为我拥有的每个表创建一个类。例如,我会为我的Employee表设置类雇员。

然后创建一个查询生成器,如下所示:

代码语言:javascript
复制
QueryBuilder
    .selectFrom(Employee.class)
    .equalTo(propery, value)
    .graterThenOrEqualTo(property, value);

我的财产看起来是这样的:

代码语言:javascript
复制
interface Property<From, To>{
    To get(From from);
}

例如:

代码语言:javascript
复制
class EmployeeToId<Employee, Integer>{
    public Integer get(Employee emp){
        return emp.id;
    }
}

所以在我以前的例子中:

代码语言:javascript
复制
QueryBuilder
    .selectFrom(Employee.class)
    .equalTo(new EmployeeToId(), 15)
    .build().fetch(); // This returns an Optional<Collection<Employee>>;

我的查询生成器将有一些方法,如:

代码语言:javascript
复制
class QueryBuilder{
   public <Entity> SelectBuilder<Entity> selectFrom(Class<Entity> clazz);
}

这只是玩笑而已。你可以把它弄得很复杂。但是要使它更好,那将需要很多时间,只需问hibernate或jooq。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25769236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档