T17 - Gestion de BBDD

22
Tema – 17 Gestión de bases de datos

description

Gestión de bases de datos con Java. JDBC

Transcript of T17 - Gestion de BBDD

Page 1: T17 - Gestion de BBDD

Tema – 17Gestión de bases de datos

Page 2: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 2

17.1. Introducción

• Es habitual que los datos que va a utilizar nuestro programa estén almacenados en una base de datos, en lugar de en ficheros de texto.

• En este capítulo veremos las herramientas que nos proporciona Java para que nuestros programas accedan a la información contenida en una base de datos.

Page 3: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 3

17.1. Introducción

• Para que nuestros programas puedan realizar operaciones con los datos almacenados en una base de datos, tenemos dos interfaces de aplicaciones (APIs):– Open Database Connectivity (ODBC), utilizada por

Microsoft (también se puede usar con Java).– Java Database Connectivity (JDBC), desarrollada por Oracle

para programas escritos en Java.• Ambas APIs nos dan las herramientas para conectar

con una base de datos y recuperar y manipular la información que contiene.

Page 4: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 4

17.2. Registro del driver JDBC

• Para poder establecer conexión con una base de datos en primer lugar vamos a necesitar descargarnos el driver JDBC para la BDD con la que vamos a trabajar.

• En este tutorial se va a usar MySQL. Podemos descargar el conector de la url:– http://www.mysql.com/downloads/connector/j/

• Para incluir el driver en un proyecto de eclipse realizamos las mismas operaciones que en el siguiente tutorial:– http://danisantiago.com/instalacion-jdbc-sqlserver-2008-en-

eclipse/

Page 5: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 5

17.2. Registro del driver JDBC

• El registro del driver en nuestro programa consiste en cargar la clase que corresponde a dicho driver en la máquina virtual de Java. Usamos la clase Class con ese fin:try{

Class.forName(“com.mysql.jdbc.Driver”);}catch(Exception e){

System.out.println(“Error al cargar el driver”);}

• El String “com.mysql.jdbc.Driver” se obtiene observando la ruta en la que se encuentra la clase Driver del driver que acabamos de añadir al proyecto:

Page 6: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 6

17.3. Conexión a la BDD

• Una vez hemos registrado el driver JDBC en nuestro programa, lo siguiente es hacer la conexión con la base de datos. Para ello usamos el método “getConnection” de la clase DriverManager. Este método nos devuelve un objeto de la interfaz Connection.import java.sql.Connection;import java.sql.DriverManager;…Connection con =

DriverManager.getConnection(“jdbc:mysql://localhost/prueba”, “root”, “12345”);

Page 7: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 7

17.3. Conexión a la BDD

• En el código anterior el método “getConnection” recibe tres parámetros de tipo String que indican:– URL de la base de datos a la que se quiere conectar

(servidor localhost, bdd prueba).– Usuario con el que se conecta.– Password del usuario.

• También se puede usar el método “getConnection” de las siguientes formas:– getConnection(String url);– getConnection(String url, Properties info);

Page 8: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 8

17.3. Conexión a la BDD

• getConnection(String url):con = DriverManager.getConnection (“jdbc:mysql://localhost/prueba?

user=root&password=12345”);

• getConnection(String url, Properties info):import java.util.Properties;…Properties prop = new Properties();prop.put(“user”, “root”);prop.put(“password”, “12345”);con = DriverManager.getConnection(“jdbc:mysql://localhost/prueba”,

prop);

Page 9: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 9

17.3. Consultas a la BDD

• Una vez conectados a la base de datos podremos acceder a los datos ejecutando sentencias SQL.

• El objeto “Connection” tiene un método “createStatement()” que conecta con el driver que gestiona la BDD. El método devuelve un objeto “Statement”, con el que podremos ejecutar las sentencias SQL.

Page 10: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 10

17.3. Consultas a la BDD

import java.sql.Statement;…Connection con = DriverManager.getConnection(url,

user, password);Statement stmt = con.createStatement();

• Para ejecutar un SELECT sobre la BDD usaremos el método “executeQuery(String)” de la clase “Statement”.

• Todas los datos resultantes de la ejecución del SELECT se almacenan en un “ResultSet”.

Page 11: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 11

17.3. Consultas a la BDD

import java.sql.ResultSet;…Statement stmt = con.createStatement();ResultSet rs = stmt.ExecuteQuery(“SELECT * FROM

usuario”);• El ResultSet contiene varias filas con el

resultado de la consulta. Para movernos entre ellas usaremos un cursor, que inicialmente se sitúa delante de la primera fila.

Page 12: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 12

17.3. Consultas a la BDD• Algunos métodos del ResultSet son:

– boolean next(): desplaza el cursor a la siguiente fila. Devuelve true si hay fila, false si no.

– boolean first(): sitúa el cursor en la primera fila. Devuelve true si hay al menos una fila.

– void beforeFirst(): sitúa el cursor delante de la primera fila.– boolean previous(): sitúa el cursor en la fila anterior, si hay. Si no devuelve

false.– void afterLast(): sitúa el cursor detrás de la última fila.– boolean absolute(int i): sitúa el cursor en la fila i. Devuelve true si hay una fila

en esa posición. Las filas empiezan a numerarse a partir de 1.– boolean relative(int i): desplaza el cursor i posiciones desde donde se

encuentra actualmente. Devuelve true si hay una fila en esa posición.– boolean last(): sitúa el cursor en la última fila. Devuelve true si hay al menos

una fila.

Page 13: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 13

17.3. Consultas a la BDD

• Para acceder a los datos de cada fila de un ResultSet usamos los métodos “gets” (getInt, getBoolean…). A cada dato se puede acceder usando su posición (empezando por 1) en la fila o su nombre.ResultSet rs = stmt.executeQuery(“SELECT * FROM usuario”);while(rs.next()){

System.out.println(rs.getInt(“id”)); /*Accedo por el nombre del dato*/System.out.println(rs.getString(2)); /*Accedo por la posición del dato

en la fila*/System.out.println(rs.getString(3));

}rs.close(); //Cierro el ResultSet ya usado

Page 14: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 14

17.4. Manipulación de la información

• Podemos acceder a la información de nuestra BDD para modificarla de dos formas:– Usando los métodos de la clase “Statement”.– A través del objeto “ResultSet”.

• Las operaciones que podremos hacer son las típicas del lenguaje DML de SQL (INSERT, UPDATE, DELETE).

• A continuación se verá el código correspondiente a cada una de las opciones que tenemos.

Page 15: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 15

17.5. Inserción de registros con Statement

• Para poder ejecutar la sentencia INSERT con el objeto “Statement” usamos el método “executeUpdate”:Connection con = DriverManager.getConnection(url,

user, password);Statement stmt = con.createStatement();stmt.executeUpdate(“INSERT INTO usuario

VALUES(46, ‘Elena’, ‘1234567890’)”);

Page 16: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 16

17.6. Inserción de registros con ResultSet

• Para hacer INSERT con el objeto ResultSet usamos el método “insertRow”:Connection con = DriverManager.getConnection(url, user, password);Statement stmt =

con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

ResultSet rs = stmt.executeQuery(“SELECT * FROM usuario”);rs.moveToInsertRow();rs.updateInt(“id”, 47);rs.updateString(“nombre”, “Dani”);rs.updateString(“contrasenya”, “miPass”);rs.insertRow();

Page 17: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 17

17.6. Inserción de registros con ResultSet

• Obsérvese cómo se ha creado el objeto de la clase “Statement”, pasándole dos parámetros:Statement stmt =

con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

– TYPE_FORWARD_ONLY: a la hora de acceder a los datos de un ResultSet sólo se podrán recorrer sus filas secuencialmente empezando por la primera.

– CONCUR_UPDATABLE: los datos del ResultSet se pueden modificar. Los cambios afectarán también a la base de datos.

Page 18: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 18

17.7. Actualización de registros con Statement

• Ejecutamos la sentencia UPDATE con el método “executeUpdate” del objeto “Statement”:Connection con = DriverManager.getConnection(url,

user, password);Statement stmt = con.createStatement();stmt.executeUpdate(“UPDATE usuario SET nombre =

‘Helena’ WHERE id = 46”);

Page 19: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 19

17.8. Actualización de registros con ResultSet• Para hacer UPDATE con el objeto ResultSet usamos el método

“updateRow”:Connection con = DriverManager.getConnection(url, user, password);Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,

ResultSet.CONCUR_UPDATABLE);ResultSet rs = stmt.executeQuery(“SELECT * FROM usuario”);boolean encontrado = false;while(rs.next() && !encontrado){

if(rs.getInt(“id”) == 46){rs.updateString(“nombre”, “Helena”);rs.updateRow();encontrado = true;

}}

Page 20: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 20

17.9. Borrado de registros con Statement

• Ejecutamos la sentencia DELETE con el método “executeUpdate” del objeto “Statement”:Connection con = DriverManager.getConnection(url,

user, password);Statement stmt = con.createStatement();stmt.executeUpdate(“DELETE FROM usuario WHERE

id = 46”);

Page 21: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 21

17.10. Borrado de registros con ResultSet

• Para hacer DELETE con el objeto ResultSet usamos el método “deleteRow”:

Connection con = DriverManager.getConnection(url, user, password);Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,

ResultSet.CONCUR_UPDATABLE);ResultSet rs = stmt.executeQuery(“SELECT * FROM usuario”);boolean encontrado = false;while(rs.next() && !encontrado){

if(rs.getInt(“id”) == 46){rs.deleteRow();encontrado = true;}

}

Page 22: T17 - Gestion de BBDD

PROGRAMACIÓN – Daniel Santiago 22

17.11. Cerrar conexión

• Es importante tener en cuenta que debemos liberar los recursos de la BDD cuando ya no los usemos, es decir, cerrar la conexión.

• Al terminar nuestro trabajo con la base de datos cerraremos los siguientes recursos:– Cerramos el ResultSet: rs.close();– Cerramos Statement: stmt.close();– Cerramos Connection: con.close();