Saltar al contenido

¿Se puede usar PreparedStatement.addBatch() para consultas SELECT?

Esta es la contestación más correcta que encomtrarás dar, sin embargo obsérvala pausadamente y valora si es compatible a tu trabajo.

Solución:

Vea el tutorial de Java:

Esta lista puede contener instrucciones para actualizar, insertar o eliminar una fila; y también puede contener instrucciones DDL como CREATE TABLE y DROP TABLE. Sin embargo, no puede contener una sentencia que produzca un objeto ResultSet, como una sentencia SELECT. En otras palabras, la lista solo puede contener declaraciones que produzcan un recuento de actualizaciones.

La lista, que está asociada con un objeto Statement en su creación, inicialmente está vacía. Puede agregar comandos SQL a esta lista con el método addBatch.

JDBC no permite la creación por lotes SELECT consultas, lo que en mi opinión es una limitación frustrante, particularmente porque las declaraciones preparadas no le permiten especificar un número variable de argumentos, como un IN (...) cláusula.

El artículo de JavaRanch al que FJ se vincula sugiere simular el procesamiento por lotes creando una serie de consultas de tamaño fijo y uniendo sus resultados, lo que me parece una solución engorrosa y subóptima; ahora debe construir y procesar manualmente varias consultas y acceder a la base de datos varias veces. Si los números elegidos para los lotes definidos manualmente son bajos, podría terminar visitando la base de datos varias veces solo para responder una consulta simple.

En cambio, me he dedicado a construir dinámicamente PreparedStatement objetos con el número de campos que necesito. Esto significa que potencialmente creamos un mayor número de PreparedStatements de lo que lo haríamos con el procesamiento por lotes manual, pero limitamos la frecuencia con la que accedemos a la base de datos y simplificamos nuestra implementación, los cuales considero problemas más importantes.

/**
 * Use this method to create batch-able queries, e.g:
 * "SELECT * FROM t WHERE x IN (?, ?, ?, ?)"
 * Can be built as:
 * "SELECT * FROM t where x IN ("+getLineOfQs(4)+")"
 */
public static String getLineOfQs(int num) 
  // Joiner and Iterables from the Guava library
  return Joiner.on(", ").join(Iterables.limit(Iterables.cycle("?"), num));


/**
 * Gets the set of IDs associated with a given list of words
 */
public Set find(Connection conn, List words)
    throws SQLException 
  Set result = new HashSet<>();
  try(PreparedStatement ps = conn.prepareStatement(
      "SELECT id FROM my_table WHERE word IN ("+
      getLineOfQs(words.size())+")")) 
    for(int i = 0; i < words.size(); i++) 
      ps.setString(i+1, words.get(i));
    

    try (ResultSet rs = ps.executeQuery()) 
      while(rs.next()) 
        result.add(rs.getInt("id"));
      
    
  
  return result;

Esto no es demasiado doloroso para codificar, le brinda la seguridad de usar PreparedStatementy evita visitas innecesarias a la base de datos.

AddBatch() es para declaraciones 'eliminar'/'insertar'/'actualizar', y no declaraciones 'seleccionar'.

Tienes la posibilidad dar difusión a este escrito si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *