数据库实体的Java构建器范例

时间:2016-08-17 11:19:41

标签: java enums constants string-literals

我正在忙于开发一个SQL查询构建器util,它允许我轻松快速地编写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;
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

Enum不是要走的路;他们不够灵活。您需要访问附加到的每个数据库模式的元数据。

我从未理解为什么像你这样的解决方案被认为比编写SQL并使用JDBC执行更好。使用构建器和编写SQL一样多。

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

我不想在一个重新发明这种轮子的团队中工作,并迫使我更倾向于使用经过验证的商品解决方案。

答案 2 :(得分:0)

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