我应该将 SQL 文件放在我的 Java 项目中的啥位置?
Posted
技术标签:
【中文标题】我应该将 SQL 文件放在我的 Java 项目中的啥位置?【英文标题】:Where should I put the SQL files in my Java project?我应该将 SQL 文件放在我的 Java 项目中的什么位置? 【发布时间】:2010-10-11 00:02:04 【问题描述】:我有一个 Java 项目,其中包含许多用于查询数据库的大型 SQL 语句。我的问题是:我应该将它们存放在哪里?
我很确定我希望每个语句都有自己的文本文件,由源代码控制管理。由于 Java 不支持多行字符串,我不能轻易地将 SQL 放入我的 .java
文件中,而且我想我也不想这样做。在构建时,我可以将这些文本文件放入 JAR 并使用 ClassLoader.getResourceAsStream()
获取内容。
所以我的问题变成了我应该将这些文件放在哪些目录中以及我应该如何称呼它们。理想情况下,我希望人们从.sql
文件中知道哪个Java 类使用它。我绝对不想要的是一个包含大量文件的单个目录,例如 report1.sql
和 report3.sql
等等。
我倾向于将它们放在包含所有 .java
文件的包目录中,但我有一位同事不喜欢在这棵树中拥有除 .java
文件之外的任何东西。因此,这导致替代一个独立的目录结构来镜像 Java 包,但这似乎是不必要的开销。
所以我很想听听您如何处理您的 SQL 文件。
我们正在使用 Netbeans 6.5,以防影响您的答案。
(This question 类似,但遗憾的是答案是 C# 特定的,这对那个问题有好处,但对我不利。)
【问题讨论】:
看到这个帖子***.com/questions/174171/… 另见***.com/questions/7686334/… 【参考方案1】:在我们用作项目层次结构的 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。
【讨论】:
我不同意你的观点,因为将它们放在 src/main/resources 中,它们最终会出现在你的打包应用程序中(在你的类路径上),从而暴露关于你的数据库结构的合理信息 但是在类路径中公开这些 SQL 资源正是 OP 想要的。因此我不明白你的评论。【参考方案2】:我很想将 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 = ?";
【讨论】:
我认为这不是多行字符串;它是许多连接在一起的单行字符串。我意识到这是个人品味的问题,但不得不在可能 30 行 SQL 上保留引号和加号让我发疯。 (我喜欢在我的 SQL 中有很多换行符,所以它是可读的。) @Dave 在这种情况下,我会选择我的前两个建议之一 @Olly:您的前两个答案解决了这个问题;最后一个(将原始 SQL 放入 Java 源代码)没有。您的第一个答案可能需要一些详细说明...我喜欢将事物放在资源层次结构中的每个类文件中的想法,但是如何组织内容以检索特定查询?【参考方案3】:为了与http://maven.apache.org/pom.html#Resources保持一致,这个地方可能是以下之一:
src/main/sql
src/main/upgrade
或 srv/main/migrate
- 用于版本之间的升级/迁移脚本
src/main/db
、src/main/schema
、src/main/ddl
- 用于当前项目数据库架构,用于初始项目部署
等,放到src/main/NAME
目录下
src/main/resources/NAME
是将 SQL 文件放入类路径的最快方法,因为默认情况下 Maven/Gradle 会将所有内容从 ``src/main/resources/` 复制到最终工件。
其他需要考虑的事项:
FlyWay DB 迁移工具假定升级位于classpath:resources/db/migration
so you place them into projectsrc/main/resources/db/migration
目录中的Vxx__YYY.sql
脚本。
LiquiBase DB 迁移工具推荐Choose a package in your classpath to store the changelogs, preferably near your database access classes
IDE 可能不支持在项目浏览器的项目查看器中除src/main/java
和src/main/resources
以外的目录,请改用文件查看器。
【讨论】:
【参考方案4】:我完全同意布塔。 Maven 为 src 文件夹管理设置了一个很好的标准。您是否考虑过将 SQL 存储在 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 为键的查询映射,以便快速查询查找。
【讨论】:
虽然我喜欢将许多 SQL 查询保存在一个文件中的想法,但将 SQL 与 Java 代码分开的好处之一是可读性,而恕我直言,XML 是可读性的牺牲品。 根据我使用 Hibernate 的经验,XML 比使用注解更具可读性。我也不喜欢多行属性文件。什么是首选? +1 用于 maven 派生的目录组织; -1 因为@dave-webb 我同意你的观点,XML 不必要地模糊了可读性【参考方案5】:这对最初的问题略有重复,但可以说 SQL 越复杂,它就越属于数据库(或服务层)而不是 Java 代码。
否则,随着代码的成熟,issues like this 会出现。
【讨论】:
我们使用的是 JavaDB,因为这需要用 Java 编写存储过程,所以我仍然会遇到同样的问题,即放置 SQL 语句的位置。以上是关于我应该将 SQL 文件放在我的 Java 项目中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章
我应该将前端代码放在我的后端项目中的啥位置以及如何/何时运行它?