Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Edited
with
em
acs
+LA
T EX
+pro
sper
Bases de Datos (III)
Computación Web (Curso 2014/2015)
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
1 Connection connection;
2 try {
3 url = "jdbc:mysql://hostname/database-name";
4 connnection =
5 DriverManager.getConnection(url, "user",
6 "password");
7 } catch (SQLException ex) {
8 connection = null;
9 ex.printStackTrace();
10 System.out.println("SQLException: "
11 + ex.getMessage());
12 System.out.println("SQLState: "
13 + ex.getSQLState());
14 System.out.println("VendorError: "
15 + ex.getErrorCode());
16 }
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
Los objetos Statement permiten realizarconsultas SQL en la base de datos.
Se obtienen a partir de un objeto Connection.
Tienen 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
1 String query = "SELECT FirstName, LastName, Age
FROM Customers";
2 Statement stmt = connection.createStatement();
3 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
1 String query = "SELECT FirstName, LastName, Age
FROM Customers";
2 Statement stmt = connection.createStatement();
3 ResultSet rs = stmt.executeQuery(query);
4 while (rs.next()) {
5 String firstName = rs.getString("FirstName");
6 String lastName = rs.getString("LastName");
7 int age = rs.getInt("Age");
8 System.out.println(firstName + " " + lastName
+ " (" + age + ")");
9 }
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.
1 String query = "UPDATE Customers SET Age=25 WHERE id
=90";
2 Statement stmt = connection.createStatement();
3 int rowCount = 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
1 String query = "INSERT INTO Customers (FirstName,
LastName, Age)" + " VALUES ( 'José ', 'García ', 25)
";
2 Statement stmt = connection.createStatement();
3 stmt.executeUpdate(query,
4 Statement.RETURN_GENERATED_KEYS);
5 ResultSet rs = stmt.getGeneratedKeys();
6 int rowId;
7 if (rs.next()) {
8 rowId = rs.getInt(1);
9 } else {
10 // ¿La inserción falló?...
11 rowId = -1;
12 }
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 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.
Bases de Datos (III)– p. 17
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos (antes de JSE
7)1 public List<Book> listBooks() {2 List<Book> books = new ArrayList<Book>();3 Statement stmt = null;4 try {5 stmt = connection.createStatement();6 String query = "SELECT id, title FROM Books";7 ResultSet rs = stmt.executeQuery(query);8 while (rs.next()) {9 Book book = new Book();
10 book.setId(rs.getInt("id"));11 book.setTitle(rs.getString("title"));12 books.add(book);13 }14 } catch (SQLException e) {15 books = null;16 } finally {17 if (stmt != null) {18 try {19 stmt.close();20 } catch (SQLException ex) {21 // ignore22 }23 }24 }25 return books;26 }
Bases de Datos (III)– p. 18
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos (antes de JSE
7)
1 public List<Book> listBooks() throws SQLException {
2 List<Book> books = new ArrayList<Book>();
3 Statement stmt = null;
4 try {
5 stmt = connection.createStatement();
6 String query = "SELECT id, title FROM Books";
7 ResultSet rs = stmt.executeQuery(query);
8 while (rs.next()) {
9 Book book = new Book();
10 book.setId(rs.getInt("id"));
11 book.setTitle(rs.getString("title"));
12 books.add(book);
13 }
14 } finally {
15 if (stmt != null) {
16 try {
17 stmt.close();
18 } catch (SQLException ex) {
19 // ignore
20 }
21 }
22 }
23 return books;
24 }
Bases de Datos (III)– p. 19
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos (desde JSE 7)
1 public List<Book> listBooks() {
2 List<Book> books = new ArrayList<Book>();
3 try (Statement stmt = connection.createStatement()) {
4 String query = "SELECT id, title, isbn, year FROM Books";
5 ResultSet rs = stmt.executeQuery(query);
6 while (rs.next()) {
7 Book book = new Book();
8 book.setId(rs.getInt("id"));
9 book.setTitle(rs.getString("title"));
10 book.setIsbn(rs.getString("isbn"));
11 book.setYear(rs.getInt("year"));
12 books.add(book);
13 }
14 } catch (SQLException e) {
15 books = null;
16 }
17 return books;
18 }
Bases de Datos (III)– p. 20
Edited
with
em
acs
+LA
T EX
+pro
sper
Liberación de recursos (desde JSE 7)
1 public List<Book> listBooks() throws SQLException {
2 List<Book> books = new ArrayList<Book>();
3 try (Statement stmt = connection.createStatement()) {
4 String query = "SELECT id, title, isbn, year FROM Books";
5 ResultSet rs = stmt.executeQuery(query);
6 while (rs.next()) {
7 Book book = new Book();
8 book.setId(rs.getInt("id"));
9 book.setTitle(rs.getString("title"));
10 book.setIsbn(rs.getString("isbn"));
11 book.setYear(rs.getInt("year"));
12 books.add(book);
13 }
14 }
15 return books;
16 }
Bases de Datos (III)– p. 21
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.
Cuando la consulta se construye con informaciónque proviene del usuario, protege contra ataquesde inyección de SQL.
Bases de Datos (III)– p. 22
Edited
with
em
acs
+LA
T EX
+pro
sper
Ejemplo
1 PreparedStatement updateSales =
2 conn.prepareStatement("UPDATE Coffees SET sales
= ? WHERE name = ?");
3 (...)
4 updateSales.setInt(1, 75);
5 updateSales.setString(2, "Colombian");
6 updateSales.executeUpdate();
Bases de Datos (III)– p. 23
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. 24
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. 25
Edited
with
em
acs
+LA
T EX
+pro
sper
Transacciones en JDBC
1 boolean success = false;
2 connection.setTransactionIsolation(
3 Connection.TRANSACTION_REPEATABLE_READ);
4 connection.setAutoCommit(false);
5 try (Statement stmt = connection.createStatement()) {
6 // ... consultas de la transacción
7 if (...) {8 success = true;
9 }
10 } finally {
11 if (success) {
12 connection.commit();
13 } else {
14 connection.rollback();
15 }
16 connection.setAutoCommit(true);
17 }
Bases de Datos (III)– p. 26
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. 27
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. 28
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. 29
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. 30
Edited
with
em
acs
+LA
T EX
+pro
sper
Persistencia de objetos
Bases de Datos (III)– p. 31
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. 32
Edited
with
em
acs
+LA
T EX
+pro
sper
Ejemplo de Java Bean
1 public class Book {
2 private String title;
3 private String isbn;
4 private int year;
5
6 public String getTitle() {
7 return title;
8 }
9
10 public void setTitle() {
11 this.title = title;
12 }
13
14 (...)
15 }
Bases de Datos (III)– p. 33
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. 34