Bases de Datos (III) Computación Web (Curso 2013/2014) · Bases de Datos (III) Computación Web...
Transcript of Bases de Datos (III) Computación Web (Curso 2013/2014) · Bases de Datos (III) Computación Web...
Edited
with
em
acs
+LA
T EX
+pro
sper
Bases de Datos (III)
Computación Web (Curso 2013/2014)
Jesus Arias Fisteus // [email protected]
Bases de Datos (III)– p. 1
Edited
with
em
acs
+LA
T EX
+pro
sper
JDBC: Acceso a bases de datos relacionales enJava
Bases de Datos (III)– p. 2
Edited
with
em
acs
+LA
T EX
+pro
sper
JDBC
Permite acceder a bases de datos relacionalesmediante SQL desde programas Java.
Define unas interfaces estándar, comunes paraacceder a cualquier sistema gestor de bases dedatos (Oracle, MySQL, etc.)
Bases de Datos (III)– p. 3
Edited
with
em
acs
+LA
T EX
+pro
sper
JDBC
Las interfaces están integradas en la API estándarde J2SE:
Paquete java.sql.
Paquete javax.sql.
Requiere un driver JDBC, que es unaimplementación de dichas interfaces:
Normalmente dependiente del programa gestorde base de datos.
Proporcionado habitualmente por el proveedordel gestor.
Para MySQL: MySQL Connector/J.
Bases de Datos (III)– p. 4
Edited
with
em
acs
+LA
T EX
+pro
sper
Clases e interfaces principales
Las clases e interfaces principales de JDBC son:
java.sql.DriverManager
java.sql.Connection
java.sql.Statement
java.sql.ResultSet
java.sql.PreparedStatment
javax.sql.DataSource
Bases de Datos (III)– p. 5
Edited
with
em
acs
+LA
T EX
+pro
sper
Obtener una conexión con DriverMa-
nager
La clase DriverManager permite obtener objetosConnection con la base de datos.
Para conectarse es necesario proporcionar:
URL de conexión, que incluye:Nombre del host donde está la base dedatos.Nombre de la base de datos a usar.
Nombre del usuario en la base de datos.
Contraseña del usuario en la base de datos.
Bases de Datos (III)– p. 6
Edited
with
em
acs
+LA
T EX
+pro
sper
Obtener una conexión con DriverMa-
nager
Connection conn = null;
try {
url = "jdbc:mysql://hostname/database-name";
conn = DriverManager.getConnection(url, "user", "password");
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
Bases de Datos (III)– p. 7
Edited
with
em
acs
+LA
T EX
+pro
sper
Uso del objeto Connection
Representa el contexto de una conexión con labase de datos:
Permite obtener objetos Statement pararealizar consultas SQL.
Permite obtener metadatos acerca de la basede datos (nombres de tablas, etc.)
Permite gestionar transacciones.
Bases de Datos (III)– p. 8
Edited
with
em
acs
+LA
T EX
+pro
sper
Realizar consultas con Statement
Permite realizar consultas SQL en la base dedatos.
Se obtiene a partir de un objeto Connection.
Tiene distintos métodos para hacer consultas:executeQuery: usado principalmente paraleer datos (típicamente consultas SELECT).Devuelve un único objeto ResultSet.executeUpdate: usado para insertar,modificar o borrar datos.execute: usado para cualquier tipo deconsultas, pudiendo obtener varios objetosResultSet.
Bases de Datos (III)– p. 9
Edited
with
em
acs
+LA
T EX
+pro
sper
Consulta SELECT mediante State-
ment
String query = "SELECT FirstName, LastName, Age FROM Customers";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
Bases de Datos (III)– p. 10
Edited
with
em
acs
+LA
T EX
+pro
sper
Lectura de los resultados
El objeto ResultSet representa el resultado deuna consulta.
Está compuesto por filas.
Se leen secuencialmente las filas, desde elprincipio hacia el final.
En cada fila se recupera mediante métodos losvalores de las columnas.
El método a usar depende del tipo de datos,y recibe el nombre o número de columnacomo parámetro:Métodos getString(), getInt(),getDate(), etc.
Bases de Datos (III)– p. 11
Edited
with
em
acs
+LA
T EX
+pro
sper
Lectura de los resultados
String query = "SELECT FirstName, LastName, Age FROM Customers";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String firstName = rs.getString("FirstName");
String lastName = rs.getString("LastName");
int age = rs.getInt("Age");
System.out.println(firstName + " " + lastName +
" (" + age + ")");
}
Bases de Datos (III)– p. 12
Edited
with
em
acs
+LA
T EX
+pro
sper
Inserción, borrado y modificación de
datos
Para insertar, eliminar o modificar datos se sueleutilizar el método executeUpdate() deStatement. Por ejemplo, con consultas INSERT,UPDATE y DELETE.
String query = "UPDATE Customers SET Age=25 WHERE id=90";
Statement stmt = conn.createStatement();
stmt.executeUpdate(query);
Bases de Datos (III)– p. 13
Edited
with
em
acs
+LA
T EX
+pro
sper
Valor de campos auto-incremento
Cuando se inserta una nueva fila, y esta tiene unacolumna con auto-incremento, puede sernecesario conocer el identificador asignado por labase de datos:
El método getGeneratedKeys() deStatement devuelve un ResultSet con losvalores de auto-incremento asignados en laúltima consulta.
Bases de Datos (III)– p. 14
Edited
with
em
acs
+LA
T EX
+pro
sper
Valor de campos auto-incremento
String query = "INSERT INTO Customers (FirstName, LastName, Age)"
+ " VALUES (’José’, ’García’, 25)";
Statement stmt = conn.createStatement();
stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
int rowId;
if (rs.next()) {
rowId = rs.getInt(1);
} else {
// ¿La inserción falló?...
rowId = -1;
}
Bases de Datos (III)– p. 15
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos
Las consultas en progreso consumen recursostanto en la base de datos como en el programacliente.
Se puede liberar los recursos consumidos porobjetos ResultSet y Statement mediante elmétodo close().
Los objetos ResultSet se cierranautomáticamente cuando se cierra su objetoStatement asociado, o se hace una nuevaconsulta sobre él.
Bases de Datos (III)– p. 16
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursosStatement stmt = null;
try {
String query = "SELECT FirstName, LastName, Age FROM Customers";
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String firstName = rs.getString("FirstName");
String lastName = rs.getString("LastName");
int age = rs.getInt("Age");
System.out.println(firstName + " " + lastName + " (" + age + ")");
}
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
// ignore
}
}
}
Bases de Datos (III)– p. 17
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos
Los objetos Connection disponen de un métodoclose que cierra la conexión con la base dedatos.
Si hay una transacción en curso, es recomendablefinalizarla (commit o rollback) antes de cerrarla conexión.
conn.close()
Bases de Datos (III)– p. 18
Edited
with
em
acs
+LA
T EX
+pro
sper
Consultas con PreparedStatement
La interfaz PreparedStatement es útil cuando serepite muchas veces una consulta similar,cambiando sólo algún parámetro.
La consulta se compila sólo cuando se crea elobjeto, acelerando así las peticiones que serealicen posteriormente.
Bases de Datos (III)– p. 19
Edited
with
em
acs
+LA
T EX
+pro
sper
Ejemplo
PreparedStatement updateSales = conn.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME = ?");
(...)
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
Bases de Datos (III)– p. 20
Edited
with
em
acs
+LA
T EX
+pro
sper
Transacciones en JDBC
El objeto Connection define el contexto de lastransacciones. Métodos relevantes:
getTransactionIsolation()
setTransactionIsolation()
getAutoCommit()
setAutoCommit()
commit()
rollback()
Bases de Datos (III)– p. 21
Edited
with
em
acs
+LA
T EX
+pro
sper
Transacciones en JDBC
try {
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
//
//...secuencia de consultas...)
//
// si todo fue bien:
conn.commit()
} catch (SQLException ex) {
try {
conn.rollback();
} catch (SQLException ex) {
// ignore
}
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
conn.setAutoCommit(true);
Bases de Datos (III)– p. 22
Edited
with
em
acs
+LA
T EX
+pro
sper
Reutilización de conexiones
Establecer una conexión con la base de datossupone un retardo y consumo de recursos en elcliente, base de datos y red.
Es buena práctica reutilizar las conexiones paravarias consultas, en vez de abrir una nuevaconexión cada vez que se haga una consulta.
Bases de Datos (III)– p. 23
Edited
with
em
acs
+LA
T EX
+pro
sper
Reutilización de conexiones
En programas ejecutados en concurrencia (porejemplo, aplicaciones Web) es habitual mantenerun pool de conexiones permanentemente abiertasy reutilizarlas:
1. El programa obtiene un objeto Connection delpool.
2. Se realizan una o más consultas sobre esteobjeto.
3. Cuando ya no es necesario, se devuelve alpool.
4. El pool es compartido por todos los hilosconcurrentes de la aplicación.
Bases de Datos (III)– p. 24
Edited
with
em
acs
+LA
T EX
+pro
sper
Reutilización de conexiones: Data-
Source
La interfaz javax.sql.DataSource de JDBC:
1. Proporciona un mecanismo alternativo aDriverManager para obtener objetosConnection.
2. Gestiona opcionalmente las conexiones enmodo pool.
3. Necesita un servicio de nombres JNDI (losprincipales servidores Web Java proporcionaneste servicio).
Bases de Datos (III)– p. 25
Edited
with
em
acs
+LA
T EX
+pro
sper
Seguridad
El programa que accede a la base de datos enuna aplicación Web debe estar protegido frente aataques de inyección de SQL:
No se debe incluir en una consulta texto literalproporcionado por el usuario sin antes procesarposibles caracteres reservados de SQL quepudiese tener.
PreparedStatement hace estoautomáticamente.
Se verá esto en profundidad en la clasesdedidadas a seguridad en aplicaciones Web.
http://xkcd.com/327/
Bases de Datos (III)– p. 26
Edited
with
em
acs
+LA
T EX
+pro
sper
Referencias
Maydene Fisher, Jon Ellis, Jonathan Bruce. JDBCAPI Tutorial and Reference, Third Edition. PrenticeHall.
http://proquest.safaribooksonline.com/book/programming/
java/0321173848
Capítulos 1 (“Introduction”) y 2 (“Basic Tutorial”)
Bases de Datos (III)– p. 27
Edited
with
em
acs
+LA
T EX
+pro
sper
Persistencia de objetos
Bases de Datos (III)– p. 28
Edited
with
em
acs
+LA
T EX
+pro
sper
Persistencia de objetos
Los entornos de persistencia de objetos seencargan de guardar y recuperar objetos Java enbases de datos:
El programador no necesita programar códigoJDBC ni consultas SQL.
Los objetos se representan siguiendo elconvenio de Java Beans (propiedades privadas,métodos get/set, constructor sin parámetros).
El entorno realiza la conversión entre tipos Javay tipos SQL.
El entorno crea y ejecuta las consultas SQLnecesarias.
Bases de Datos (III)– p. 29
Edited
with
em
acs
+LA
T EX
+pro
sper
Ejemplo de Java Bean
public class Libro {
private String titulo;
private String isbn;
private int anyo;
public String getTitulo() {
return titulo;
}
public void setTitulo() {
this.titulo = titulo;
}
(...)
}
Bases de Datos (III)– p. 30
Edited
with
em
acs
+LA
T EX
+pro
sper
Persistencia de objetos
Java Persistence API (JPA) proporciona unainterfaz estándar para entornos de persistencia deobjetos.
Existen múltiples implementaciones de JPA:
Hibernate.
OpenJPA.
Eclipse Link.
...
Bases de Datos (III)– p. 31
Edited
with
em
acs
+LA
T EX
+pro
sper
Sistemas alternativos a las bases de datosrelacionales
Bases de Datos (III)– p. 32
Edited
with
em
acs
+LA
T EX
+pro
sper
Escalabilidad
Para dotar de escalabilidad a una aplicación Webes necesario disponer de un sistema dealmacenamiento de datos escalable.
Escalar una bases de datos relacional puedesuponer un coste elevado debido al modelotransaccional ACID.
Recientemente están surgiendo sistemasalternativos no ACID que son escalables a unmenor coste.
Bases de Datos (III)– p. 33
Edited
with
em
acs
+LA
T EX
+pro
sper
Almacenamiento clave-valor en RAM
Se almacenan pares clave-valor en RAM:
Acceso muy rápido a los datos.
Flexibilidad en el número de máquinas a utilizar.
Puede usarse, por ejemplo, como caché de datosrecuperados de una base de datos relacional,fragmentos de HTML previamente construidos,etc.
Ejemplo: Memcached.
Bases de Datos (III)– p. 34
Edited
with
em
acs
+LA
T EX
+pro
sper
Almacenamiento clave-valor persis-
tente
Se almacenan también pares clave-valor, pero conpersistencia.
Ejemplos: Amazon Dynamo, Voldemort,...
Bases de Datos (III)– p. 35
Edited
with
em
acs
+LA
T EX
+pro
sper
Almacenamiento en tablas
Los datos se almacenan con estructura de tabla.
El esquema de las tablas es dinámico.
Ejemplos: Google BigTable, Hadoop HBase,Cassandra,...
Bases de Datos (III)– p. 36
Edited
with
em
acs
+LA
T EX
+pro
sper
Almacenamiento documental
Almacenan datos semi-estructurados, conmodelos más flexibles que las bases de datosrelacionales.
Ejemplos: CouchDB, MongoDB.
Bases de Datos (III)– p. 37
Edited
with
em
acs
+LA
T EX
+pro
sper
Bases de datos de grafos
Almacenan información estructurada como grafos.
Por ejemplo, información RDF en la WebSemántica.
Ejemplos: Neo4J, OpenLink Virtuoso, etc.
Bases de Datos (III)– p. 38