如何使用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)外部化的干净方法? [关闭]