2009-03-03 16 views
19

Tengo un proyecto Java que incluirá varias sentencias SQL grandes para consultar la base de datos. Mi pregunta es: ¿dónde debería almacenarlos?¿Dónde debería colocar los archivos SQL en mi proyecto Java?

Estoy bastante seguro de que quiero que cada declaración tenga su propio archivo de texto administrado por control de código fuente. Como Java no es compatible con cadenas de varias líneas, no puedo colocar fácilmente el SQL en mis archivos .java y no creo que quiera hacerlo de todos modos. En tiempo de compilación puedo poner estos archivos de texto en JAR y obtener los contenidos con ClassLoader.getResourceAsStream().

Así que mi problema es en qué directorios debería poner estos archivos y cómo los debería llamar. Idealmente me gustaría que la gente diga del archivo .sql que la clase Java lo usa. Lo que definitivamente no quiero es un solo directorio lleno de muchos archivos llamados cosas como report1.sql y report3.sql y así sucesivamente.

Mi inclinación es ponerlos en el directorio del paquete con todos los archivos .java, pero tengo un colega que no le gusta tener nada más que .java archivos en este árbol. Por lo tanto, esto conduce a una alternativa de una estructura de directorios separada que refleja los paquetes de Java, pero esto parece una sobrecarga innecesaria.

Me gustaría saber qué hace con sus archivos SQL.

Estamos utilizando Netbeans 6.5 en caso de que afecte sus respuestas.

(This question es similar, pero por desgracia las respuestas son muy C# específica, que es bueno para esa pregunta, pero malo para mí.)

+0

Ver este hilo http://stackoverflow.com/questions/174171/including-non-java-sources-in-a-maven-project –

+0

Véase también http://stackoverflow.com/questions/7686334/whats- the-recommended-location-for-sql-ddl-scripts – gavenkoa

Respuesta

17

En un entorno Java/Maven utilizamos como jerarquía del proyecto:

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 

Y para responder a su pregunta: Yo pondría los archivos SQL junto con los recursos en src/main/resources.

Es posible que desee echarle un vistazo a este thread.

+0

No estoy de acuerdo con usted, ya que al ponerlos en src/main/resources terminarán en su aplicación empaquetada (en su classpath) exponiendo así información sensible sobre la estructura de su DB –

+0

Pero exponer estos recursos SQL en el classpath es exactamente lo que quiere el OP. Por lo tanto, no entiendo tu comentario. – boutta

2

Estoy totalmente de acuerdo con Boutta. Maven establece un buen estándar para la administración de carpetas src. ¿Has considerado almacenar tu SQL en XML? Mantener las consultas en un solo archivo puede facilitar la administración del SQL. Mi primera intuición es algo sencillo:

<?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> 

para analizar el archivo, utiliza XPath o incluso SAX para crear un mapa de consultas tecleados por el ID de consulta para búsquedas rápidas.

+1

Si bien me gusta la idea de mantener muchas consultas SQL en un solo archivo, una de las ventajas de tener SQL separado del código de Java es la legibilidad y el texto en mi humilde opinión es inapelable. –

+0

Según mi experiencia con Hibernate, XML es más legible que el uso de anotaciones. Tampoco me gustan los archivos de propiedades de varias líneas. ¿Qué se prefiere? – jon077

+0

+1 para la organización de directorios derivados de maven; -1 porque @ dave-webb estoy de acuerdo con usted en que el XML oscurece la legibilidad innecesariamente – andersoj

4

Estaría tentado de poner las consultas SQL en una carpeta dedicada SQL bajo src. Esto separa el código de Java desde el SQL:

+ src 
    + java 
    + sql 
    - Package/Class.sql 
+ test 

alternativa usted puede ponerlos en archivos de propiedades simples utilizando la estructura anterior:

getUserByName = select * from users where name=? 

getUserByEmail = select * from users where email=? 

getUserByLongQuery = select * from users where email=? \ 
    and something = ? \ 
    where something_else = ? 

Además, creo que vale la pena mencionar que se puede poner múltiples cadenas de líneas en una clase Java, si usted prefiere tomar esa ruta:

class MyClass { 
    MY_QUERY = "select * from users where email = ? " + 
       "and something_else = ?"; 
} 
+3

Argumentaría que no es una cadena de varias líneas; es una gran cantidad de cadenas de una sola línea concatenadas juntas. Me doy cuenta de que es una cuestión de gusto personal, pero tener que mantener las comillas y signos de más en posiblemente 30 líneas de SQL me vuelve loco. (Me gusta tener muchos saltos de línea en mi SQL para que sea legible.) –

+0

@Dave En ese caso, optaría por una de mis dos primeras sugerencias – Olly

+0

@Olly: Sus dos primeras respuestas abordan la pregunta; el último (poner SQL sin procesar en el origen de Java) no. Su primera respuesta podría usar alguna elaboración ... Me gusta la idea de poner cosas en archivos por clase en una jerarquía de recursos, pero ¿cómo organizar los contenidos para recuperar una consulta en particular? – andersoj

0

Este es un ligero riff en la pregunta inicial, pero sin duda el más complejo es el SQL es el más pertenece en la base de datos (o en una capa de servicios) y no en su código Java.

De lo contrario, como el código madura, issues like this surgen.

+0

Estamos usando JavaDB y como eso requiere escribir sus Procedimientos almacenados en Java, aún tendría el mismo problema de dónde colocar las sentencias de SQL. –

+0

Ahh, es suficiente. – Alkini

1

para ser consistente a http://maven.apache.org/pom.html#Resources este lugar puede ser uno de:

  • src/main/sql
  • src/main/upgrade - para scripts de actualización entre versiones
  • src/main/db, src/main/schema, src/main/ddl - para el esquema actual proyecto de DB, por primera Despliegue del proyecto
  • etc., solo ponerlo en src/main/NAME directorio

Otras cosas a considerar:

Tenga en cuenta que el IDE no es compatible con otros directorios escuchar a continuación src/main/java y src/main/resources en visor de proyectos, para que el uso del visor de archivos .

Cuestiones relacionadas