我使用spring及其JDBC模板对数据库进行读/写操作。我在报告模块中遇到一个问题,我必须经常更改查询sqls以适应频繁的更改。
虽然使用spring jdbc ORM,有没有办法外化我的查询参数,这样我只需在XML&重新启动,无需再次重建我的源以进行部署。任何方法ORM(首选)或简单的Sql都可以。 截至目前,我必须一次又一次地更改查询,重建源代码并进行部署。
答案 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;
}
}