在 java 中设计 sql 查询存储的最佳方法是什么?
What is the best way to design a sql query storage in java?
我遇到了一个有点难的设计问题:
我目前正在编写一个经常从 Postgres 数据库请求数据的应用程序。其中一些请求当然需要参数,有些则不需要。有些具有相同的 return 类型,有些则不同。
自从我开始这个项目以从根本上学习如何有效地构建代码,尤其是模块化代码以来,我遇到了关于如何管理所有这些请求的存储的问题。
我目前的做法如下:
我设置了枚举的枚举,其中每个子枚举都实现了不同的接口,其中每个接口都声明了一个方法存根。这些存根的参数和 return 类型不同。
看起来像这样:
public enum Queries {
;
public enum Queries_TypeA implements TypeAInterface {
SOME_QUERY_A {
@Override
public double execute(String id, Date date) {
}
},
SOME_OTHER__QUERY_A {
@Override
public double execute(String id, Date date) {
}
};
},
public enum Queries_TypeB implements TypeBInterface {
SOME_QUERY_B {
@Override
public String execute() {
}
},
SOME_OTHER__QUERY_B {
@Override
public String execute() {
}
};
}
}
所以如果我想得到结果,例如SOME_QUERY_A,我将执行以下操作:
double result = Queries.QueriesTypeA.SOME_QUERY_A.execute("0", date1, date2);
这只是一小段摘录。我还没有完全实施它,这就是我问这个问题的原因。在覆盖的方法中,实际的查询会发生,结果会被解析,然后 returned,但是因为这在这里并不重要,所以我没有指定实现。
在现实中,会有更多的枚举、子枚举和接口。
是否有更好的解决方案(我确定有),尤其是在可伸缩性和模块化方面?
或者是否有某种最先进的方法来处理此类问题?
我真的很期待意见和想法。
此致,
阿杜克斯
通常在与 java 的 DB 交互时,主要有两种方法:
ORM 风格。使用休眠或其他一些 JPA 实现。这里的概念是您应该将数据库视为实现细节; JPA 实际上是它自己的语言(与 SQL 相似但不完全相同),它的功能是存储并让您查询对象。它有许多缺点(您不能(轻松地)在指尖获得 SQL 的全部功能,抽象有漏洞,性能调整很棘手),但至少它是独立于数据库引擎的。
直走SQL。您可能会想:是的,这就是 JDBC 的用途,但是.. 不。 JDBC 是一个低级的胶水库,故意丑陋且使用不便。这是设计使然; JDBC 的目的是成为最低级别,尽可能提供所有功能。它由委员会设计,该委员会是甲骨文和主要的数据库供应商。它就像数据库语言的汇编器;你真的不应该直接使用它。幸运的是,在它之上构建了各种轻型抽象层,它们仍然可以让您直接 SQL 访问,但 API 更好。这个 space 中有几个大玩家,但我建议你看看 JOOQ or JDBI
您的问题似乎表明您希望直接选择 JDBC。不是真的如何做到这一点。 JDBI 有针对您所面临问题的解决方案,我很确定 JOOQ 也有。他们所追求的一般要点是你制作一个描述结果集的 POJO(X in:SELECT X FROM ....)这样你就可以迭代 nice POJO,and/or您使用为其提供支持的查询来注释方法,然后让框架(因此,JDBI 或 JOOQ)生成基于 JDBC 的代码以从那里自动进行查询。
简而言之:检查 oot JDBI 或 JOOQ。
我会研究 Spring JDBC,尤其是 JDBCTemplate。它是一个强大的 API,已经提供了您建模的抽象等等。这将消除大部分样板文件,而不会引入对象关系映射器 (JPA) 附带的学习曲线和复杂性。
我遇到了一个有点难的设计问题:
我目前正在编写一个经常从 Postgres 数据库请求数据的应用程序。其中一些请求当然需要参数,有些则不需要。有些具有相同的 return 类型,有些则不同。
自从我开始这个项目以从根本上学习如何有效地构建代码,尤其是模块化代码以来,我遇到了关于如何管理所有这些请求的存储的问题。
我目前的做法如下:
我设置了枚举的枚举,其中每个子枚举都实现了不同的接口,其中每个接口都声明了一个方法存根。这些存根的参数和 return 类型不同。
看起来像这样:
public enum Queries {
;
public enum Queries_TypeA implements TypeAInterface {
SOME_QUERY_A {
@Override
public double execute(String id, Date date) {
}
},
SOME_OTHER__QUERY_A {
@Override
public double execute(String id, Date date) {
}
};
},
public enum Queries_TypeB implements TypeBInterface {
SOME_QUERY_B {
@Override
public String execute() {
}
},
SOME_OTHER__QUERY_B {
@Override
public String execute() {
}
};
}
}
所以如果我想得到结果,例如SOME_QUERY_A,我将执行以下操作:
double result = Queries.QueriesTypeA.SOME_QUERY_A.execute("0", date1, date2);
这只是一小段摘录。我还没有完全实施它,这就是我问这个问题的原因。在覆盖的方法中,实际的查询会发生,结果会被解析,然后 returned,但是因为这在这里并不重要,所以我没有指定实现。
在现实中,会有更多的枚举、子枚举和接口。
是否有更好的解决方案(我确定有),尤其是在可伸缩性和模块化方面? 或者是否有某种最先进的方法来处理此类问题?
我真的很期待意见和想法。
此致, 阿杜克斯
通常在与 java 的 DB 交互时,主要有两种方法:
ORM 风格。使用休眠或其他一些 JPA 实现。这里的概念是您应该将数据库视为实现细节; JPA 实际上是它自己的语言(与 SQL 相似但不完全相同),它的功能是存储并让您查询对象。它有许多缺点(您不能(轻松地)在指尖获得 SQL 的全部功能,抽象有漏洞,性能调整很棘手),但至少它是独立于数据库引擎的。
直走SQL。您可能会想:是的,这就是 JDBC 的用途,但是.. 不。 JDBC 是一个低级的胶水库,故意丑陋且使用不便。这是设计使然; JDBC 的目的是成为最低级别,尽可能提供所有功能。它由委员会设计,该委员会是甲骨文和主要的数据库供应商。它就像数据库语言的汇编器;你真的不应该直接使用它。幸运的是,在它之上构建了各种轻型抽象层,它们仍然可以让您直接 SQL 访问,但 API 更好。这个 space 中有几个大玩家,但我建议你看看 JOOQ or JDBI
您的问题似乎表明您希望直接选择 JDBC。不是真的如何做到这一点。 JDBI 有针对您所面临问题的解决方案,我很确定 JOOQ 也有。他们所追求的一般要点是你制作一个描述结果集的 POJO(X in:SELECT X FROM ....)这样你就可以迭代 nice POJO,and/or您使用为其提供支持的查询来注释方法,然后让框架(因此,JDBI 或 JOOQ)生成基于 JDBC 的代码以从那里自动进行查询。
简而言之:检查 oot JDBI 或 JOOQ。
我会研究 Spring JDBC,尤其是 JDBCTemplate。它是一个强大的 API,已经提供了您建模的抽象等等。这将消除大部分样板文件,而不会引入对象关系映射器 (JPA) 附带的学习曲线和复杂性。