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

Posted

技术标签:

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

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

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

【问题讨论】:

不会将 sql 查询字符串外部化为 Spring bean 定义 xml 帮助?或者您可能只是使用 @Value 注释从 .properties 文件中注入您的查询? 【参考方案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;
    


【讨论】:

以上是关于如何使用spring将查询外部化到xml文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 application.properties 外部化到 Spring Boot 中的外部文件系统位置?

如何在 Spring Boot linux 中向类路径提供外部配置资源(数据库属性和 XML 文件)

使用spring jdbc时将长(+20行sql)外部化的干净方法? [关闭]

如何在 php 页面中显示 XML 外部实体?

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

玩转Spring Boot 自定义配置导入XML配置与外部化配置