我正在使用 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/