32
Edited with emacs + LAT E X+ prosper Bases de Datos (III) Computación Web (Curso 2015/2016) Jes ´ us Arias Fisteus // [email protected] Bases de Datos (III)– p. 1

Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Bases de Datos (III)

Computación Web (Curso 2015/2016)

Jesus Arias Fisteus // [email protected]

Bases de Datos (III)– p. 1

Page 2: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

JDBC: Acceso a bases de datos relacionales enJava

Bases de Datos (III)– p. 2

Page 3: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 4: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Se necesita un driver JDBC, que es unaimplementación de dichas interfaces:

Dependiente del programa gestor de base dedatos.

Proporcionado habitualmente por el proveedordel gestor.

Para MySQL: MySQL Connector/J.

Bases de Datos (III)– p. 4

Page 5: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 6: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 7: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Obtener una conexión con DriverMa-

nager

1 Connection connection;

2 try {

3 String 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

Page 8: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 9: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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 para leer datos(típicamente consultas SELECT). Devuelveun ú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

Page 10: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Consulta SELECT mediante State-

ment

Para leer datos, por ejemplo medianteconsultas SELECT, se usa habitualmenteexecuteQuery().

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

Page 11: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Lectura de los resultados

Devuelve un objeto ResultSet que representa elresultado de una 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

Page 12: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 13: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 14: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 15: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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 // ¿Ha fallado la inserción?

11 rowId = -1;

12 }

Bases de Datos (III)– p. 15

Page 16: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 17: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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

Page 18: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Liberación de recursos (a partir de

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. 18

Page 19: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Liberación de recursos (a partir de

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. 19

Page 20: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 20

Page 21: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 21

Page 22: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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 controlarposibles caracteres reservados de SQL quepudiese tener.

Las consultas con PreparedStatement no seven afectadas, porque se compilan antes deintroducir la información proporcionada por elusuario.

Se verá esto en profundidad en la clasesdedidadas a seguridad en aplicaciones Web.

Bases de Datos (III)– p. 22

Page 23: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 23

Page 24: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 24

Page 25: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 25

Page 26: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 26

Page 27: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 27

Page 28: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 28

Page 29: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

Edited

with

em

acs

+LA

T EX

+pro

sper

Persistencia de objetos

Bases de Datos (III)– p. 29

Page 30: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 30

Page 31: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 31

Page 32: Bases de Datos (III) Computación Web (Curso 2015/2016) · Bases de Datos (III) Computación Web (Curso 2015/2016) ... bases de datos: El programador no necesita programar código

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. 32