Ud 07
Ud 07
Acceso a Serialización
ficheros de ficheros
7.1 Fundamentos del
lenguaje SQL
C O M E N Z A R
Fundamentos del lenguaje SQL
DEFAULT permite especificar un valor por omisión para la columna. Si queremos indicar la
forma o característica de cada columna, se pueden utilizar las constantes:
UNIQUE. Indica que la columna no permite valores duplicados, por lo que dos filas no
pueden tener el mismo valor en esa columna. Una tabla puede contener varias
restricciones UNIQUE. Normalmente se utiliza para que el sistema compruebe que no
se añaden valores que ya existen.
Fundamentos del lenguaje SQL
Ejemplo
Observaciones CHAR(240)
)
Fundamentos del lenguaje SQL
Pa r a e s c r i b i r d a t o s e n u n a t a b l a , S Q L p r o p o r c i o n a l a s e n t e n c i a :
UPDATE <tabla>
SET <columna 1 = (<expresión 1> | NULL)
, <columna 2 = (<expresión 2> |
NULL)…
WHERE <condición de búsqueda>
Va m o s a m o d i f i c a r e n n u e s t ro e j e m p l o d e t a b l a t e l é f o n o s l a
dirección de la persona que se mostraba:
UPDATE teléfonos
SET dirección= ´Parla, Madrid´
WHERE telefono=´917654321´
Fundamentos del lenguaje SQL
Po d e m o s q u i t a r d e l a t a b l a t e l é f o n o s e l r e g i s t r o q u e t i e n e l a c l a v e
especificada:
Pa r a l i s t a r t o d a s l a s f i l a s d e l a t a b l a t e l é f o n o s u t i l i z a r e m o s :
C O M E N Z A R
La tecnología JDBC
JDBC
(Java DataBase Connectivity)
JDBC (Java DataBase Connectivity) es una API de Java proporcionada por un conjunto de
clases que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos
relacionales.
Para que una aplicación Java pueda hacer operaciones sobre una base de datos, antes tiene
que establecer una conexión con ella que se realiza a través de un controlador (driver).
La función de este driver será traducir los mensajes de bajo nivel del sistema base de daos a
mensajes de bajo nivel de la API JDBC y viceversa.
La tecnología JDBC
1 2
Paquete javax.sql. Paquete java.sql. Este paquete forma parte de J2SE y contiene las interfaces y
clases Java fundamentales de JDBC, de las cuales cualquier aplicación JAVA utiliza
casi siempre 4:
o DriverManager. Se utiliza para realizar la conexión con la base de datos.
Para esto utilizamos el método getConnection que devuelve el objeto
Connection con la conexión solicitada.
o Connection. Es el objeto que se utiliza para construir el objeto Statement
que usamos para enviar sentencias SQL a la base de datos. Para esto
debemos invocar al método createStatement que devuelve un objeto
Statement.
o Statement. Este objeto permite, a través de su método executeQuery,
ejecutar una sentencia SQL sobre la base de y devuelve el objeto
ResultSet.
o ResultSet. Es una tabla de datos que representa al conjunto de resultados
generado al ejecutar la sentencia SQL sobre la base de datos. Los métodos
de esta clase nos permiten acceder a los registros del conjunto de
resultados obtenido.
7.3 Ejecución de
sentencias de
acción
C O M E N Z A R
Ejecución de sentencias de acción
Connection
Connection también tiene unos métodos que devuelven un objeto de tipo
Por ejemplo, en el siguiente código se ha creado una sentencia para borrar una fila de
Ejecución de consultas
de manipulación de datos
Sentencias DML SQL (Data Manipulation 1 CREATE, se usa para crear una base de datos,
Para definir las estructuras, 3 DROP, con esta sentencia se puede eliminar los
objetos de la estructura como tablas, índices,
disponemos de tres sentencias:
etc.
Ejecución de sentencias de acción
Ejecución de consultas
de definición de datos
nos permite introducir datos para posteriormente INSERT, con esta instrucción podemos
2
insertar los valores en una base de
realizar tareas de consultas o modificaciones de los
datos.
datos que contiente la base de datos.
UPDATE, sirve para modificar los
Las sentencias que se utilizan para manipular 3 valores de uno o varios registros.
datos son:
DELETE, se utiliza para eliminar las finas de
4
una tabla.
Ejecución de sentencias de acción
String createTableBank = "CREATE TABLE BANCO (cliente VARCHAR(100) NOT NULL, password VARCHAR(20) NOT
NULL, balance Integer NOT NULL, PRIMARY KEY(cliente))";
statement.executeUpdate(createTableBank);
while (rs.next()) {
System.out.println(rs.getString("cliente") + " - " + rs.getInt("balance"));
}
https://player.vimeo.com/video/728033415?h=3f6e90c9
72
https://player.vimeo.com/video/728033415?h=3f6e90c972
https://player.vimeo.com/video/728033435?h=c62d5980
5e
https://player.vimeo.com/video/728033435?h=c62d59805e
7.4 Manipulación de
resultados
C O M E N Z A R
Manipulación de resultados
ResultSet es esencialmente una tabla que contiene toda la información que debe
devolverse de una consulta específica, así como algunos metadatos esenciales.
Gestión de transacciones
Iniciar una transacción
En entornos multiusuario (por ejemplo, para aplicaciones web) hay que controlar el
acceso concurrente a la BD para evitar inconsistencias.
https://player.vimeo.com/video/728033451?h=0af32c100b
Bases de datos en Java
Respuesta
tras error
Si obtenemos una excepción
(SQLException) al ejecutar nuestras
sentencias, podemos deshacer todos
los cambios realizados en la transacción
y liberar los bloqueos de la base de
datos con el método rollback().
Bases de datos en Java
Existen otros tipos de excepciones SQLWarning, que no son obligatorio capturar y que representan errores
leves de objectos como Connection, Statement o ResultSet.
7.6 XML como
almacenamiento
de datos
C O M E N Z A R
XML como almacenamiento de datos
Introducción a
las bases de
datos XML
Una base de datos XML constituye un sistema software que
Las bases de datos de documentos contrastan fuertemente con la base de datos relacional
tradicional (RDB). Las bases de datos relacionales generalmente almacenan datos en tablas
separadas definidas por el programador, y un solo objeto puede extenderse a varias tablas. Las
bases de datos de documentos almacenan toda la información para un objeto dado en una sola
instancia en la base de datos, y cada objeto almacenado puede ser diferente de los demás. Esto
elimina la necesidad de mapeo relacional de objetos al cargar datos en la base de datos.
XML como almacenamiento de datos
T R ATA M I E N TO D E B A S E S D E DATO S X M L
Lenguaje de consulta
para XML; Xquery
XPath es una sintaxis utilizada para describir partes de un documento XML.
Con XPath, se puede hacer referencia al primer elemento, a cualquier atributo
de los elementos, a todos los elementos específicos que contienen texto y a
muchas otras variaciones.
XPath a veces puede ser útil al probar servicios web usando XML para enviar
solicitudes y recibir respuestas.
contains() u otras) que nos El nodo raíz (solo uno por documento).
permiten buscar varios fragmentos Nodos de elemento.
de datos dentro del documento.
Nodos de atributos.
1 2 3 4 5
node-set node boolean number string
Representa un Representa un solo Representa el valor Representa un Representa cero o
conjunto de nodos. nodo. Esto puede verdadero o falso. número de coma más caracteres, tal
El conjunto puede estar vacío o puede flotante. Todos los como se define en
estar vacío o puede contener cualquier números en XPath y la especificación
contener cualquier número de nodos XSLT se XML.
número de nodos. secundarios. implementan como
números de punto
flotante; el tipo de
datos entero (o int)
no existe en XPath y
XSLT.
XML como almacenamiento de datos
OPERADOR DESCRIPCIÓN
Selecciona únicamente a los descendientes directos.
/
Selecciona todos los descendientes.
//
Selección del elemento actual.
.
Todos.
*
Prefijo que se antepone al nombre de un atributo.
@
[] Filtro sobre el conjunto de nodos seleccionado.
XML como almacenamiento de datos
T R ATA M I E N TO D E B A S E S D E DATO S X M L
Ve r
e j e m p l o
TIEMPO ESTIMADO DE LECTURA
10 min
https://drive.google.com/file/d/1oE4kPfUXeAw3viuAMoN6ntA04YU-CNNn/view
XML como almacenamiento de datos
T R ATA M I E N TO D E B A S E S D E DATO S X M L
Tratamiento de excepciones
Cuando se produce un error durante el procesamiento de cualquier expresión
XPath se lanza una excepción de tipo XPathException.
https://drive.google.com/file/d/1edVcnV-N63h4XQ8cpSesKBmJyvmbvkj2/preview
XML como almacenamiento de datos
Resumen
de la unidad
En este capitulo hemos visto como podemos utilizar como base de datos
Un programa
N E C E S I TA O B T E N E R I N F O R M AC I Ó N D E S D E U N
O R IGEN O ENVIAR INFO R M ACIÓ N A UN D ESTINO.
Origen
Programa
Destino
FLUJO HACIA EL DESTINO
Acceso a ficheros
¿Qué es un flujo?
DEFINICIÓN
Un flujo es un objeto que funciona como intermediario entre el programa y
! el origen o el destino de la información, de este modo el programa lee o
escribe en el flujo sin tener en cuenta a dónde va la información o desde
donde viene y sin importante que tipo de datos está leyendo o escribiendo.
Algoritmos
PA R A L E E R Y E S C R I B I R D AT O S :
1 2
LEER: ESCRIBIR
• Abrir un flujo desde el origen • Abrir un flujo desde el origen
• Mientras haya información • Mientras haya información
Leer información Escribir información
• Cerrar el flujo • Cerrar el flujo
Acceso a ficheros
Object
Flujos de Bytes
CON ESTE FLUJO LOS DATOS SE PUEDEN LEER Y
ESCRIBIR DE UN FICHERO BYTE A BYTE, UTILIZANDO
FLUJOS DE LAS CLASES:
1 2
FileOutputStream FileInputStream
Acceso a ficheros
1
FileOutputStream
Ver ejemplo
TIEMPO ESTIMADO DE LECTURA
10 min
https://drive.google.com/file/d/1oDkBDLshzdgEsJrJL5WmH5GW4kbgG6gO/preview
Acceso a ficheros
2
FileInputStream
Ver ejemplo
TIEMPO ESTIMADO DE LECTURA
10 min
https://drive.google.com/file/d/15YoY-asds5xcNzeoPBPYYBapALH4Rgrs/preview
Acceso a ficheros
Flujo de caracteres
LOS STREAMS ORIENTADOS A CARACTERES
MANEJAN CUALQUIER CARÁCTER DEL
CONJUNTO DE CARACTERES UNICODE.
Reader
CLASES:
Writer
Acceso a ficheros
La clase Reader
ES SIMILAR A Inputstream PERO Reader ESTÁ
ORIENTADA A LEER CARACTERES UNICODE EN
LUGAR DE BYTES.
LA CLASE Reader
Para mostrar un
fichero por pantalla BufferedReader lectorBuffer = null;
int NUM_ITEMS = 1;
Ejemplo
try {
int leidos;
FileReader lectorFichero = new FileReader("ruta al " + "fichero");
BufferedReader lectorBuffer = new BufferedReader(lectorFichero);
char [] buffer = new char[NUM_ITEMS];
do {
leidos = lectorBuffer.read(buffer);
System.out.print(buffer);
} while (leidos == NUM_ITEMS);
}
catch (IOException ex) {
System.err.println("Se ha producido un error de lectura");
}
Acceso a ficheros
try{
System.out.println("Escribe algo...");
resultado = lectorCadenas.readLine(); // BufferedReader //permite leer
} // hasta el fin de //linea
catch(IOException e){
System.err.println("Se ha producido un error de lectura");
System.exit(-1);
}
return resultado;
}
La clase Writer
ES LA VERSIÓN ORIENTADA A CARACTERES DE Outputstream.
FileImputStream
LineNumberInputStream
Jerarquía PipedInStream
DataInputStream
de clases FilterInputStream
BufferedInputStream
InmputStream ByteArrayInputStream
PushbackInputStream
SequenceInputStream
StringBufferInputStream
ObjectInputStream
FileOutputStream
PipedOutputStream DataOutputStream
ByteArrayOutputStream PushbackOutputStream
ObjectOutputStream
Acceso a ficheros
de clases CharArrayReader
InputStreamReader FileReader
PipedReader
BufferedWriter
StringReader
CharArrayWriter
OutputStreamWriter FileWriter
FilterWriter
Writer
PipedWriter
StringWriter
PrintWriter
Acceso a ficheros
La clase File
PERMITE EXAMINAR Y MANIPULAR ARCHIVOS Y DIRECTORIOS.
Ejemplo
File fichero = new File("proyecto\\texto.txt");
System.out.println("Nombre del fichero: " + fichero.getName());
System.out.println("Directorio padre: " + fichero.getParent());
System.out.println("Ruta relativa: " + fichero.getPath());
System.out.println("Ruta absoluta: " + fichero.getAbsolutePath());
Cómo se crean y
eliminan ficheros
VER VIDEO
https://player.vimeo.com/video/728033306?h=3ae1bd0a
79
https://player.vimeo.com/video/728033306?h=3ae1bd0a79
Acceso a ficheros
SE ACCEDE A ELLOS
java.lang.System
Para leer un carácter solamente tenemos que llamar a la función read desde
System.in.
try{
System.in.read();
}catch (IOException ex) { }
Acceso a ficheros
La clase java.util.Scanner
PERMITE LEER DATOS DESDE UN FLUJO DE ENTRADA, DESDE UN
FICHERO (FILE) O DE UN string.
Ejemplo
Scanner leer = new Scanner (System.in);
System.out.print("Cadena de caracteres: ");
String str = leer.next();
System.out.print("Valor entero: ");
Este código lee un
int dato = leer.nextInt(); String y un int de
leer.close(); la entrada estándar.
Acceso a ficheros
La clase Scanner
NOS FACILITA MUCHO LA TAREA DE OBTENCIÓN
DE DATOS DESDE DIFERENTES FUENTES.
Pr i n c i p a l e s u s o s :
Ejemplo
try {
Scanner entrada = new Scanner(new File("C:\\CarpetaEjemplos\\numero.txt"));
while (entrada.hasNextLong()) {
System.out.println("numero: " + entrada.nextLong());
}
entrada.close();
} catch (FileNotFoundException e) {
System.out.println("Error al leer el fichero numero.txt");
}
Objeto System.out
PODEMOS REPRESENTAR EN PANTALLA CADENAS DE
CARACTERES, O CUALQUIER OTRO TIPO DE DATO EN
FORMA DE TEXTO REALIZÁNDOSE EL “CASTING”
IMPLÍCITO EN CASO DE SER NECESARIO, O UTILIZANDO
LA REPRESENTACIÓN TEXTUAL DE UN OBJETO.
Acceso a ficheros
@Override
public String toString() {
return "MiObjeto [atr1=" + atr1 + ", atr2=" + atr2 + ",
atr3=" + atr3 + "]";
}
}
System.out.print(obj);
1 SECUENCIAL
En el modo secuencial la información del archivo es
una secuencia de bytes (o caracteres) de manera que
para acceder al byte (o carácter) i-ésimo se ha de
haber accedido anteriormente a los i-1 anteriores.
2 ACCESO DIRECTO
El modo de acceso directo nos permite acceder
directamente a la información del byte i-ésimo. Un
ejemplo muy conocido de acceso directo lo tenemos
con los vectores (arrays).
Serialización de ficheros
Operaciones de
lectura/escritura
En el ejemplo se van a utilizar las clases FileWriter
y FileReader.
c = reader.read();
}
En el método se crea un FileReader que dispone reader.close();
de un método read() que nos irá devolviendo uno System.out.println("Numero de vocales encontradas: " + vocales);
} catch (IOException e) {
a uno los caracteres del fichero hasta que llegue al System.err.println("Algo ha ido mal al contar las vocales :-(");
https://player.vimeo.com/video/728033330?h=99a45c3648
Serialización de ficheros
InputStream
Serialización de ficheros
InputStream
Es una clase abstracta que es superclase de todas las que
representan un flujo en el que un destino lee bytes de un origen.
El método mas importante de esta clase es read. Una de las
formas que presenta este método es:
public int read() throws IOException
El método read lee bytes individuales de un flujo de entrada,
devuelve un entero (int) correspondiente al valor ADCII del
carácter leído, o bien -1 cuando en un intento de leer datos se
alcanza el final del flujo (no hay mas datos).
Serialización de ficheros
InputStream
Ejemplo:
Supongamos que tenemos definido un objeto flujoE (flujo de
OutputStream entrada) de alguna subclase de InputStream, el siguiente
código lee un byte del origen vinculado con flujoE:
int n;
n = flujoE.read();
Serialización de ficheros
InputStream
InputStream
Ejemplo:
OutputStream
Si tenemos definido un objeto flujoS (flujo de salida) de alguna
subclase de OutputStream, este código escribirá el byte especificado
en el destino vinculado con flujoS.
int n:
//…
flujos.write(n);
Serialización de ficheros
Serialización
CUANDO QUEREMOS TRANSMITIR ESTRUCTURAS
MAS COMPLEJAS
DEFINICIÓN
La serialización incorpora información sobre la clase a
! la que pertenecen los objetos y del estado interno de
los mismos, así es sencillo verificar si la recuperación del
objeto serializado se ha realizado de manera correcta.
Serialización de ficheros
La serialización y deserialización
SE REALIZA A TRAVÉS DE DOS CLASES DE FLUJOS O Streams:
Vamos a ver como guardar en fichero el conjunto de clientes que maneja una
aplicación de gestión de clientes para poder recuperarlo al reiniciar la aplicación:
Ejemplo
Cliente[] clientes; //La clase cliente implementa Serializable
...
try {
FileOutputStream escritor = new FileOutputStream("clientes.dat");
ObjectOutputStream oos = new ObjectOutputStream(escritor);
oos.writeObject(clientes); // Serialización del objeto clientes
oos.close(); // Cierra el stream y hace flush
} catch (IOException ex) {
// Se ha producido un error al serializar
}
Serialización de ficheros