Personalización de conjunto de resultados

La moderna API de JDBC le permite personalizar en gran medida los objetos.DeclaraciónYconjunto resultante. Por ejemplo, usandoconjunto resultantepuede cambiar filas en la base de datos.

Al crear un objeto de declaración, podemos pasarle un montón de nuestros deseos. Estos deseos se pueden dividir en tres grupos:

  • Tipo de conexión básica
  • Control de acceso concurrente
  • Persistencia y transacciones

Estos parámetros se pueden pasar al crear un objetoDeclaraciónoDeclaración preparada. Ejemplo:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

No estudiaremos estas cosas en profundidad, pero quiero que sepas que esto es posible si te encuentras con algo similar en el código de otra persona.

Tipos de conjuntos de resultados

ResultSet puede ser de un tipo específico. El tipo define algunas de las características y capacidades del ResultSet.

No todos los tipos son compatibles con todas las bases de datos y controladores JDBC. Deberá verificar su base de datos y el controlador JDBC para ver si admite el tipo que desea usar. El método DatabaseMetaData.supportsResultSetType(int type) devuelve verdadero o falso dependiendo de si el tipo dado es compatible o no.

En el momento de escribir este artículo, hay tres tipos de ResultSet:

  • Conjunto de resultados.TYPE_FORWARD_ONLY
  • Conjunto de resultados.TYPE_SCROLL_INSENSITIVE
  • Conjunto de resultados.TYPE_SCROLL_SENSITIVE

El tipo predeterminado es TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY significa que el ResultSet solo se puede mover hacia adelante. Es decir, solo puede moverse desde la fila 1, la fila 2, la fila 3, etc. En un ResultSet, no puede retroceder: no puede leer datos de la novena fila después de leer la décima.

TYPE_SCROLL_INSENSITIVE significa que el ResultSet se puede mover (desplazar) hacia adelante o hacia atrás. También puede moverse a una posición relativa a la posición actual o moverse a una posición absoluta.

Un ResultSet de este tipo es insensible a los cambios en el origen de datos subyacente mientras el ResultSet está abierto. Es decir, si otro subproceso o proceso cambia una entrada en el ResultSet en la base de datos, no se reflejará en el ya abierto.conjunto resultantede este tipo

TYPE_SCROLL_SENSITIVE significa que el ResultSet se puede mover (desplazar) hacia adelante o hacia atrás. También puede moverse a una posición relativa a la posición actual o moverse a una posición absoluta.

Un ResultSet de este tipo es sensible a los cambios en el origen de datos subyacente mientras el ResultSet está abierto. Es decir, si otro subproceso o proceso cambia una entrada en el ResultSet en la base de datos, se reflejará en el ya abierto.conjunto resultantede este tipo

concurrencia

La concurrencia de un ResultSet determina si el ResultSet se puede actualizar o solo leer.

Algunas bases de datos y controladores JDBC admiten la actualización de un ResultSet, pero no todos. El método DatabaseMetaData.supportsResultSetConcurrency(int concurrency) devuelve verdadero o falso dependiendo de si el modo de simultaneidad dado es compatible o no.

ResultSet puede tener uno de dos niveles de concurrencia:

  • ResultSet.CONCUR_READ_ONLY
  • Conjunto de resultados.CONCUR_UPDATABLE

CONCUR_READ_ONLY significa que el ResultSet solo se puede leer.

CONCUR_UPDATABLE significa que el ResultSet se puede leer y modificar.

Un ejemplo de cambio de datos en la base de datos.

Con estos parámetros, puede controlar la Declaración generada y su ResultSet.

Por ejemplo, puede crear un ResultSet actualizable y usarlo para cambiar la base de datos. Al crear una Declaración, es importante observar las siguientes condiciones:

  • solo se especifica una tabla
  • no contiene cláusulas de unión o agrupación
  • las columnas de consulta deben contener una clave principal

Cuando se cumplen las condiciones anteriores, el ResultSet actualizado se puede utilizar para actualizar una tabla en la base de datos. Al crear un objeto de declaración, debe especificar los siguientes parámetros:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

El resultado de ejecutar tal declaración es un conjunto de resultados actualizable. El método de actualización consiste en mover el cursor de ResultSet a la fila que desea actualizar y luego llamar al método updateXXX() .

El método updateXXX funciona de manera similar al método getXXX() . El método updateXXX() tiene dos parámetros. El primero es el número de la columna que se está actualizando, que puede ser un nombre de columna o un número de serie. El segundo son los datos que deben actualizarse, y este tipo de datos debe ser el mismo que XXX.

Para actualizar realmente la fila en la base de datos, debe llamar al método updateRow() antes de que el cursor de ResultSet abandone la fila modificada; de lo contrario, los cambios no se incluirán en la base de datos.

También puede agregar nuevas filas a la tabla:

Primero debe mover el cursor a una línea vacía. Para hacer esto, llama al método moveToInsertRow() .

Luego, debe completar esta fila con datos utilizando el método updateXXX() .

Luego, debe llamar al método inserterRow() para agregar la fila a la base.

Y, por último, debe devolver el cursor llamando al método moveToCurrentRow() .

¡Importante! No todos los DBMS admiten estas opciones para la declaración extendida. En caso de problemas, consulte la documentación oficial de un DBMS en particular.