CONECTIVIDAD CON BASES DE DATOS

Documentos relacionados
APÉNDICE A: ACCESO A UNA BASE DE DATOS CON JDBC

Laboratorio de Programación III

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Base de Datos JDBC. Unidad: 1 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

JDBC. Aplicaciones Distribuidas

Tópicos Avanzados de Programación (TAP3501)

Módulo 15. Introducción a JDBC, Java Database Connectivity. Programación Orientada a Objetos Página 16.0 de 25

Java y Access. 4. En nuestra pantalla aparecerá ahora la pestaña DSN usuario seleccionada. Para crear un nuevo perfil haremos click en Agregar...

Base de Datos MySQL. 4.1 MySQL. Capítulo Características de mysql

10. JDBC. 10. JDBC Introducción. java.sql

Conexión JDBC. Tecnicatura Superior en Programación UTN-FRM Programación 3

ARTE I BASE DE DATOS EN JAVA

JDBC - Acceso a Bases de Datos

Acceso a bases de datos desde Java: JDBC

Curso Básico de JDBC. Rodolfo Campos Madrid, Septiembre de 2012

PROGRAMACIÓN CON ACCESO A DATOS

Java y MySQL. Ciclo de ejecución

JDBC: Java DataBase Conectivity

Lenguaje Java Avanzado

Acceso a bases de datos desde Java: JDBC

Prácticas Ingeniería del Software 3º

Contenido. Bases de Datos en Java: JDBC y Patrón DAO 26/04/2007

JAVA 5. Conexión con Bases de Datos

JDBC. Francisco Javier Solans Benedí Software Developper

Tema V. JDBC. Desarrollo de Aplicaciones para Internet Curso 12 13

Base de Datos JDBC. Unidad: 1 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

Bases de Datos usando Java : JDBC. Ing. César Julio Bustacara Medina

Diseño de la capa de datos. Acceso a datos con JDBC

Acceso a BD desde Java. JDBC

Java y MySQL. Ciclo de ejecución

Desarrollo de Software con

JDBC. Una mini-introducci. introducción

Aplicaciones Web (Curso 2014/2015)

MEDIA TÉCNICA DESARROLLO DE SOFTWARE GUIA DE APRENDIZAJE # No.0 Módulo Elementos de software 1

Apuntes de Java. Tema 12: JDBC. Uploaded by Ingteleco

Computación Web (Curso 2013/2014)

Qué es JDBC? Cuatro tipos de drivers JDBC Uso de JDBC

Acceso a BDs en Java: JDBC

Java con Bases de Datos

Computación Web (Curso 2015/2016)

Conexiones a BD. Juan Manuel Espinoza Marquez CFT San Agustín Linares -2012

Laboratorios de BASES DE DATOS. (I.T. Informática)

Bases de datos y JDBC

BASES DE DATOS. Ingeniería Informática. Matemáticas e Informática

Tablas -SQL Curso Bases de Datos. Por Elizabeth León Guzmán, Ph.D. Profesora Ingeniería de Sistemas Grupo de Investigación MIDAS

Servlets y JSP. Qué son CGI? 04/03/2014

Bases de Datos Ejercicio Número 2 Bogotá, Diciembre 5 de 2013

Práctica 2 ACCESO A BASES DE DATOS CON JDBC. 1. Creación de una base de datos en MySQL...1

Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicitos combinados con un estructura de bloque.

SQL Sintaxis. Ejemplo de Alumno, Curso, Profesor. Esquemas de Alumno, Curso, Profesor. Andrés Moreno S.

NORMAS PARA LA ENTREGA DE LOS LABORATORIOS

Python desde Cero: Bases de Datos

Capítulo II. Marco Teórico

Creación de proyectos usando Java/MySQL

Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:

Capa de Gestión de Datos. Persistencia Bases de Datos - JDBC

Acceso a bases de datos con JDBC

INFORMÁTICA MÉDICA. Profesor: MsC. Liz Armenteros Chávez

SQL Sintaxis. OpenOffice. Ejemplo de Alumno, Curso, Profesor. Ejemplo de Alumno, Curso, Profesor. Andrés Moreno S. Nombre. Apellido. RutAlumno.

Bases de Datos Introducción a la Conectividad de

Java Database Connectivity

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS

Formato para prácticas de laboratorio

En esta clase crearemos los métodos que nos permitan establecer la comunicación, llevar información y buscar en la base de datos.

MANUAL BÁSICO DE MYSQL

5.1. O b jetiv o M o tiv ac ió n

Guía práctica de introducción básica a JDBC

Universidad Don Bosco. Materia: Programación Orientada a Objetos Contenido: Modificadores de Acceso y JDBC

PL/SQL avanzado: Secuencias, triggers, cursores y subprogramas

Bases de Datos Relacionales y SQL: Una Introducción

PRÁCTICA DE ADO.NET. Algunos tipos de datos más utilizados son los siguientes:

2.3.4 Estrategias de generación de claves primarias

Curso: Microsoft SQL Server 2005

Tema: DISPARADORES (TRIGGERS)

Base de datos II Facultad de Ingeniería. Escuela de computación.

Integración script de servidor con los sistemas gestores de base de datos

MSSQL Server Java

C.I.F.: B Inscrita en el Registro Mercantil de Madrid, Tomo Libro 0, Folio 135, Sección 8. Hoja M Inscripción 1ª

Unidad 5. Lenguaje Estructurado de Consultas SQL

Practica 11: Conexión de Java con Bases de datos Access

Bases de Datos Relacionales. Conceptos y consideraciones para su uso.

PROGRAMA ACADÉMICO DE TECNOLOGÍAS DE LA INFORMACIÓN. actividad Transacciones en MySQL. como requerimiento parcial para acreditar la asignatura de

Los procedimientos almacenados son nuevas funcionalidades de la versión de MySQL 5.0. Un procedimiento

JDBC: Conexiones con bases de datos desde Java

Ciclo Formativo de Grado Superior de Administración de Sistemas Informáticos en red

Oracle Database 12c SQL and PLSQL Fundamentals

Computación Web (Curso 2015/2016)

JDBC: Conexiones con bases de datos desde Java

PHP y MySQL Domine el desarrollo de un sitio Web dinámico e interactivo (3ª edición)

Base de Datos Oracle: desarrollo de aplicaciones

Computación distribuida

Introducción a PL/SQL

Introducción a SQL (DDL)

-- PROCEDIMIENTOS ALMACENADOS

Programación con acceso a base de datos

El SQL es un lenguaje estándar de programación para el acceso a bases de datos.

Transcripción:

CONECTIVIDAD CON BASES DE DATOS Una base de datos es una colección organizada de datos ; ahora, esta puede tener muchas formas: un documento XML, un archivo o conjunto de archivos, objetos almacenados o, datos relacionados. Estos diferentes tipos de bases de datos trabajan mejor en ciertas circunstancias, pero su objetivo sigue siendo siempre el organizar los datos. El tipo más popular de base de datos es el "Relacional". El modelo relacional fue ideado por el Dr. Edgar Codd, en 1969, se encuentra regido por la Teoría del Álgebra Relacional, y desde entonces es el tipo de base de datos dominante. Los datos en una base de datos relacional se encuentran organizados en tablas; una tabla consiste de filas y columnas, donde cada columna define un campo y cada fila es un registro. El orden físico de los datos no importa. En una base de datos, correctamente diseñada, cada columna contendrá solo un valor; la clave primaria identificará únicamente el registro (es decir, la fila de datos). Cada tabla puede tener más de un tipo de clave, además de la clave primaria; pueden existir claves foráneas, que es una referencia a la clave de otra tabla, y que plasma la relación entre las tablas. El modelo relacional especifica los siguientes tipos de relaciones: Uno a uno: En una relación uno a uno, un registro en una tabla referencia exactamente un registro en otra tabla, y la clave foránea referencia exactamente una clave primaria. Uno a muchos: En una relación uno a muchos, un registro en una tabla referencia muchos registros en otra tabla, pero la clave foránea referencia exactamente un registro en la tabla primaria. Muchos a muchos: en una relación muchos a muchos, muchos registros en una tabla pueden referenciar a muchos registros en otra tabla; pero ya que la tabla primaria debe ser única, una relación muchos a muchos no puede ser establecida directamente. De esta manera la relación es generalmente expresada, en una tabla adicional que funciona como un vínculo de estas tablas, proporcionando dos (2) relaciones uno a muchos. El modelo relacional ofrece una gama de lenguajes para poder interactuar con ellos: SQL (Structured Query Language Lenguaje Estructurado de Consultas ), QBE (Query By Example Consultas mediante Ejemplos). Actualmente hay una diversidad de Sistemas de Administración de Bases de Datos, entre las comerciales están los productos de Oracle Corp., Microsoft Corp., IBM Corp., Sybase Inc., y entre las pocas Open Source disponibles destacan MySQL, PostgreSQL e HypersonicSQL. Java ofrece todo un API para realizar operaciones a nivel del lenguaje SQL con una base de Datos, esta API es conocida como el JDBC (Java DataBase Connectivity) y es un medio fácil para poder desarrollar aplicaciones con Sintaxis completamente SQL. Los proveedores de bases de datos soportan el API JDBC mediante la implementación de un Driver o Controlador específico, el cual tiene que ser configurado en la JVM (Java Virtual Machine Máquina Virtual de Java) o especificado en tiempo de ejecución por la Aplicación; de estas formas las aplicaciones Java que interactúen con Bases de Datos aseguran en lo posible una máxima portabilidad e independencia de plataforma. El API JDBC (http://java.sun.com/products/jdbc) tiene varias implementaciones (actualmente se encuentra en revisión la 4.0), las cuales se encuentran especificadas como librerías: java.sql.* y javax.sql.* y que no son soportadas íntegramente por los controladores específicos de las Bases de Datos. ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 1

La secuencia de realización de operaciones o transacciones SQL, que se deben implementar en las aplicaciones es generalmente la siguiente: Paso 1: Establecer una conexión. Paso 2: Crear una sentencia JDBC. Paso 3: Realizar la operación SQL a través de la sentencia JDBC y procesar resultados. Paso 4: Cerrar la conexión. Paso 5: Manejar las excepciones. A continuación se van a presentar algunos casos puntuales: Paso 1: Cómo establecer una Conexión: Lo primero que tenemos que hacer es establecer una conexión con el controlador de base de datos que queremos utilizar. Esto implica dos procesos: (1) cargar el driver y (2) hacer la conexión. Cargar los Drivers: Cargar el driver o drivers que queremos utilizar es muy sencillo y sólo implica una línea de código. Si, por ejemplo, queremos utilizar el puente JDBCODBC, se cargaría la siguiente línea de código: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Para el caso del driver JTDS que nos permite conectarnos a bases de datos MS SQL SERVER y SYBASE, se utiliza la siguiente línea de código: Class.forName("net.sourceforge.jtds.jdbc.Driver"); La documentación del driver nos dará el nombre de la clase a utilizar. Por ejemplo, si el nombre de la clase es jdbc.driverxyz, cargaríamos el driver con esta línea de código. Class.forName("jdbc.DriverXYZ"); Una vez cargado el driver, es posible hacer una conexión con un controlador de base de datos. Establecer la Conexión: El segundo paso para establecer una conexión es tener el driver apropiado conectado al controlador de base de datos. La siguiente línea de código ilustra la idea general. Connection conexion = DriverManager.getConnection(url, "mylogin", "mypassword"); Como generalmente nos conectamos a bases de datos MS SQL Server con la cuenta del administrador, la línea será: Connection conexion = DriverManager.getConnection(url, "sa", ""); La variable url es la ubicación exacta del esquema de base de datos con que se va a trabajar sigue el siguiente esquema protocolo:subprotocolo://servidor/basedatos Pero como en el curso nos conectamos a bases de datos MS SQL Server, de las cuales generalmente sólo conocemos las direcciones IP, el proceso será: String url = "jdbc:jtds:sqlserver://10.0.1.233:1433/pubs"; Connection conexion = DriverManager.getConnection(url,"sa",""); Si alguno de los drivers que hemos cargado reconoce la URL suministrada por el método DriverManager.getConnection(), dicho driver establecerá una conexión con el controlador de base de datos especificado en la URL del JDBC. La clase DriverManager, como su nombre indica, maneja todos los detalles del establecimiento de la conexión detrás de la escena. La conexión devuelta por el método DriverManager.getConnection() es una conexión abierta que se puede utilizar para crear sentencias JDBC que pasen nuestras sentencias SQL al controlador de la base de datos. Paso 2: Crear sentencias JDBC: ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 2

Un objeto Statement es el que envía nuestras sentencias SQL al controlador de la base de datos, simplemente creamos un objeto Statement y lo ejecutamos, suministrando el método SQL apropiado con la sentencia SQL que queremos enviar. Para una sentencia SELECT, el método a ejecutar es executequery(). Para sentencias que crean o modifican tablas, el método a utilizar es executeupdate(). Se toma un ejemplar de una conexión activa para crear un objeto Statement. En el siguiente ejemplo, utilizamos nuestro objeto Connection: conexion para crear el objeto Statement: stmt. Statement stmt = conexion.createstatement(); En este momento stmt existe, pero no tiene ninguna sentencia SQL que pasarle al controlador de la base de datos. Necesitamos suministrarle el metodo que utilizaremos para ejecutar stmt. Por ejemplo, en el siguiente fragmento de código, suministramos executeupdate() para poder crear una tabla. stmt.executeupdate("create TABLE UBIGEO (DEPARTAMENTO CHAR(2), PROVINCIA CHAR(2), DISTRITO CHAR(2), NOMBRE VARCHAR(100))"); También se puede hacer esto: String sql = "CREATE TABLE UBIGEO (DEPARTAMENTO CHAR(2), PROVINCIA CHAR(2), DISTRITO CHAR(2), NOMBRE VARCHAR(100))"; stmt.executeupdate(sql); ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 3

Paso 3: Realizar operaciones SQL: Las sentencias SQL referidas al lenguaje de Definición de Datos (creación, modificación y eliminación de tablas y elementos SQL) se ejecutan con el método executeupdate(). Igualmente el método executeupdate() también se utiliza para ejecutar sentencias SQL que actualizan una tabla (update, delete, insert). En la práctica executeupdate() se utiliza más frecuentemente para actualizar tablas que para crearlas porque una tabla se crea sólo una vez, pero se puede actualizar muchas veces. El método más utilizado para ejecutar sentencias SQL es executequery(). Este método se utiliza para ejecutar sentencias SELECT, que comprenden la amplia mayoría de las sentencias SQL. Introducir Datos en una Tabla: Si se desea introducir un registro en la base de datos, lo que se debe hacer es lo siguiente: Teniendo una conexión y sentencia lista, se debe preparar una cadena con la operación sql y luego debemos realizar un executeupdate() desde la sentencia JDBC. Statement stmt = conexion.createstatement(); String sql = "insert into Persona(DNI, APELLIDOS, NOMBRES) "+ values(`12345678', `GRAU SEMINARIO', `MIGUEL') "; stmt.executeupdate(sql); Recuperar Valores: Para realizar consultas y procesar sus datos, las sentencias JDBC deben utilizar el método executequery() el cual retorna un objeto hoja de resultados o ResultSet. El siguiente código presenta el objeto ResultSet: rs y le asigna el resultado de una consulta anterior. ResultSet rs = stmt.executequery("select * FROM PERSONA"); Utilizar el método next(): La variable rs, que es un ejemplar de ResultSet, contiene las filas de DNIs, apellidos y nombres mostrados en el juego de resultados. Para acceder a los DNIs, apellidos y nombres, iremos a la fila y recuperaremos los valores de acuerdo con sus tipos. El método next() mueve el cursor a la siguiente fila y hace que esa fila (llamada fila actual) sea con la que podamos operar. Como el cursor inicialmente se posiciona justo encima de la primera fila de un objeto ResultSet, primero debemos llamar al método next() para mover el cursor a la primera fila y convertirla en la fila actual; sucesivas invocaciones del método next() moverán el cursor de línea en línea de arriba a abajo. En el API JDBC 2.0, se puede mover el cursor hacia atrás, hacia posiciones específicas y a posiciones relativas a la fila actual además de mover el cursor hacia adelante. Utilizar los métodos getxxx(*): Los métodos getxxx del tipo apropiado se utilizan para recuperar el valor de cada columna. Por ejemplo, la primera columna de cada fila de rs es DNI, que almacena un valor del tipo CHAR de SQL. El método para recuperar un valor VARCHAR es getstring(). Cada vez que se llama al método next() la siguiente fila se convierte en la actual, y el bucle continúa hasta que no haya más filas en rs. String sql = "SELECT * FROM PERSONA"; ResultSet rs = stmt.executequery(sql); while (rs.next()) { String a = rs.getstring("dni"); String b = rs.getfloat("apellidos"); String c = rs.getfloat("nombres"); out.println(a + " " + b + "" + c ); JDBC ofrece dos formas para identificar la columna de la que un método getxxx obtiene un valor. ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 4

Una forma es dar el nombre de la columna, como se ha hecho arriba. La segunda forma es dar el índice de la columna (el número de columna), con un 1 significando la primera columna, un 2 para la segunda, etc. Si se utilizara el número de columna en vez del nombre de columna el código anterior se podría parecer a esto: String a = rs.getstring(1); String b = rs.getfloat(2); String c = rs.getfloat(3); La primera línea de código obtiene el valor de la primera columna de la fila actual de rs (el DNI), convirtiéndolo a un objeto String de Java y asignándolo a "a". La segunda línea de código obtiene el valor de la segunda columna de la fila actual de rs, lo convierte a otro String de Java y lo asigna a "b", y es el mismo proceso con "c". El número de columna se refiere al número de columna en la hoja de resultados, no en la tabla original. En suma, JDBC permite utilizar tanto el nombre cómo el número de la columna como argumento a un método getxxx. Utilizar el número de columna es un poco más eficiente, y hay algunos casos donde es necesario utilizarlo. JDBC permite muchas modos de utilizar los métodos getxxx para obtener diferentes tipos de datos SQL. Por ejemplo, el método getint puede ser utilizado para recuperar cualquier tipo numérico de caracteres. Los datos recuperados serán convertidos a un int; esto es, si el tipo SQL es VARCHAR, JDBC intentará convertirlo en un entero. Se recomienda utilizar el método getint() sólo para recuperar INTEGER de SQL, sin embargo, no puede utilizarse con los tipos BINARY, VARBINARY, LONGVARBINARY, DATE, TIME, o TIMESTAMP de SQL. En la tabla a continuación se presentan los diversos métodos getxxx() de los que dispone la hoja de resultados y donde: Una "x" indica que el método getxxx se puede utilizar para recuperar el tipo JDBC dado. Una "xx" indica que el método getxxx está recomendado para recuperar el tipo JDBC dado. tinyint smallint integer bigint real float double decimal numeric bit char getbyte x x x x x x x x x x x getshort x x x x x x x x x x x getint x x x x x x x x x x x getlong x x x x x x x x x x x getfloat x x x x x x x x x x x getdouble x x x x x x x x x x x getbigdecimal x x x x x x x x x x x getboolean x x x x x x x x x x x getstring x x x x x x x x x x x getbytes getdate x gettime x gettimestamp x getasciistream x getunicodestream x getbinarystream getobject x x x x x x x x x x x Actualizar Tablas: ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 5

Utilizando la tecnología JDBC, la actualización de registros en una tabla es una labor muy similar al ingreso se registros, ya que se deben preparar sentencias SQL (comenzando con UPDATE) y utilizar el método executeupdate() del objeto sentencia JDBC (Statement). String updatestring = "UPDATE Persona " + "SET APELLIDOS = MELENDRES FU " + "WHERE DNI = '77889900' "; stmt.executeupdate(sql); Utilizar Sentencias Preparadas: Si se va a utilizar muchas veces un un objeto Sentencia JDBC (Statement), para procesar una consulta, actualización, o inserción en la cual de todo el Script sql sólo cambian los valores, se puede reducir el tiempo de ejecución si se utiliza un objeto Sentencia Preparada (PreparedStatement). La característica principal de un objeto PreparedStatement es, que al contrario de un objeto Statement, se le entrega una sentencia SQL cuando se crea. La ventaja de esto es que en la mayoría de los casos, esta sentencia SQL se enviará al controlador de la base de datos inmediatamente, donde será compilado. Como resultado, el objeto PreparedStatement no sólo contiene una sentencia SQL, sino una sentencia SQL que ha sido precompilada. Esto significa que cuando se ejecuta la PreparedStatement, el controlador de base de datos puede ejecutarla sin tener que compilarla primero. Aunque los objetos PreparedStatement se pueden utilizar con sentencias SQL sin parámetros, lo mejor es utilizarla con parámetros. La ventaja de utilizar sentencias SQL que utilizan parámetros es que podemos utilizar la misma sentencia y suministrar distintos valores cada vez que la ejecutemos. Crear un Objeto PreparedStatement: Al igual que los objetos Statement, se crea un objeto PreparedStatement con un objeto Connection. Utilizando nuestra conexión con abierta en ejemplos anteriores, podríamos escribir lo siguiente para crear un objeto PreparedStatement que tome un parámetro de entrada. PreparedStatement consultadni = con.preparestatement("select * FROM PERSONA WHERE DNI =? "); en este caso el parámetro va a ser el valor de DNI. Los parámetros son establecen invocando alguno de los métodos setxxx definidos en la clase PreparedStatement. Si el valor que va a sustituir una marca de interrogación es un int de Java, se puede llamar al método setint; si el valor es un String de Java, se puede llamar al método setstring, etc. En general, hay un método setxxx para cada tipo Java. consultadni.setstring(1, 66778899 ); ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 6

El primer argumento de un método setxxx() indica la marca de interrogación que se va a reemplazar, y el segundo argumento es el valor a poner. Una vez que a un parámetro se ha asignado un valor, el valor permanece hasta que lo reinicie con otro valor o se llame al método clearparameters(): consultadni.setstring(1, 11223344 ); ResultSet rs = consultadni.executequery(); //Procesar resultados del rs para la primera consulta consultadni.setstring(1, 55667788 ); rs = consultadni.executequery(); //Procesar resultados del rs para la primera consulta consultadni.setstring(1, 66778899 ); rs = consultadni.executequery(); Utilizar Transacciones: Una transacción es un conjunto de una o más sentencias que se ejecutan como una unidad, por eso o se ejecutan todas o no se ejecuta ninguna. Cuando se crea una conexión, está en modo auto-entrega. Esto significa que cada sentencia SQL individual es tratada como una transacción y será automáticamente entregada justo después de ser ejecutada. (Para ser más preciso, por defecto, una sentencia SQL será entregada cuando está completa, no cuando se ejecuta. Una sentencia está completa cuando todas sus hojas de resultados y cuentas de actualización han sido recuperadas. Sin embargo, en la mayoría de los casos, una sentencia está completa, y por lo tanto, entregada, justo después de ser ejecutada). La forma de permitir que dos o más sentencia sean agrupadas en una transacción es desactivar el modo auto-entrega. Esto se demuestra en el siguiente código, donde con es una conexión activa. con.setautocommit(false); Una vez que se ha desactivado la auto-entrega, no se entregará ninguna sentencia SQL hasta que llamemos explícitamente al método commit() de la variable conexión. Todas las sentencias ejecutadas después de la anterior llamada al método commit() serán incluidas en la transacción actual y serán entregadas juntas como una unidad. El siguiente código, en el que con es una conexión activa, ilustra una transacción. con.setautocommit(false); PreparedStatement actualizapersona = con.preparestatement( "UPDATE PERSONA SET NOMBRE=? WHERE DNI =? "); actualizapersona.setstring(1, 66778899 ); actualizapersona.setstring(2, "Paco"); actualizapersona.executeupdate(); PreparedStatement actualizaapellido = con.preparestatement( "UPDATE PERSONA SET APELLIDO =? WHERE DNI =?"); actualizapersona.setstring(1, 66778899 ); actualizapersona.setstring(2, " Pérez"); actualizapersona.executeupdate(); con.commit(); con.setautocommit(true); Utilizar Transacciones para Preservar la Integridad de los Datos: ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 7

Además de agrupar las sentencias para ejecutarlas como una unidad, las transacciones pueden ayudarnos a preservar la integridad de los datos de una tabla. Cuando ingresamos o actualizamos información de tablas relacionadas, en ocasiones se producen fallos en el ingreso de los datos primarios, por lo que los secundarios no deberían registrarse ya que se producirían datos incoherentes, en este caso se debe abortar la transacción. Esta clase de situaciones puede evitarse utilizando Transacciones. Si un controlador de base de datos soporta transacciones, y casi todos lo hacen, proporcionará algún nivel de protección contra conflictos que pueden surgir cuando dos usuarios acceden a los datos a la misma vez. El método rollback() del objeto Connection aborta la transacción y restaura los valores que había antes de intentar la actualización. Para evitar conflictos durante una transacción, un controlador de base de datos utiliza bloqueos, mecanismos para bloquear el acceso de otros a los datos que están siendo accedidos por una transacción. Una vez activado, el bloqueo permanece hasta que la transacción sea entregada o anulada. La forma en que se configuran los bloqueos está determinado por lo que se llama nivel de aislamiento de transacción, que pude variar desde no soportar transacciones en absoluto a soportar todas las transacciones que fuerzan una reglas de acceso muy estrictas. Un ejemplo de nivel de aislamiento de transacción es TRANSACTION_READ_COMMITTED, que no permite que se acceda a un valor hasta que haya sido entregado. En otras palabras, si nivel de aislamiento de transacción se selecciona a TRANSACTION_READ_COMMITTED, el controlador de la base de datos no permitirá que ocurran lecturas sucias. Abortando transacciones: Las llamadas al método rollback() aborta la transacción y devuelve cualquier valor que fuera modificado a sus valores anteriores. Si estamos intentando ejecutar una o más sentencias en una transacción y hay una excepción, se debe llamar al método rollback() para abortar la transacción y empezarla de nuevo. Paso 4: Cerrar la conexión. La conexión se cierra mediante el método close del objeto Connection. Sin embargo, siempre se debe verificar que la conexión se cierra por lo que se recomienda lo siguiente: Connection con = null; try{ //Obtener conexión //Realizar operaciones SQL con.close(); //Cerrar la conexión catch(exception error){ //Manejo de errores finally{ try{ if (con!=null&&!con.isclosed()) con.close(); catch(exception error2){ ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 8

Paso 5: Manejo de Excepciones El mecanismo del lenguaje Java para manejar excepciones involucra la utilización de bloques try y catch, debido a que Java requiere que cuando un método lanza un excepción exista un mecanismo que la maneje. Generalmente un bloque catch capturará la excepción (una clase hija de la clase Java.lang.Exception) y especificará el manejo de esta (que podría ser no hacer nada). Algunos ejemplos de excepciones son las ClassNotFoundException, que es cuando se invoca una clase no reconocida por el sistema, o los errores en el JDBC que son los SQLException. Por ejemplo el siguiente código nos permite ver el manejo: try { // Aquí va el código que podría generar la excepción. // Si se genera una excepción, el bloque catch imprimirá // información sobre ella. catch(sqlexception ex) { out.println("\n--- Una SQLException ha sido capturada ---\n"); while (ex!= null) { out.println("mensaje: " + ex.getmessage ()); out.println("estado SQL: " + ex.getsqlstate ()); out.println("código de error: " + ex.geterrorcode ()); ex = ex.getnextexception(); out.println(""); Un ejemplo de salida sería el siguiente --- Una SQLException ha sido capturada --- Mensaje: No hay objeto PERSONAS en la base de datos. Severidad 16, State 1, Line 1 Estado SQL: 42501 Código de Error: 2714 Estado SQL es un código definido en X/Open y ANSI-92 que identifica la excepción. Por ejemplo: 08001 Driver no disponible HY011 Operación inválida en este momento. El código de error del vendedor es específico de cada driver, por lo que se debe revisar la documentación del driver o controlador en búsqueda de la lista de significados de los códigos de error. Presentar advertencias: Los objetos SQLWarning son una subclase de SQLException que contiene las advertencias en los accesos a bases de datos. Las advertencias no detienen la ejecución de una aplicación, como las excepciones; simplemente alertan al usuario de que algo no ha salido como se esperaba. Por ejemplo, una advertencia puede hacernos saber que un privilegio que se quería revocar no fue revocado, o que ha ocurrido algún error durante una petición de desconexión. Una advertencia puede reportarse sobre un objeto Connection, un objeto Statement (incluyendo al ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 9

objeto PreparedStatement), o un objeto ResultSet. Cada una de esas clases tiene un método getwarnings(), al que se debe llamar para ver el primer aviso reportado en la llamada al objeto. Si getwarnings() devuelve una advertencia, se puede llamar al método getnextwarning() de SQLWarning para obtener avisos adicionales. Al ejecutar una sentencia se borran automáticamente los avisos de la sentencia anterior, por eso no se apilan. El siguiente fragmento de código ilustra como obtener información completa sobre los avisos reportados por el objeto Statement, stmt y también por el objeto ResultSet, rs. Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery(sql); while (rs.next()) { String valor1 = rs.getstring(columna); out.println("valor de la columna : "); out.println(" " + valor); SQLWarning warning = stmt.getwarnings(); if (warning!= null) { out.println("\n---advertencia---\n"); while (warning!= null) { out.println("mensaje: " + warning.getmessage()); out.println("estado SQL: " + warning.getsqlstate()); System.out.print("Código de error del vendedor: "); out.println(warning.geterrorcode()); out.println(""); warning = warning.getnextwarning(); SQLWarning warn = rs.getwarnings(); if (warn!= null) { out.println("\n---advertencia---\n"); while (warn!= null) { out.println("mensaje: " + warn.getmessage()); out.println("estado SQL: " + warn.getsqlstate()); System.out.print("Código de Error del Proveedor: "); out.println(warn.geterrorcode()); out.println(""); warn = warn.getnextwarning(); ING. INFORMÁTICO EDWIN SAÚL ALVA PANTALEÓN Pág. 10