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

时间:2015-06-26 05:06:52

标签: spring jdbc spring-jdbc

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

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

1 个答案:

答案 0 :(得分: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 say 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;
    }

}