我有一个Java项目,它包含许多用于查询数据库的大型SQL语句。我的问题是:我应该在哪里存储它们?
我很确定我希望每个语句都有自己的源代码控制管理的文本文件。由于Java不支持多行字符串,因此我无法轻松地将SQL放入.java
文件中,而且我认为无论如何我都不想这样做。在构建时,我可以将这些文本文件放在JAR中,并使用ClassLoader.getResourceAsStream()
获取内容。
所以我的问题在于我应该在哪些目录中放置这些文件以及我应该将它们称为什么。理想情况下,我希望人们从.sql
文件中告诉哪个Java类使用它。我绝对不想要的是一个包含大量文件的目录,例如report1.sql
和report3.sql
等等。
我倾向于将它们放在包含所有.java
文件的包目录中,但我有一位同事不喜欢此树中除.java
个文件以外的任何内容。所以这导致了一个独立的目录结构的替代,它反映了Java包,但这似乎是一个不必要的开销。
所以我很想知道你对SQL文件做了什么。
我们正在使用Netbeans 6.5,以免影响您的答案。
(This question很相似,但遗憾的是答案非常具有C#,这对这个问题有好处,但对我不好。)
答案 0 :(得分:18)
在Java / Maven设置中,我们将其用作项目层次结构:
project/src/main/java/Package/Class.java
project/src/test/java/Package/ClassTest.java
project/src/main/resources/Package/resource.properties
project/src/test/resources/Package/test_resource.properties
为了回答你的问题:我会将SQL文件与src / main / resources下的资源一起放入。
您可能需要查看此thread。
答案 1 :(得分:5)
我很想将SQL查询放在src下的专用SQL
文件夹中。这将Java代码与SQL分开:
+ src
+ java
+ sql
- Package/Class.sql
+ test
或者,您可以使用上述结构将它们放入简单的属性文件中:
getUserByName = select * from users where name=?
getUserByEmail = select * from users where email=?
getUserByLongQuery = select * from users where email=? \
and something = ? \
where something_else = ?
此外,我认为值得一提的是,如果您愿意采用这种方式,可以将多行字符串放入Java类中:
class MyClass {
MY_QUERY = "select * from users where email = ? " +
"and something_else = ?";
}
答案 2 :(得分:2)
我完全赞同boutta。 Maven为src文件夹管理设置了一个很好的标准。您是否考虑过将XML存储在XML中?将查询保存在单个文件中可以使管理SQL更加容易。我的第一个直觉很简单:
<?xml version="1.0" encoding="UTF-8"?>
<queries>
<query id="getUserByName">
select * from users where name=?
</query>
<query id="getUserByEmail">
select * from users where email=?
</query>
</queries>
要解析文件,请使用xpath甚至SAX创建一个由id键入的查询映射,以便快速查询查询。
答案 3 :(得分:1)
为了与http://maven.apache.org/pom.html#Resources保持一致,这个地方可能是以下之一:
src/main/sql
src/main/upgrade
- 用于版本之间的升级脚本src/main/db
,src/main/schema
,src/main/ddl
- 用于当前项目数据库架构,用于初始项目部署src/main/NAME
目录需要考虑的其他事项:
Vxx__YYY.sql
so you place them into project classpath:resources/db/migration
目录中的升级src/main/resources/db/migration
脚本。请注意,IDE不支持项目查看器中src/main/java
和src/main/resources
以外的侦听目录,文件查看器。< / p>
答案 4 :(得分:0)
对于最初的问题,这是一个轻微的重复,但可以说,SQL越复杂,它就越多地存在于数据库(或服务层)中,而不是Java代码中。
否则,随着代码的成熟,issues like this会出现。