java - query - spring jdbc ejemplo
¿Limpiar la forma de externalizar largos(+20 líneas sql) al usar spring jdbc? (5)
Quiero externalizar algunas consultas grandes en mi aplicación a propiedades / sql / xml files. Sin embargo, me preguntaba si alguien tiene algunas recomendaciones sobre cómo lograr esto de manera limpia. La mayoría de los resultados recomiendan el uso de un marco ORM, pero esto no es aplicable debido a algunas restricciones de datos.
Eché un vistazo a: Java: almacenar sentencias de SQL en un archivo externo, pero al hacer este nombre de propiedad .1, .2, etc. para unas pocas consultas que tienen más de 20 líneas, no parece tan limpio.
Esto es además de lo que Pankaj ha respondido . Este no tiene CDATA en el XML de propiedades y utiliza autowiring. Tuve que agregar esto como respuesta, ya que no puedo dar formato al código si tuviera que hacer esto en la sección de comentarios.
Asegúrese de tener el siguiente espacio de nombres en el archivo xml de contexto de la aplicación Spring.
xmlns:util="http://www.springframework.org/schema/util
Agregue el siguiente bean a xml de contexto de aplicación spring
<util:properties id="sqls" location="classpath:oracle/sqls.xml" />
El contenido del archivo sqls.xml
es
<?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>
Autowired las propiedades como abajo
@Autowired
@Qualifier("sqls")
private Properties sqls;
Código para obtener la consulta sql de Propiedades
String sql = sqls.getProperty("employee.insert");
Me enfrenté al mismo problema hace algún tiempo, y se me ocurrió YAML. Admite valores de propiedad de cadena de varias líneas, por lo que puede escribir algo como esto en sus archivos de consulta:
selectSomething: >
SELECT column1, column2 FROM SOMETHING
insertSomething: >
INSERT INTO SOMETHING(column1, column2)
VALUES(1, ''1'')
Aquí, seleccionar selectSomething
e insertSomething
son nombres de consulta. Así que es realmente conveniente y contiene muy pocos caracteres especiales. Las consultas están separadas por líneas en blanco, y cada texto de la consulta debe estar sangrado. Tenga en cuenta que las consultas pueden contener absolutamente su propia sangría, de modo que lo siguiente es perfectamente válido:
anotherSelect: <
SELECT column1 FROM SOMETHING
WHERE column2 IN (
SELECT * FROM SOMETHING_ELSE
)
Luego puede leer el contenido del archivo en un hash-map con la ayuda de la biblioteca SnakeYAML, usando el siguiente código:
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!!!");
}
}
}
En el ejemplo anterior, se crea un mapa de mapas, asignando cada archivo YAML a un mapa que contiene nombres / cadenas de consulta.
Puede hacer consultas multilínea en un archivo de propiedades colocando un / al final de la línea. Por ejemplo
queries.myquery = select /
foo, bar /
from mytable /
where baz > 10
Puedes poner tus consultas en un archivo xml.
<?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>
En la aplicación Spring Context, carga este archivo xml
<bean id="queryProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations" value="classpath:/queries.xml" />
</bean>
Inyecte este bean en su clase DAO
<bean id="myDAO" class="com.xyz.dao.MyDAOImpl">
<property name="queryProps" ref="queryProps" />
</bean>
Defina queryProps en su clase DAO y no olvide tener un método de establecimiento para esto
private Properties queryProps;
Ahora puedes acceder a la consulta en tu DAO así:
String query = queryProps.getProperty("getPersonById");
Espero que esto ayude.
Tome un botín en JdbcTestUtils y los métodos "executeSqlScript" y "readScript".