【问题标题】:How to externalize the queries to xml files using spring如何使用spring将查询外部化到xml文件
【发布时间】:2015-06-26 05:06:51
【问题描述】:

我正在使用 spring 及其 JDBC 模板对数据库进行读/写操作。我在报告模块中遇到了一个问题,我必须经常更改查询 sql 以适应频繁的更改。

虽然使用 spring jdbc ORM,但有没有办法将我的查询参数外部化,这样我只需在 XML 中更改它并重新启动,而无需再次重建我的源代码以进行部署。任何方法 ORM(首选)或简单的 Sql 都可以。 截至目前,我必须一次又一次地更改查询,重建源代码并部署。

【问题讨论】:

  • 不会将 sql 查询字符串外部化为 Spring bean 定义 xml 帮助?或者您可能只是使用 @Value 注释从 .properties 文件中注入您的查询?

标签: spring jdbc spring-jdbc


【解决方案1】:

我不确定 Spring 是否提供了一些开箱即用的解决方案来实现您想要的。但这是完成它的一种方法,我已经实现了。所以我会尽量为你减少一些辛苦。

您可能需要实现一个实用程序来从资源 xml 文件加载。像这样。

public final class LoadFromResourceFileUtils {


public static String loadQuery(final String libraryPath,
        final String queryName) {
    final InputStream is = StreamUtils
            .streamFromClasspathResource(libraryPath);
    if (is == null) {
        throw new RuntimeException(String.format(
                "The SQL Libary %s could not be found.", libraryPath));
    }
    final Document doc = XMLParseUtils.parse(is);
    final Element qryElem = (Element) doc.selectSingleNode(String.format(
            "SQLQueries/SQLQuery[@name='%s']", queryName));
    final String ret = qryElem == null ? null : qryElem.getText();
    return ret;
}

}

您需要将查询存储在 XML 中,例如 queries.xml 并将其保存在您的类路径中,例如

<?xml version="1.0" encoding="UTF-8"?>
<SQLQueries>
    <SQLQuery name="myQuery">
        <![CDATA[
            your query
        ]]>
    </SQLQuery>
</SQLQueries>

在你的 DAO 中你可以这样做来获取查询

String query = LoadFromResourceFileUtils.loadQuery(
        "queries.xml", "myQuery");

XMLParseUtils 和 StreamUtils 供您参考

    public final class XMLParseUtils {

    public static Document parse(final InputStream inStream) {
        Document ret = null;
        try {
            if (inStream == null) {
                throw new RuntimeException(
                        "XML Input Stream for parsing is null"); 
            }
            final SAXReader saxReader = new SAXReader();
            ret = saxReader.read(inStream);
        } catch (final DocumentException exc) {
            throw new RuntimeException("XML Parsing error", exc); 
        }
        return ret;
    }
}

    public final class StreamUtils {
    public static InputStream streamFromClasspathResource(
            final String resourceClassPath) {
        final Class<StreamUtils> clazz = StreamUtils.class;
        final ClassLoader clLoader = clazz.getClassLoader();
        final InputStream inStream = clLoader
                .getResourceAsStream(resourceClassPath);
        if (inStream == null) {
            if(LOGGER.isDebugEnabled()){
                LOGGER.debug(String.format("Resource %s NOT FOUND.",
                    resourceClassPath));
            }
        }
        return inStream;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 2015-09-10
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多