Spring jdbc模板:将sql语句保留在代码之外的最佳方法是啥

Posted

技术标签:

【中文标题】Spring jdbc模板:将sql语句保留在代码之外的最佳方法是啥【英文标题】:Spring jdbc templates : What is the best way to keep sql statement out of codeSpring jdbc模板:将sql语句保留在代码之外的最佳方法是什么 【发布时间】:2011-09-29 12:06:42 【问题描述】:

Spring JDBC 模板中似乎没有命名查询支持。命名查询是指在 java 代码中按名称引用 sql 语句并将实际语句保存在某个配置文件中的工具。

在缺乏开箱即用支持的情况下,我正在研究将 sql 语句保留在 java 代码之外的最佳方法。

以下是替代方案:

    属性文件 xml 属性文件 spring 上下文 xml(依赖注入)

cmets?

【问题讨论】:

【参考方案1】:

Java - Storing SQL statements in an external file

我做了一个系统,其中查询也存储在数据库中,对于我们所需要的而言,它绝对是完美的,但非常有趣。进行查询查找的查询也在数据库中,当它崩溃时引起了极大的欢闹(不要问)。

【讨论】:

所以你需要一个查询来获得一个查询来获得一个查询...... Eeek!我想我不想再考虑这个了。绝对不问!【参考方案2】:

您认为作为替代方案的所有方法都可以使用,但是如果您将语句从 Java 类中移出 对我来说是不必要的,那么您正在为您的设计添加额外的层。考虑将语句保留在 Java 类之外的开销。

将加载属性和 XML 以获取单个语句。 Inject 会将不必要的语句注入到类中。

如果我是你,我将创建一个类并将语句列在 static final 中。这使其透明,避免不必要的层,并使其对将来维护您的代码的人灵活。

例子:

//This does the job
public class SQLStatements

  static public final String GET_NAME="SELECT Name FROM some_table WHERE ID=?";

【讨论】:

问题是,如果查询发生变化,则强制类重新加载。如果您的所有代码无论如何都依赖于查询的具体细节,这本质上还不错,但是当它不依赖时,并且如果您处于禁止或不可能的环境中,那么它就不是初学者。 无论使用哪种方法都会导致重新加载,除非在占位符上放置了更改侦听器。 (或者您每次都检索查询。)但是“如果时间戳更改则重新加载文本文件”和“执行类加载”之间存在 巨大 区别,这可能需要重新启动完整的应用程序。 查询更改需要更改业务规则,这实际上需要生命周期控制,因此需要版本部署。如果没有任何查询,应用程序将具有原子性更改。 这不一定是真的。【参考方案3】:

我希望将所有 SQL 查询存储在属性或 xml 文件中。 然后在程序启动时获取所有查询并将它们存储在 Map 或 Properties 对象中。

这提供了即使在代码部署之后更改查询的可行性。 我们可以更改属性文件中的查询,然后重新启动应用程序。

【讨论】:

以上是关于Spring jdbc模板:将sql语句保留在代码之外的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Spring整合JDBC temple

HBase JDBC驱动Phoenix与SpringJDBCTemplate的集成

Spring+JDBC征服数据库

Spring JDBC 在运行 SQL 脚本时无法处理 DECLARE 语句

Spring框架学习六:Spring对JDBC的支持

Spring JDBC 示例