Programación Java - Primavera y JdbcTemplate - Uso consulta, queryForList o queryForRowSet?

StackOverflow https://stackoverflow.com/questions/1660756

Pregunta

Mi Java (JDK6) proyecto utiliza primavera y JdbcTemplate a pesar de su acceso a la base. Hace poco pasaron de 2,5 a primavera resorte 3 (RC1). El proyecto no utiliza un ORM como Hibernate ni EJB .

Si tengo que leer un montón de discos, y hacer algo de procesamiento interno con ellos, parece que hay varios métodos (sobrecargados): consulta, queryForList y queryForRowSet

¿Cuáles deben ser los criterios a utilizar uno en lugar de otro? ¿Hay diferencias de rendimiento? ¿Mejores prácticas?

Me puede recomendar algunas referencias externas para futuras investigaciones sobre este tema?

¿Fue útil?

Solución

Me parece que la forma estándar para acceder como lista es a través de los métodos query() más que cualquiera de los otros enfoques. La principal diferencia entre query y los otros métodos es que usted tiene que poner en práctica una de las interfaces de devolución de llamada (ya sea RowMapper, RowCallbackHandler o ResultSetExtractor) para manejar el conjunto de resultados.

A es RowMapper probable que lo que se encontrará el uso de la mayor parte del tiempo. Se utiliza cuando cada fila del conjunto de resultados corresponde a un objeto en su lista. Sólo hay que poner en práctica un método único mapRow donde se rellena el tipo de objeto que va en su fila y lo devuelve. La primavera también tiene un BeanPropertyRowMapper que pueden poblar los objetos de una lista a través de coincidir los nombres de las propiedades de frijol a los nombres de columna (NB esta clase es por conveniencia no el rendimiento).

A RowCallbackHandler es más útil cuando se necesita sus resultados a ser algo más que una simple lista. Vas a tener que gestionar el retorno de objeto a sí mismo que está utilizando este enfoque. Por lo general encontramos a mí mismo usando este cuando necesito una estructura de mapa como mi tipo de retorno (es decir, para datos agrupados para una mesa de árbol o si estoy creando un caché personalizado basado de la clave primaria).

A ResultSetExtractor se utiliza cuando se desea controlar la iteración de los resultados. Usted implment una sola extractData método que va a ser el valor de retorno de la llamada a query. Yo sólo encuentro a mí mismo usando este si tengo que construir una cierta estructura de datos personalizada que es más complejo de construir utilizando cualquiera de las otras interfaces de devolución de llamada.

Los métodos queryForList() son valiosos en la que no se tiene que poner en práctica estos métodos de devolución de llamada. Hay dos maneras de utilizar queryForList. La primera es si sólo se consulta una única columna de la base de datos (por ejemplo, una lista de cadenas) se pueden utilizar las versiones del método que toma una clase como un argumento para darle forma automática una lista de sólo los objetos de esas clases .

Cuando se llama a las otras implementaciones de queryForList() obtendrá una lista de vuelta con cada entrada es un mapa de cada columna. Si bien esto es agradable en que usted es salvo expensas de escribir los métodos de devolución de llamada, que trata de esta estructura de datos es bastante difícil de manejar. Usted se encontrará haciendo un montón de fundición ya que los valores del mapa son de tipo Object.

De hecho, he visto nunca los métodos utilizados queryForRowSet en la naturaleza. Esto cargará todo el resultado de la consulta en un objeto CachedRowSet wapped por un SqlRowSet primavera. Veo una gran desventaja en el uso de este objeto en el que si estás pasando el SqlRowSet en torno a las otras capas de la aplicación, se está acoplando esas capas a su aplicación de acceso a datos.

Usted no debe ver ninguna enormes diferencias de rendimiento entre cualquiera de estas llamadas, excepto como he mencionado con el BeanPropertyRowMapper. Si está trabajando con un poco de manipulación compleja de un gran conjunto de resultados, es posible que pueda conseguir algunas mejoras en el rendimiento de escritura de un ResultSetExtractor optimizado para su caso específico.

Si desea obtener más información Me gustaría consultar el primavera JDBC documentación y la Javadoc para las clases que he mencionado. También puede echar un vistazo a algunos de los libros sobre el Spring Framework. Aunque es un poco pasada de moda Desarrollo de Java con Spring Framework tiene una muy buena sección sobre trabajar con el marco de JDBC. Por encima de todo, yo diría que sólo trata de escribir algo de código con cada método y ver lo que funciona mejor para usted.

Otros consejos

Ya que estás en la tierra maravillosa genéricos, lo que es posible que realmente quiere hacer es usar SimpleJdbcTemplate y utilizar sus métodos query() para Lists de los objetos y queryForObject() para objetos individuales. Razonamiento para esto simplemente es que son aún más fáciles de usar que los de JdbcTemplate.

Una pequeña adición a las excelentes respuestas anteriores: métodos adicionales, como queryForInt, queryForLong, queryForMap, queryForObject, etc. podría parecer como buenas opciones a veces si se está ejecutando una consulta sencilla y esperar una sola fila

Sin embargo, si usted podría conseguir 0 o 1 filas más atrás, el método queryForList es generalmente más fácil, de lo contrario tendría que coger IncorrectResultSizeDataAccessException. He aprendido que la manera difícil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top