BASES DE DATOS
Ingeniería Informática
Matemáticas e Informática
DIAPOSITIVA 1
BASES DE DATOS
Acceso a Bases de datos
en Java
DIAPOSITIVA 3
Fase 3: Crear y ejecutar consulta
Ejecutamos resulta pero no manipulamos ResultSet
DIAPOSITIVA 4
Fase 3: Crear y ejecutar consulta
Ver ejemplo – EJ3
DIAPOSITIVA 5
Fase 4: Obtener resultados (I)
Leemos el ResultSet.
DIAPOSITIVA 6
Fase 4: Obtener resultados (I)
Ver ejemplo – EJ4
DIAPOSITIVA 7
Fase 4: Obtener resultados (I)
DIAPOSITIVA 8
Fase 5: Liberar recursos
DIAPOSITIVA 9
Fase 5: Liberar recursos
¿Debemos cerrar la conexión (conn.close) tras cada
consulta? ¿Por qué?
DIAPOSITIVA 10
Fase 5: Liberar recursos
¿Debemos cerrar la conexión (conn.close) tras cada
consulta? ¿Por qué?
No, es ineficiente si se van a ejecutar varias cosas.
DIAPOSITIVA 11
Posibles errores
Errores más comunes:
• Driver no cargado (no se encuentra en classpath).
• Fallo de conexión.
• No existe la base de datos.
• Error de sintaxis en sentencia SQL.
• Errores de permisos.
• Violación reglas integridad referencial.
¿Qué/como debemos comprobar para solucionar cada
error?
DIAPOSITIVA 12
Posibles errores
Cualquier de esos errores producirá una excepción.
En función del tipo de excepción o de los datos que nos
de la misma (códigos de error, por ejemplo) podemos
saber el error concreto.
DIAPOSITIVA 13
Manejo de excepciones
DIAPOSITIVA 14
PreparedStatement
Cada vez que enviamos una consulta al SGBD, éste:
• La analiza sintácticamente (Query Processor)
• Construye un plan para ejecutarla (Query Optimizer)
DIAPOSITIVA 15
PreparedStatement
• Si tenemos un bucle donde repetidamente lanzamos la
misma query con diferentes parámetros es ineficiente
usar la clase Statement.
• Es mejor usar para estas situaciones
PreparedStatement.
• Además evita los ataques por inyección de código SQL
en Java.
DIAPOSITIVA 16
SQL Injection
Fuente: http://bit.ly/1NSAxh1
DIAPOSITIVA 17
SQL Injection
DIAPOSITIVA 18
SQL Injection
Vamos a ver el ejemplo en código:
https://youtu.be/yjNDRhie5p8
DIAPOSITIVA 19
Insert
Insertar varios registros usando PreparedStatement: más
eficiente, evitamos SQL Injection.
DIAPOSITIVA 20
Insert
Ver ejemplo – EJ2_4
DIAPOSITIVA 21
Update (I)
Actualización de registros mediante UPDATE.
DIAPOSITIVA 22
Update (I)
Ver ejemplo – EJ2_5
DIAPOSITIVA 23
Update (II)
¿Qué ocurre? ¿Qué significa ese error?
DIAPOSITIVA 24
Update (II)
Ver ejemplo – EJ2_6
DIAPOSITIVA 25
Delete (I)
¿Qué ocurre? ¿Qué significa ese error?
DIAPOSITIVA 26
Delete (I)
Ver ejemplo – EJ2_7
DIAPOSITIVA 27
Delete (II)
DIAPOSITIVA 28
Delete (II)
Ver ejemplo – EJ2_8
DIAPOSITIVA 29
Que clases y métodos usar
DIAPOSITIVA 30
Clase DatabaseMetaData
DIAPOSITIVA 31
Clase DatabaseMetaData
Ver ejemplo – EJ2_13
DIAPOSITIVA 32
Estructura de tablas
También podemos obtener información de la estructura de
tablas usando la clase ResultSetMetaData.
DIAPOSITIVA 33
Estructura de tablas
Ver ejemplo – EJ2_14
DIAPOSITIVA 34
Funciones de tiempo en Java-SQL (I)
Podemos convertir tipos de fecha en Java a SQL de forma
sencilla. Tenemos los tipos Date, Time y TimeStamp como
básicos.
Info sobre Date y Timestamp: http://stackoverflow.com/questions/409286/should-i-use-
field-datetime-or-timestamp
DIAPOSITIVA 35
Funciones de tiempo en Java-SQL (I)
Ver ejemplo – EJ2_15
DIAPOSITIVA 36
Funciones de tiempo en Java-SQL (II)
DIAPOSITIVA 37
Funciones de tiempo en Java-SQL (II)
Ver ejemplo – EJ2_16
DIAPOSITIVA 38
Funciones de tiempo en Java-SQL (III)
Insertamos fechas usando un PreparedStatement donde
pasamos la fecha con un objeto java.sql.Date
En este ejemplo pasamos directamente la fecha actual.
DIAPOSITIVA 39
Funciones de tiempo en Java-SQL (III)
Ver ejemplo – EJ2_17
DIAPOSITIVA 40
Funciones de tiempo en Java-SQL (IV)
Misma dinámica pero usando una fecha específica tanto
con Date como con Calendar.
DIAPOSITIVA 41
Funciones de tiempo en Java-SQL (IV)
Ver ejemplo – EJ2_18
DIAPOSITIVA 42
Funciones de tiempo en Java-SQL (V)
Comparación de fechas.
DIAPOSITIVA 43
Funciones de tiempo en Java-SQL (V)
Ver ejemplo – EJ2_19
DIAPOSITIVA 44
Ficheros binarios en Java (I)
Modificamos la tabla “actor” para que podamos añadir
ficheros binarios.
Crearemos una nueva columna que acepte el tipo
LONGBLOB (Binary Large Object):
ALTER TABLE `sakila`.`actor` ADD COLUMN `picture`
LONGBLOB NULL AFTER `last_update`;
DIAPOSITIVA 45
Ficheros binarios en Java (I): Enviar
Añadimos el fichero usando FileInputStream.
DIAPOSITIVA 46
Ficheros binarios en Java (I): Enviar
Ver ejemplo – EJ2_20
DIAPOSITIVA 47
Ficheros binarios en Java (II): Obtener
Guardarmos el fichero con FileOutputStream.
DIAPOSITIVA 48
Ficheros binarios en Java (II): Obtener
Ver ejemplo – EJ2_21
DIAPOSITIVA 49
Actualizar BD a través de ResultSet (I)
Actualizamos un registro: UPDATE ROW.
DIAPOSITIVA 50
Actualizar BD a través de ResultSet (I)
Ver ejemplo – EJ2_22
DIAPOSITIVA 51
Actualizar BD a través de ResultSet (II)
Actualizamos un registro: INSERT ROW.
DIAPOSITIVA 52
Actualizar BD a través de ResultSet (II)
Ver ejemplo – EJ2_23
DIAPOSITIVA 53
Actualizar BD a través de ResultSet (III)
Borramos un registro: DELETE ROW.
DIAPOSITIVA 54
Actualizar BD a través de ResultSet (III)
Ver ejemplo – EJ2_24
DIAPOSITIVA 55
Procedimientos almacenados (I)
DIAPOSITIVA 56
Procedimientos almacenados (I)
Dos formas de solucionar el acceso a procedimientos almacenados:
http://stackoverflow.com/questions/986628/cant-execute-a-mysql-
stored-procedure-from-java
DIAPOSITIVA 57
Procedimientos almacenados (I)
Ver ejemplo – EJ2_25
DIAPOSITIVA 58
ArrayList para guardar datos (I)
DIAPOSITIVA 59
ArrayList para guardar datos (I)
Obtenemos los datos y los guardamos en un ArrayList de String y los
imprimimos.
DIAPOSITIVA 60
ArrayList para guardar datos (I)
Ver ejemplo – EJ2_26
DIAPOSITIVA 61
ArrayList para guardar datos (II)
DIAPOSITIVA 62
ArrayList para guardar datos (II)
DIAPOSITIVA 63
ArrayList para guardar datos (II)
Ver ejemplo – EJ2_27
DIAPOSITIVA 64
Escritura en fichero como CSV
Añadimos la opción de CSV.
DIAPOSITIVA 65
Escritura en fichero como CSV
Escribimos los resultados en un fichero.
DIAPOSITIVA 66
Escritura en fichero como CSV
Ver ejemplo – EJ2_28