Bases de Datos en Java - Intro a JDBC

Post on 17-Dec-2014

5.666 views 0 download

description

Curso de introducción al manejo de Bases de Datos en Java con JDBC.

Transcript of Bases de Datos en Java - Intro a JDBC

Bases de Datos en JAVAIntroducción a JDBC

Carlos Hernando Carasolchernando@acm.org10 de Mayo de 2011

Índice de contenidos

Motivación del uso de Bases de DatosIntroducción a JDBCConexionesEjecución de sentencias SQLSecuencias especialesTransacciones

Motivación para usar BBDD

Enterprise Edition

Tratamiento de mayor cantidad de datosOptimización para almacenamientoOptimización para recuperaciónOptimización para manipulación

Arquitectura Cliente / ServidorConcentrar la lógica de negocio

Data independence

Introducción JDBC

Motivación JDBC

Unifi car el acceso a las Bases De datosSimilar a ODBC

Tipos de Drivers JDBC

Type 1: JDBC-ODBC Bridge driver (Bridge)Type 2: Native-API/partly Java driver (Native)Type 3: AllJava/Net-protocol driver (Middleware)Type 4: All Java/Native-protocol driver (Pure)

Necesidades

1 servidor1 base de datos1 usuario1 conector o driver1 API

Estableciendo conexión

Cargando el Driver a mano

Necesario en versiones antiguasHay que cargar el driver a mano:

Class.forName(“nombre del driver”)

DriverManager

This fully implemented class connects an application to a data source, which is specifi ed by a database URL. When this class fi rst attempts to establish a connection, it automatically loads any JDBC 4.0 drivers found within the class path. Note that your application must manually load any JDBC drivers prior to version 4.0.

Ejemplo de DriverManager

Connection conn = null;conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", “usuario”, “contraseña”);

Definición de origen de datos

jdbc:mysql://localhost:3306/test?opcion=1jdbc: mysql: dialectolocalhost: dirección o IP del servidortest: nombre de la base de datosopicion=1: opciones adicionales

DataSource

This interface is preferred over DriverManager because it allows details about the underlying data source to be transparent to your application. A DataSource object's properties are set so that it represents a particular data source.

Ejemplo de DataSource

ctx = new InitialContext();DataSource ds = (DataSource)ctx.lookup("jdbc/fastCoffeeDB");Connection con = ds.getConnection( "myLogin", "myPassword");

Ejemplo de DriverManager

Connection conn = null;conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", “usuario”, “contraseña”);

Ejercicio

Establecer conexión con la base de datosProbar los diferentes errores

Usuario/contraseña incorrectoBase de datos incorrectoServidor/puerto incorrectoSin el driver disponible…

Ejecución de secuencias SQL

Ejecución de secuencias

Clase StatementSe obtiene a partir de Connection

Tipos de Statement

Para consultas: executeQueryPara modifi caciones: executeUpdatePara ambos: executeEspeciales

Llamadas a procedimientos almacenadosPrepared statementBatch

Tipos de Statement

ExecuteQueryEjecuta SQL que devuelve resultadosDevuelve un ResulSet

Ejemplo

ResultSet rs = stmt.executeQuery(“Consulta”);while (rs.next()) {…}stmt.close();

Ejercicio

Conectarse a la base de datos de sakilaSeleccionar todos los paises de la tabla countryPor cada fi la devuelta imprimir por salida estándar números consecutivos

ResultSet

Devuelve todas las fi las seleccionadasDesconoce el número de columnas y contenido hasta la ejecución

ResultSet MetaData

ResulSetMetaDataResultSetMetaData rsm = rs.getMetaData();

for (int i = 1; i < rsm.getColumnCount() + 1; i++) {

System.out.println(rsm.getColumnName(i));

System.out.println(rsm.getColumnTypeName(i));

}

Ejercicio

Mostrar qué tipo de datos hay en la tabla “customer”

Obtener campos

Normalmente sabremos los datos que queremos obtener de la base de datosUtilizamos:

GetTipo(nombre)GetTipo(posicion)Tipo es en tipo Java.

Ejercicio

Mostrar todas las fi las con el formato:ID: valorAtributo1: valor1; Atributo2: valor2...

de la tabla “actor”

Tipos de datosCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT booleanBOOLEAN booleanTINYINTbyteSMALLINTshortINTEGER intBIGINT longREAL fl oatFLOAT doubleDOUBLE double

BINARY byte[]VARBINARY byte[]LONGVARBINARY byte[]DATE java.sql.DateTIME java.sql.TimeTIMESTAMP java.sql.TimestampCLOB ClobBLOB BlobARRAY ArrayDISTINCT mapping of underlying typeSTRUCT StructREF RefDATALINK java.net.URLJAVA_OBJECT underlying Java class

Tipos de Statement

ExecuteUpdateEjecuta modifi cacionesDevuelve número de elementos afectados

Ejemplo Crear tablas

String createString = "create table prueba..."; Statement stmt = null; try { stmt = con.createStatement(); stmt.executeUpdate(createString); } catch (SQLException e) { // TODO! } fi nally { if (stmt != null) { stmt.close(); } }

Insertar contenidos

Statement stmt = null; try { stmt = con.createStatement(); stmt.executeUpdate("insert into prueba …"); } catch (SQLException e) { // TODO! } fi nally { if (stmt != null) { stmt.close(); } }

Ejercicio

Insertar un actorElegir un país de country

Cambiar todas las ciudades de city que referencien al pais elegido por otroEliminar el país de country

En todas las operaciones mostrar el número de fi las afectadas

Tipos de Statement

ExecuteMezcla de los anterioresUtilizado para consultas en tiempo de ejecuciónDevuelve un boolean

GetResultSet()GetUpdateCount()

Ejercicio

Preparar una método ejecutarQuerySi hay resultados mostrar los campos y valoresSi hay modifi caciones mostrar su número

Ejecutar el método conUna consulta tipo SELECTUna tipo UPDATE(podéis pedir la consulta por entrada estándar)

Prepared Statements

Se utilizan cuando vamos a ejecutar la misma consulta varias vecesQueremos que la base de datos se prepare y optimice la consulta

Ejemplo de Prepared Statements

PreparedStatement updateSales = con.prepareStatement("update " + dbName + ".COFFEES " + "set TOTAL = TOTAL + ? where COF_NAME = ?");

Lanzando un Prepared Statements

// Fijo los parámetrosupdateSales.setInt(1, 100); updateSales.setString(2, “Franpuchino”);// Lanzo la consultaupdateSales.executeUpdate();

Ejercicio

Preparar una consulta (puede ser update)Ejecutarla dos veces con parámetros diferentes

Stored Procedures

cs = this.con.prepareCall("{call RAISE_PRICE(?,?,?)}");// Fijamos parámetroscs.setString(1, coffeeNameArg);cs.setFloat(2, maximumPercentageArg);…// Llamamos al procedimientocs.execute();

Batch

Realizamos varias sentencias SQL… esperamos al fi nal para procesarlas.Devuelve un array de modifi cados

Ejemplo de Batch

this.con.setAutoCommit(false);stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Amaretto', 49, 9.99, 0, 0)");stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Hazelnut', 49, 9.99, 0, 0)");this.con.setAutoCommit(true);int [] updateCounts = stmt.executeBatch();

Ampliando funcionalidad del ResultSet

Tipos de ResultSet

TYPE_FORWARD_ONLYTYPE_SCROLL_INSENSITIVETYPE_SCROLL_SENSITIVECONCUR_READ_ONLYCONCUR_UPDATABLEHOLD_CURSORS_OVER_COMMITCLOSE_CURSORS_AT_COMMIT

Cursores

NextPreviousFirstLastBeforeFirstAfterLastrelative(int rows)absolute(int row)

Actualizando ResulSet

UpdateTIPO(columna, valor)UpdateRow()

Insertando Rows

uprs.moveToInsertRow();uprs.updateString("COF_NAME", coffeeName);uprs.updateInt("SUP_ID", supplierID);uprs.updateFloat("PRICE", price);uprs.updateInt("SALES", sales);uprs.updateInt("TOTAL", total);uprs.insertRow();uprs.beforeFirst();

Ejercicio

Obtener un listado de actoresModifi car uno de ellos

Tipos de RowSet

Connected RowSet ObjectsJdbcRowSet

Disconnected RowSet ObjectsCachedRowSetWebRowSetJoinRowSetFilteredRowSet

RowSet

PropiedadesJavaBeans notifi cacionesScrollActualización

http://download.oracle.com/javase/6/docs/api/javax/sql/RowSet.html

Transacciones

Transacciones

con.setAutoCommit(false);con.commit();

con.setAutoCommit(true);

SavePoint y RollBack

Savepoint save1 = con.setSavepoint();...con.rollback(save1);…con.commit();

Eliminar un Savepoint

Connection.releaseSavepoint

Caso práctico

Diseño orientativo

Ejercicio

Utilizar el código del otro caso como baseProporcionar para las entidades:

ListadoCreación y actualización de registrosEliminar un registro

Listado de las vistasLlamada al procedimiento “tarea_notifi cada”

Ejercicio cont.

Crear un Prepared Statement para una de las vistasInsertar múltiples tareas de una vezFijar la fecha de las tareas un día tras otro por personaCambiar la ejecución de una tarea, reasignarla a otra persona y si esa persona ya tiene otra tarea para la misma fecha límite cancelar toda la operación.