java jdbc transaction management with example
Este tutorial explica los tipos de transacciones JDBC, los tipos de datos, los métodos de gestión de transacciones y cómo utilizarlos en el programa Java:
En el Conjunto de resultados de JDBC tutorial de la Serie de tutoriales de JDBC , aprendimos a usar JDBC ResultSet para recuperar datos.
En este tutorial, discutiremos los tipos de transacciones en JDBC. Hemos visto una breve introducción a los tipos de transacciones en nuestros tutoriales anteriores. Aquí lo veremos de forma detallada. También cubriremos cuáles son los tipos de datos en JDBC y cómo usarlos en el programa Java.
La base de datos tendrá diferentes tipos de datos y Java tendrá diferentes tipos de datos. JDBC gestionará esta diferenciación. Preparémonos para conocer el tema importante en JDBC.
Lo que vas a aprender:
Gestión de transacciones JDBC
La secuencia de acciones (sentencias SQL) se trata como una sola unidad que se conoce como transacción. La gestión de transacciones es importante para que las aplicaciones orientadas a RDBMS mantengan la integridad y la coherencia de los datos.
Mientras realizamos la transacción, usaremos los métodos getXXX y setXXX para recuperar y configurar los datos en el objeto ResultSet. XXX representa los tipos de datos de las columnas. Discutiremos los tipos de datos y transacciones de JDBC en este tutorial.
Tipos de transacciones
En JDBC, cada consulta SQL se considerará una transacción. Cuando creamos una conexión de base de datos en JDBC, se ejecutará en modo de confirmación automática (el valor de confirmación automática es TRUE). Después de la ejecución de la instrucción SQL, se confirmará automáticamente.
A veces, es posible que deseemos confirmar la transacción después de la ejecución de algunas sentencias SQL más. En ese momento, debemos establecer el valor de confirmación automática en Falso. Para que los datos no se comprometan antes de ejecutar todas las consultas. Si obtenemos una excepción en la transacción, podemos revertir () los cambios y hacerlo como antes. La gestión de transacciones se puede explicar bien mediante el uso de propiedades ACID.
ÁCIDO significa
- A – Atomicidad -> Si todas las consultas se ejecutan correctamente, los datos se confirmarán, de lo contrario, no.
- C – Consistencia -> DB debe estar en un estado consistente después de cualquier transacción.
- I– Aislamiento -> La transacción está aislada de otras transacciones.
- D – Durabilidad -> Si la transacción se confirma una vez, permanecerá siempre comprometida.
Hay tres funciones más importantes en la Gestión de transacciones. Son:
preguntas y respuestas de la entrevista core java para experimentados
- Cometer: Después de la ejecución de las sentencias SQL, queremos que los cambios sean permanentes en la Base de Datos. Deberíamos llamar al método commit (). Normalmente, lo que es commit significa que hará los cambios de forma permanente en la base de datos. No podemos deshacer ni revocar los cambios. Pero podemos cambiar los datos en la base de datos.
- Retroceder: Rollback deshace los cambios hasta la última confirmación o punto de guardado mencionado. A veces, es posible que deseemos deshacer los cambios. Por ejemplo, tenemos una consulta anidada, una parte se ha ejecutado correctamente y la otra ha generado alguna excepción. En ese momento, queremos deshacer los cambios realizados por la primera parte, debemos llamar al método Rollback () para hacerlo si se ha producido una excepción.
- Punto de guardado: Savepoint ayuda a crear un punto de control en una transacción y permite realizar una reversión a ese punto de guardado en particular. Cualquier punto de guardado que se haya creado para una transacción se destruirá automáticamente y dejará de ser válido una vez que la transacción se haya confirmado o revertido.
Hasta ahora hemos visto lo que es commit, rollback y savepoint y sus operaciones. A continuación, veremos los métodos y cómo usarlo en el programa.
Métodos de gestión de transacciones
La interfaz de conexión proporciona 5 métodos para la gestión de transacciones. Son los siguientes:
# 1) Método setAutoCommit ()
De forma predeterminada, el valor de AutoCommit es TRUE. Después de la ejecución de la instrucción SQL, se confirmará automáticamente. Al usar el método setAutoCommit () podemos establecer el valor en AutoCommit.
# 2) Método Commit ()
El método de confirmación se utiliza para confirmar los datos. Después de la ejecución de la declaración SQL, podemos llamar a commit (). Confirmará los cambios realizados por la declaración SQL.
Sintaxis: conn.commit ();
# 3) Método Rollback ()
El método de reversión se utiliza para deshacer los cambios hasta que se haya realizado la última confirmación. Si enfrentamos algún problema o excepción en el flujo de ejecución de las declaraciones SQL, podemos revertir la transacción.
Sintaxis: conn.rollback ();
# 4) método setSavepoint ()
Savepoint le brinda control adicional sobre la transacción. Cuando establece un punto de guardado en la transacción (un grupo de declaraciones SQL), puede usar el método rollback () para deshacer todos los cambios hasta el punto de guardado o después del punto de guardado (). El método setSavepoint () se utiliza para crear un nuevo punto de guardado.
# 5) método releaseSavepoint ()
Se utiliza para eliminar el punto de guardado creado.
En el programa siguiente, conocerá más sobre estos métodos y también aprenderá a usarlos en el programa Java.
En este tutorial, todos los programas están escritos en Java. Hemos utilizado la versión Java 8 y Oracle DB.
>> Haga clic en aquí para descargar el software de Oracle.
>> Haga clic en aquí para descargar la versión 8 de Java.
Tiene el proceso de instalación de Java paso a paso.
Programa de ejemplo de transacción
|_+_|Producción:

Explicación:
Lo que hemos hecho en el programa de gestión de transacciones anterior es actualizar los valores del empleado dado en la tabla EMPLOYEE_DETAILS y confirmar los datos. Si se ha producido algún error o excepción, hemos realizado la operación rollback (). Ahora vamos a ver la explicación completa del programa.
#1) Creado 2 Seleccionar consulta para 2 empleados según su EMPID
A continuación se muestran las 2 consultas seleccionadas.
|_+_|#2) Creó dos consultas de actualización para 2 empleados en función de su EMPID
Dos consultas actualizadas:
|_+_|#3) Abra Conexión, ejecute la consulta de selección y visualice los datos de EMPNUM = 2001.
#4) Usando el método setAutoCommit (), establezca el valor de autoCommit en falso.
#5) Ejecutó la consulta de actualización de EMPNUM = 2001 y creó otra conexión para la misma Base de datos y seleccionó el valor de EMPNUM = 2001.
#6) Los datos resultantes del Empleado cuyo EMPNUM = 2001 no son los datos actualizados. Porque no hemos realizado la operación commit (). Si ha utilizado la misma conexión donde la ha utilizado para actualizar, le habría mostrado los datos actualizados. Ahora comprometió los datos. Los datos se han reflejado en la tabla.
#7) Se creó un punto de guardado después de la operación de confirmación.
#8) Usando la consulta de selección para mostrar datos de EMPNUM = 2002. Cambió el salario de ese empleado usando una consulta de actualización. Posteriormente se muestran los datos del EMPNUM = 2002, usando la misma conexión. Debería mostrar los datos actualizados.
#9) Realice la reversión hasta el último punto de guardado utilizando el método de reversión. Ahora, cuando hemos mostrado los datos de ese empleado usando la misma conexión, tiene los datos antiguos porque la reversión deshace los cambios hasta el último punto de guardado si mencionamos otro punto de guardado en la última confirmación.
#10) Hemos creado un método que mostrará los datos porque aquí mostramos datos muchas veces.
Tipos de datos JDBC
Las bases de datos tienen tipos de datos SQL y Java tiene tipos de datos Java. Debe haber un mecanismo para leer y escribir datos entre una aplicación Java y una base de datos. Diferentes bases de datos admiten tipos de SQL, pero con algunas variaciones en el nombre.
Por ejemplo, la mayoría de las bases de datos admiten valores binarios grandes, Oracle lo llama LONG RAW, Sybase lo llama IMAGE, Informix lo llama BYTE y DB2 lo llama LONG VARCHAR FOR BIT DATA.
Mientras escribimos el programa JDBC, no necesitamos preocuparnos por los tipos de datos SQL utilizados por la base de datos de destino. JDBC tiene un conjunto de identificadores de tipo SQL genéricos en la clase java.sql.Types. Estos tipos están diseñados para admitir la mayoría de los tipos de datos SQL genéricos. Al escribir un programa JDBC, solo usaremos tipos de datos JDBC.
El controlador JDBC convertirá los tipos de datos de Java en tipos de datos de base de datos de ida y vuelta. Puede usar el método java.sql.DatabaseMetaData.getTypeInfo para verificar qué tipos de SQL son realmente compatibles con una base de datos determinada y luego escribir un programa. JDBC usa una asignación predeterminada para la mayoría de los tipos de datos.
Por ejemplo, la cadena de Java se convertirá en un tipo SQL VARCHAR.
Veremos cómo se realiza el mapeo en el método setXXX, getXXX y updateXXX de las interfaces PreparationStatement o CallableStatement o ResultSet en la siguiente tabla:
| TIPO SQL | TIPO JAVA / JDBC | setXXX | getXXX | updateXXX |
|---|---|---|---|---|
| ENTERO | En t | setInt | teñido | updateInt |
| CARBONIZARSE | java.lang.String | setString | getString | updateString |
| VARCHAR | java.lang.String | setString | getString | updateString |
| LONGVARCHAR | java.lang.String | setString | getString | updateString |
| UN POCO | booleano | setBoolean | getBoolean | updateBoolean |
| NUMÉRICO | java.math.BigDecimal | setBigDecimal | getBigDecimal | UpdateBigDecimal |
| PEQUEÑO | pequeño | setShort | getShort | updateShort |
| EMPEZANDO | largo | setLong | getLong | updateLong |
| REAL | flotador | setFloat | getFloat | updateFloat |
| FLOTADOR | flotador | setFloat | getFloat | updateFloat |
| DOBLE | doble | setDouble | getDouble | updateDouble |
| BINARIO | byte() | setBytes | getBytes | updateBytes |
| FECHA | java.sql.Date | Establece la fecha | obtener la fecha | fecha de actualización |
| HORA | java.sql.Time | fijar tiempo | consigue tiempo | tiempo de actualizacion |
| TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp | updateTimeStamp |
| CLOB | java.sql.Clob | setClob | getClob | updateClob |
| GOTA | java.sql.Blob | setBlob | getBlob | updateBlob |
| FORMACIÓN | Formación | setArray | getArray | updateArray |
| XML | XML | setSQLXML | getSQLXML | actualizarSQLXML |
| Tipo estructurado | Objeto | setObject | getObject | updateObject |
Hemos establecido el método setXXX, getXXX y updateXXX para los tipos de datos básicos en nuestros tutoriales anteriores. Puedes referirte a eso.
Aquí, hemos explicado los tipos clob y blob en el siguiente ejemplo.
Programa de ejemplo BLOB
|_+_|Producción:

El archivo se ha guardado correctamente en la ruta indicada.

Explicación:
En el programa anterior lo que hemos hecho es Primero hemos creado / guardado una imagen en la carpeta 'D: \ Bhakiya \ Bhakiya \ JDBC' . Esta ubicación es solo por ejemplo. Puede crear su propia ruta de archivo en su sistema. El nombre del archivo es una imagen de prueba de software. Luego creamos un programa Java para almacenar esa imagen en la tabla DB y recuperar la imagen de la tabla y almacenarla en el sistema local.
Hasta ahora hemos discutido la descripción general de la tarea. Ahora veremos cómo lo logramos en el programa.
#1) Cree una tabla en DB para almacenar la imagen.
Sintaxis:
|_+_|En la consulta anterior, tenemos 2 columnas.
- PicName - varchar2 -> Se utiliza para almacenar el nombre de la imagen
- imagen - BLOB -> Se utiliza para almacenar la imagen en la tabla.
El tipo de datos BLOB se utiliza para almacenar la imagen / imagen en la tabla DB.
#2) La conexión y la declaración se han creado y se han llamado al método de ejecución para ejecutar la consulta CREATE.
|_+_|#3) A continuación, hemos creado la consulta de inserción y la hemos ejecutado utilizando PreparedStatement.
Sintaxis de PreparedStatement:
|_+_|#4) Usando setString () - establezca el nombre de la imagen.
#5) Para configurar la imagen, use la clase FileInputStream para pasar la ubicación de la imagen.
Sintaxis:
|_+_|Luego, usando el método setBlob (), podemos establecer la imagen en el objeto PreparedStatement. Después de eso, se llama al método de ejecución de PreparedStatement. Eso insertará los datos dados en la Tabla.
Después de ejecutar la consulta de inserción, al usar el objeto ResultSet, estamos recuperando los datos de la tabla (usando Seleccionar consulta).
#6) Al usar el método getString, podemos obtener el valor de la columna PicName.
#7) Para obtener la imagen, siga los pasos a continuación:
- Cree el objeto Blob y asigne los valores de retorno del método getBlob del objeto ResultSet.
- La sintaxis para eso es: Blob blob1 = rs.getBlob ();
- Cree un objeto de matriz de bytes y obtenga el valor del objeto Blob en bytes.
- Cree el objeto FileOutputStream y pase la ruta completa para almacenar la imagen en esa ruta. Llame al método write () del objeto FileOutputStream, que almacenará la imagen.
- Después de eso, el programa se ha ejecutado con éxito.
#8) Vaya a la ubicación de la imagen de salida y compruebe si la entrada y la salida son iguales.
Programa de ejemplo CLOB
|_+_|Producción:

Fichero de entrada:

El archivo se ha guardado correctamente en la ruta indicada.

Archivo de salida:

Explicación:
En el programa anterior, lo que hicimos fue primero crear / guardar un archivo de texto “file1.txt” en la carpeta “D: \ Bhakiya \ Bhakiya \ JDBC”. Esta ubicación es solo por ejemplo. Puede crear su propia ruta de archivo en su sistema. Luego, creamos un programa Java para almacenar ese archivo en la tabla de base de datos y recuperar ese archivo de la tabla y almacenarlo en el sistema local.
Hasta ahora hemos discutido la descripción general de la tarea. Ahora veremos cómo lo logramos en el programa.
#1) Cree una tabla en DB para almacenar la imagen.
A continuación se muestra la sintaxis de la consulta CREATE TABLE:
|_+_|En la consulta anterior, tenemos 2 columnas.
- FileName - varchar2 -> Se utiliza para almacenar el nombre de la imagen.
- StoreFile - CLOB -> Se utiliza para almacenar el archivo en la tabla.
El tipo de datos CLOB se utiliza para almacenar el tipo de caracteres de datos binarios en la tabla de base de datos
#2) La conexión y la declaración se han creado y se han llamado al método de ejecución para ejecutar la consulta CREATE.
|_+_|#3) A continuación, hemos creado la consulta de inserción y la hemos ejecutado usando PreparedStatement.
Sintaxis de PreparedStatement:
|_+_|#4) Usando setString () - establezca el nombre del FileName.
#5) Para configurar / almacenar el archivo, use la clase FileReader para pasar el archivo con la ubicación de relleno.
Sintaxis:
|_+_|Luego, usando el método setClob (), podemos configurar el archivo en el objeto PreparedStatement. Después de eso, se llamó al método de ejecución de PreparedStatement. Eso insertará los datos dados en la Tabla.
Después de ejecutar la consulta de inserción, utilizando el objeto ResultSet, estamos recuperando los datos de la tabla (utilizando la consulta de selección).
Seleccionar consulta:
|_+_|#6) Usando el método getString podemos obtener el valor de la columna FileName.
#7) Para obtener el archivo, hemos seguido los siguientes pasos:
- Cree el objeto Clob y asigne los valores de retorno del método getClob del objeto ResultSet.
- La sintaxis para eso es: Clob clob1 = rs.getClob ();
- Cree el objeto Reader y obtenga el valor del objeto Clob como Character.
- Cree el objeto FileWriter y pase la ruta completa para almacenar el archivo en esa ruta. Llame al método write () del objeto FileWrite, que escribirá los datos en el archivo en la ubicación.
- Después de eso, el programa se ha ejecutado con éxito.
#8) Vaya a la ubicación del archivo de salida y verifique si los archivos de entrada y salida son iguales.
Puntos para recordar:
- Propiedades de ACID explica la gestión de transacciones en la base de datos.
- Commit (), rollback () y savepoint son las operaciones más importantes en Transaction Management.
- Commit hará los cambios de forma permanente en DB, Rollback deshará los cambios hasta la última confirmación o el punto de guardado mencionado y Savepoint ayuda a crear un punto de control.
- La base de datos mantiene los tipos de datos SQL y Java mantiene los tipos de datos Java. El controlador JDBC se utiliza para manejar esta conversión.
- El propio controlador JDBC tiene algún tipo de identificadores SQL, por lo que el programador no tiene que preocuparse por los tipos de datos.
Preguntas frecuentes
P # 1) ¿Qué es el tipo de datos JDBC?
Responder: Java tiene sus tipos de datos y la base de datos tiene sus tipos de datos. El controlador JDBC convierte el tipo de datos de Java en el tipo de datos SQL apropiado que aceptará la base de datos. Los objetos ResultSet también proporcionan métodos setXXX () y métodos getXXX () disponibles para los tipos de datos apropiados.
P # 2) ¿Cuál es el tipo de datos para la fecha en Java?
Responder: La fecha en Java no es solo un tipo de datos, sino una clase. Una fecha en Java tiene la fecha, la hora, el año, el nombre del día, el día de la semana y la zona horaria. La clase de fecha tiene los métodos adecuados para recuperar los datos relevantes.
P # 3) ¿Cuál es la diferencia entre java.util.Date y java.sql.Date?
Responder: La principal diferencia es que java.util.Date también tiene información sobre la fecha y la hora. Pero java.sql.Date solo tiene información sobre la fecha. Esta es la principal diferencia: no podemos asignar java.util.Date directamente con java.sql.Date.
P # 4) ¿Tenemos una clase en Java para representar el tipo TIME y TIMESTAMP para SQL?
Responder: Sí, tenemos una clase para el tipo TIME y TIMESTAMP para SQL. La clase java.sql.Time representa información relacionada con el TIEMPO. La clase java.sql.timestamp representa información relacionada con TIMESTAMP.
P # 5) ¿Cómo iniciar una transacción en JDBC?
Responder: La conexión JDBC comienza con el modo de confirmación automática habilitado, donde cada declaración SQL se considera una transacción. No existe un proceso específico para iniciar una transacción en JDBC. Cuando crea una conexión y comienza a ejecutar la instrucción SQL, ahí es donde comienza la transacción.
P # 6) ¿Qué es el método commit () en Java?
Responder: El método Commit () en Java se utiliza para guardar los cambios realizados desde la última confirmación (). El método Commit () está disponible en la interfaz de conexión. Usando un objeto de conexión, podemos llamar a commit ().
P # 7) ¿Cuál es el método de reversión en Java?
Responder: Después de la última confirmación (), si ha ocurrido algún problema, podemos llamar al método rollback () para revertir todos los cambios realizados hasta que el último método commit.rollback () esté disponible en la interfaz de conexión. Usando un objeto de conexión, podemos llamar al método rollback ().
Conclusión
Aquí, hemos cubierto los tipos de datos en Java y DB y cómo los maneja el controlador JDBC. Hemos hablado de las propiedades del ÁCIDO. Eso es lo más importante para el campo bancario. Será de gran ayuda para tu carrera. En la sección Gestión de transacciones, hemos analizado los métodos de confirmación y reversión como commit (), rollback (), setAutoCommit (), setSavepoint () y releaseSavepoint ().
Lectura recomendada
- Tutorial de Java JDBC: ¿Qué es JDBC (conectividad de base de datos Java)?
- Tutorial de conexión Java JDBC con ejemplo de programación
- JDBC DriverManager, JDBC PreparedStatement y Statement
- JDBC ResultSet: cómo utilizar Java ResultSet para recuperar datos
- Tipos de datos, bucles, matrices, conmutadores y aserciones de Java
- Método Java String length () con ejemplos
- ¿Cómo utilizar el método toString de Java?
- Prueba de la base de datos de selenio (utilizando WebDriver y la API de JDBC)