bases de datos en java - intro a jdbc
DESCRIPTION
Curso de introducción al manejo de Bases de Datos en Java con JDBC.TRANSCRIPT
Bases de Datos en JAVAIntroducción a JDBC
Carlos Hernando [email protected] 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.