使用spring jdbc时,清理外部长(+20行sql)的方法?

我想在我的应用程序中将一些大型查询外部化到properties \ sql \ xml文件中。 但是我想知道是否有人提出如何以干净的方式实现这一目标的一些建议。 大多数结果建议使用ORM框架,但由于某些数据限制,这不适用。

我看了一下: Java – 在一个外部文件中存储SQL语句,但是为一些查询执行这个属性名.1,.2等,每个查询都要长20行看起来不干净。

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

          

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

    

在您的DAO类中注入此bean

    

在DAO类中定义queryProps,不要忘记为此设置setter方法

  private Properties queryProps; 

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

  String query = queryProps.getProperty("getPersonById"); 

希望这可以帮助。

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

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

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

 anotherSelect: < SELECT column1 FROM SOMETHING WHERE column2 IN ( SELECT * FROM SOMETHING_ELSE ) 

然后,您可以使用以下代码在SnakeYAML库的帮助下将文件内容读入哈希映射:

 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 sqlQueries = new HashMap(); private SQLReader() { try { final File sqlYmlDir = new File("dir_with_yml_files"); Collection 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文件映射到包含查询名称/字符串的映射。

这是Pankaj所回答的补充。 这个在属性XML中没有CDATA并使用自动assembly。 我不得不将其添加为答案,因为如果我必须在评论部分中执行此操作,则无法格式化代码。

确保在spring application context xml文件中有以下命名空间。

 xmlns:util="http://www.springframework.org/schema/util 

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

  

sqls.xml文件的sqls.xml

    Employee Queries  INSERT INTO EMPLOYEE ( ID, NAME, AGE, DEPARTMENT ) VALUES ( EMPLOYEE_SEQ.NEXTVAL, ?, ?, ? )   

自动assembly以下属性

 @Autowired @Qualifier("sqls") private Properties sqls; 

用于从Properties获取sql查询的代码

 String sql = sqls.getProperty("employee.insert"); 

在JdbcTestUtils和方法“executeSqlScript”和“readScript”中获取战利品。

您可以通过在行的末尾添加\来在属性文件中执行多行查询。 例如

 queries.myquery = select \ foo, bar \ from mytable \ where baz > 10