首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用spring jdbc时,如何清晰地将long (+20行sql)外部化?

在使用spring jdbc时,如何清晰地将long (+20行sql)外部化?
EN

Stack Overflow用户
提问于 2013-03-15 20:53:08
回答 5查看 23.4K关注 0票数 21

我希望将应用程序中的一些大型查询外部化到properties\sql\xml文件。然而,我想知道是否有人对如何以干净的方式实现这一点有一些建议。大多数结果建议使用ORM框架,但由于某些数据约束,这并不适用。

我看了一下:Java - Storing SQL statements in an external file,但是对一些查询执行这个属性名.1,.2等,每个查询都超过20行,看起来并不是很干净。

EN

回答 5

Stack Overflow用户

发布于 2013-10-02 08:41:24

您可以将查询放在xml文件中

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>
<entry key="getPersonById">
    <![CDATA[
        Select Name From Person 
        Where Id =?     
    ]]>

</entry>    
<entry key="getPersonBySSN">
    <![CDATA[

    ]]>
</entry>

</properties>

在Spring应用程序上下文中,加载此xml文件

代码语言:javascript
复制
<bean id="queryProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations" value="classpath:/queries.xml" />
</bean>

将此bean注入到DAO类中

代码语言:javascript
复制
<bean id="myDAO" class="com.xyz.dao.MyDAOImpl">
  <property name="queryProps" ref="queryProps" />
</bean>

在DAO类中定义queryProps,不要忘了为此使用setter方法

代码语言:javascript
复制
 private Properties queryProps;

现在,您可以像这样访问DAO中的查询-

代码语言:javascript
复制
 String query = queryProps.getProperty("getPersonById");

希望这能有所帮助。

票数 32
EN

Stack Overflow用户

发布于 2015-06-09 21:24:30

前段时间我也遇到过同样的问题,于是想到了YAML。它支持多行字符串属性值,因此您可以在查询文件中编写类似以下内容:

代码语言:javascript
复制
selectSomething: >
  SELECT column1, column2 FROM SOMETHING

insertSomething: >
  INSERT INTO SOMETHING(column1, column2)
  VALUES(1, '1')

这里,selectSomethinginsertSomething是查询名称。所以它非常方便,包含的特殊字符也很少。查询由空行分隔,每个查询文本都必须缩进。请注意,查询绝对可以包含自己的缩进,因此以下内容是完全有效的:

代码语言:javascript
复制
anotherSelect: <
  SELECT column1 FROM SOMETHING
  WHERE column2 IN (
    SELECT * FROM SOMETHING_ELSE
  )

然后,您可以使用以下代码,在SnakeYAML库的帮助下将文件内容读取到散列映射中:

代码语言:javascript
复制
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.FileUtils;
import java.io.FileReader;

import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileNotFoundException;

public class SQLReader {
  private Map<String, Map> sqlQueries = new HashMap<String, Map>();

  private SQLReader() {
    try {
      final File sqlYmlDir = new File("dir_with_yml_files");
      Collection<File> ymlFiles = FileUtils.listFiles(sqlYmlDir, new String[]{"yml"}, false);
      for (File f : ymlFiles) {
        final String fileName = FilenameUtils.getBaseName(f.getName());
        Map ymlQueries = (Map)new Yaml().load(new FileReader(f));
        sqlQueries.put(fileName, ymlQueries);
      }
    }
    catch (FileNotFoundException ex) {
      System.out.println("File not found!!!");
    }
  }
}

在上面的示例中,创建了映射的映射,将每个YAML文件映射到包含查询名称/字符串的映射。

票数 13
EN

Stack Overflow用户

发布于 2014-06-10 20:47:06

这是对Pankaj has answered的补充。这个应用程序在Properties XML中没有CDATA,而是使用自动装配。我必须添加这个作为答案,因为我不能格式化代码,如果我必须这样做在评论区。

确保在spring应用程序上下文xml文件中具有以下名称空间。

代码语言:javascript
复制
xmlns:util="http://www.springframework.org/schema/util

将以下bean添加到spring应用程序上下文xml中

代码语言:javascript
复制
<util:properties id="sqls" location="classpath:oracle/sqls.xml" />

文件sqls.xml的内容是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>Employee Queries</comment>
    <entry key="employee.insert">
        INSERT
        INTO EMPLOYEE
          (
            ID,
            NAME,
            AGE,
            DEPARTMENT
          )
        VALUES
          (
            EMPLOYEE_SEQ.NEXTVAL,
            ?,
            ?,
            ?
          )
    </entry>
</properties>

自动连接属性,如下所示

代码语言:javascript
复制
@Autowired
@Qualifier("sqls")
private Properties sqls;

用于从属性获取sql查询的代码

代码语言:javascript
复制
String sql = sqls.getProperty("employee.insert");
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15433032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档