spring - 如何使用 spring 将查询外部化为 xml 文件

标签 spring jdbc spring-jdbc

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

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

最佳答案

我不确定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 中,例如 requests.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;
    }

}

关于spring - 如何使用 spring 将查询外部化为 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065332/

相关文章:

java - 我们应该在连接工厂上调用 setClientId() 吗?

Java Oracle 连接池 - 关闭连接异常

java - 将驱动程序从 JTDS 更改为 MS SQL 驱动程序时出错

java - AngularJS + Spring : 415 unsupported media type

java - 升级 spring-boot-1.5.20 -> spring-boot-2.1.4 后出现 Spring Data 性能问题

java - 如何使用 SQL 查询转义用户提供的参数?

java - 使用多个 Spring Boot 和 JDBC 数据源

kotlin - 使用 NamedParameterJdbcTemplate 为每个查询设置不同的查询超时

java - Spring 集成异常堆栈跟踪像 Apache Camel 一样?

java - mysql空指针异常