【问题标题】:Java builder paradigm for database entities数据库实体的 Java 构建器范例
【发布时间】:2016-08-17 11:19:41
【问题描述】:

我正忙于开发一个 SQL 查询构建器实用程序,它可以让我轻松快速地编写 SQL 查询。我已经为实际的查询构建器排序了基础知识,但是在数据库实体(即表和列)的字符串文字/常量上使用某种形式时,我被困住了。 我想做这样的事情:

String sqlQuery = queryBuilder.select(Tables.Users.FirstName)
.where(Tables.Users.Age >= 10)
.build()
.toString();

我已经阅读了很多关于枚举以及如何嵌套它们的内容,但似乎我必须为每个表(每个表都包含特定列)创建一个枚举。如果可能的话,我希望有一个类,其中包含所有表和每个表的所有列。 这应该允许我通过简单地调用类似的东西来“构建”一个字符串文字:

Tables.Address (returns the string value for 'address' table)
Tables.Address.Country  (returns the string value for 'country' column)

这是我迄今为止使用枚举尝试过的,但不是我想要的。

public enum Table {
    Users("users"),
    Addresses("addresses"),

    private String tableName;

    Table(String tableName) {
        this.tableName = tableName;
    }

    public String getName() {
        return tableName;
    }
}

public enum Column {
    ID(Table.Users, "id"),
    NAME(Table.Users, "name");

    private Table table;
    private String columnName;

    Column(Table table, String columnName) {
        this.table = table;
        this.columnName = columnName;
    }

    public String getColumnName() {
        return columnName;
    }
}

【问题讨论】:

  • 基本上,在编译时不应该知道表。因此,任何形式的常量都不适用。
  • 您可能想在此处提供有关您尝试使用的数据库类型的更多信息。元数据绝对是要走的路,但是随着数据库供应商的变化,获取元数据的方式会有很大差异。
  • 如果是关系数据库则不会。 Java JDBC 让您可以不受供应商限制地访问数据库元数据。
  • JPA、eclipseLink(标准生成器、模式类的生成器)、JOOQ 和其他人都这样做。看看,也许你可以做得更好,比如用 java 8 手段。部分是字节码分析,将编译后的代码x < y 等转换为符号表示法。 (NetBeans 有一个不错的 JPA、eclipseLink、集成。)
  • @GrahamNicol:我正在使用 SQLlite。我将研究元数据以及如何使用它。谢谢

标签: java enums constants string-literals


【解决方案1】:

首先,我真的不明白你为什么要重新发明已经发明了很多次的轮子。

所以,如果您正在开发库以使用它,请查看JOOQ。但是,如果您真的想开发自己的查询构建器,您可能会发现我的项目 BeanCrumbs 很有用。

【讨论】:

  • 我正在做的项目实际上只是一个小型学习项目,以更好地掌握Java中的数据库开发。我从最基本的开始,然后向上/前进。因此,我觉得有必要一开始就写出 SQL 查询……换句话说,在我让它变得更简单和更简单的地方进行重构。最终,一旦我清楚地了解了底层的基本原理是如何工作的,我就会使用一个库来实现这一点。可能听起来像是一种迂回的做事方式,但我想清楚地了解我正在使用和致力于什么。感谢您的回答。
  • 祝您学习顺利,这是一个雄心勃勃的项目,但如果您坚持下去,您将对数据库的各个部分如何协同工作以及如果您选择稍后扩展它有一个很好的理解,这是如何在不同的数据库中完成的。
【解决方案2】:

枚举不是要走的路;他们不够灵活。您需要访问您附加到的每个数据库架构的元数据。

我从来不明白为什么像您这样的解决方案被认为比编写 SQL 并使用 JDBC 执行更好。使用构建器的工作量与编写 SQL 的工作量一样多。

仅供参考 - 您意识到您不是解决此问题的第一个或最佳尝试。 Spring JDBC 模板采用样板文件并摆脱与关系数据库的交互。 iBatis 已经存在了很长时间,并且得到了很好的证明。有很多 ORM 解决方案,比如 Hibernate,但这些都是过分的桥梁。我不会推荐那些。 JPA 内置于 Java EE 规范中。

我不想在一个重新发明这个轮子并迫使我更喜欢它而不是商品的、经过验证的解决方案的团队工作。

【讨论】:

    【解决方案3】:

    我一直很成功地使用ActiveJDBC。 请参阅设计原则中的第一点,这是应用“约定优于配置”原则的程度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2011-04-16
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多