ISG3 - Diseño de la capa de datos II

39
Departamento de Departamento de Lenguajes y Sistemas Informáticos Lenguajes y Sistemas Informáticos escuela técnica superior de ingeniería informática Ingeniería del Software II  Diseño de la capa de datos. Acceso a datos con JDBC

Transcript of ISG3 - Diseño de la capa de datos II

  • Departamento deDepartamento deLenguajes y Sistemas InformticosLenguajes y Sistemas Informticos

    escuela tcnica superiorde ingeniera informtica

    Ingeniera del Software II

    Diseo de la capa de datos.

    Acceso a datos con JDBC

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

  • Introduccin

    Problema: Cmo separamos la lgica de

    negocio del acceso a los datos?

    Solucin: Utilizaremos el patrn DAO (Core

    J2EE Patterns ) para desacoplar el acceso a datos de la lgica de negocio.

    http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

    Usaremos JDBC para acceder al SGBD

  • Capa de acceso a datos

    MySQL Connector/J(Driver JDBC)

    MySQL

    Capa de datos (DAO)

    Lgica de negocio Herramientas:

    MySQL

    MySQL Connector/J (driver tipo 4 para MySQL)

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

  • Introduccin

    JDBC es un API (java.sql.*) proporcionada por Sun para lanzar sentencias SQL a bases de datos relacionales (estndar ANSI SQL-2)

    Los desarrolladores de SGBD proporcionan la implementacin de esa interfaz (Drivers)

  • Arquitectura

    Tipo 1: (JDBC-ODBC Bridge) delegan el acceso a datos a una API ODBC

    Tipo 2: Usan cdigo nativo para el acceso a datos y proveen un envoltorio de clases java para las llamadas al driver. Es por tanto especfico para una plataforma

    Tipo 3: Driver 100% Java / Protocolo nativo. Se comunica con el SGBD utilizando el protocolo de red nativo del servidor

    Tipo 4: Driver 100% Java / Protocolo independiente. Hace las peticiones de datos a un intermediario en un protocolo de red independiente del SGBD DBMS

    DriverJDBC

    BridgeJDBC/ODBC

    Driver ManagerJDBC

    APIJDBC

    DBMS

    DriverODBC

  • Modo de trabajo en JDBC

    Cargar driver

    Descargar driver

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

  • JDBC

    Necesitar: Alguien que represente a un gestor de

    drivers: DriverManager Alguien que represente a las

    conexiones: Connection Alguien que represente a las sentencias: PreparedStatment

    Alguien que represente a los resultados: ResultSet

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

    Cargar driver

    Descargar driver

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

  • Cargar/Descargar el driver

    Cargar el driver:

    Class

    +static forName(): Class+newInstance(): Object

    DriverManager

    +static registerDriver(dbDriver: Driver)+static deregisterDriver(dbDriver: Driver)+static getConnection(dBUri: String, username: String, password: String): Connection

  • Cargar/Descargar el driver

    Cargar el driver:

    Descargar el driver:

    Ejemplos de nombres de driver: com.microsoft.jdbc.sqlserver.SQLServerDriver

    (SQLServer) com.mysql.jdbc.Driver (MySQL Connector/J)

    Driver dBDriver = (Driver) Class.forName(driverName) .newInstance();DriverManager.registerDriver(dBDriver);

    DriverManager.deregisterDriver(dBDriver);

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

    Ejemplos

  • Identificacin del SGBD

    Se usa una URI para identificar al DBMS

    Transporte: jdbc Tipo de base de datos: mysql Nombre del servidor: 127.0.0.1 Puerto: 3306 Base de datos: POS

    jdbc:mysql://127.0.0.1:3306/POS

  • Obtener/liberar conexiones

    Una conexin con la base de datos se establece usando un driver ya registrado:

    Liberar conexin:

    Connection conn = DriverManager.getConnection(dBUri, username, password);

    conn.close();

    Connection

    +close()+prepareStatement(String s): PreparedStatement

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

    Cargar driver

    Descargar driver

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

    Obtener conexin

    Lanzar consulta

    Cerrar conexin

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

  • Lanzar consultas

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

  • Crear una sentencia JDBC

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

    PreparedStatement

    +setBoolean(x: int, y: boolean)+setByte(x: int, y: byte)+setDate(x: int, y: Date)+setDouble(x: int, y: double)+setString(x: int, y: String)+executeQuery(): ResultSet+executeUpdate(): int+execute(): boolean

    Connection

    +close()+prepareStatement(String s): PreparedStatement

  • Interfaces proporcionadas por JDBC Statement

    Para la ejecucin de sentencias SQL estticas en tiempo de ejecucin

    PreparedStatement Para la ejecucin de sentencias SQL, se

    precompilan (ms rpidas) y aceptan parmetros de entrada en tiempo de ejecucin

    CallableStatement Para la ejecucin de procedimientos almacenados

    en la base de datos

  • PreparedStatement Se crean usando el mtodo prepareStatement de una conexin

    El parmetro s hace referencia a la consulta SQL, en la que pueden aparecer parmetros

    De existir parmetros, usamos los mtodos setXXX(x,y) para darles valor (x identifica al parmetro, y al valor que toma)

    PreparedStatement con.prepareStatement(String s)

    String sql = "DELETE FROM Customer WHERE (CUSTOMERID = ?)";

  • Mtodos setXXX(x,y)

    ObjectsetObject(x,y)

    Tipo del valor yMtodo de PreparedStatement

    TimeStampsetTimeStamp(x,y)

    intsetInt(x,y)longsetLong(x,y)

    floatsetFloat(x,y)doublesetDouble(x,y)

    StringsetString(x,y)TimesetTime(x,y)

    DatesetDate(x,y)bytesetByte(x,y)booleansetBoolean(x,y)

  • Ejemplos

    PreparedStatement stmt = null;String sql = "DELETE FROM Customer WHERE (CUSTOMERID = ? ) "; stmt = conn.prepareStatement(sql); //conn es una conexin vlidastmt.setString(1, customerID);

    PreparedStatement stmt = null;String sql = "SELECT * FROM Customer";stmt = conn.prepareStatement(sql); //conn es una conexin vlida

    PreparedStatement stmt = null;String sql = "INSERT INTO CUSTOMER (OID, CUSTOMERID, NAME, SURNAME)+ VALUES (?, ?, ?, ?)";stmt = conn.prepareStatement(sql);stmt.setString(1, 33423);stmt.setString(2, Customer 1);stmt.setString(3, Name 1);stmt.setString(4, Name 2);

  • Ejecucin de sentencias

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

    PreparedStatement

    +setBoolean(x: int, y: boolean)+setByte(x: int, y: byte)+setDate(x: int, y: Date)+setDouble(x: int, y: double)+setString(x: int, y: String)+executeQuery(): ResultSet+executeUpdate(): int+execute(): boolean

  • Mtodos de PreparedStatement ResultSet executeQuery()

    Ejecuta una sentencia de tipo SELECT, devuelve un objeto ResultSet con los resultados de la consulta

    int executeUpdate() Ejecuta una sentencia de tipo INSERT,

    UPDATE o DELETE. Devuelve el nmero de registros insertados/actualizados/borrados

    boolean execute() Para la ejecucin de procedimientos almacenados

    en la base de datos,

  • Tratar el resultado

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

    Resulset

    +next(): boolean+first(): boolean+getXXX(s: String): XXX+close()

  • Tratar el resultado

    El resultado de ejecutar un SELECT se devuelve en un objeto de tipo ResulSet

    Mtodos de inters: next(): para iterar por las filas del ResulSet (la primera llamada nos posiciona en la primera fila de resultados)

    first(): para ir al principio del ResulSet getXXX(s): devuelve el valor, dentro de

    una fila, especificado por s (ndice o nombre de columna)

  • Mtodos getXXX(s)

    ObjectgetObject(s)

    Tipo JavaMtodo de ResulSet

    TimeStampgetTimeStamp(s)

    intgetInt(s)longgetLong(s)

    floatgetFloat(s)doublegetDouble(s)

    StringgetString(s)TimegetTime(s)

    DategetDate(s)bytegetByte(s)booleangetBoolean(s)

  • Liberar recursos

    Crear sentencia JDBC

    Ejecutar sentencia

    Tratar resultado

    Liberar recursos

    Resulset

    +next(): boolean+first(): boolean+getXXX(s: String): XXX+close()

    PreparedStatement

    +setBoolean(x: int, y: boolean)+setByte(x: int, y: byte)+setDate(x: int, y: Date)+setDouble(x: int, y: double)+setString(x: int, y: String)+executeQuery(): ResultSet+executeUpdate(): int+execute(): boolean+close()

  • Liberar recursos

    Liberar los objetos usados del tipo: PreparedStatement ResulSet (si hemos lanzado un SELECT)

    PreparedStatement stmt = null;ResulSet result = null;...stmt.close();result.close();

  • Ejemplos de consultas

    OID = customerIDnamesurname

    Customer

    CREATE TABLE CUSTOMER ( OID varchar(50) NOT NULL, CUSTOMERID varchar(50) NOT NULL, NAME varchar(50) NOT NULL, SURNAME varchar(50) NOT NULL,PRIMARY KEY(OID));

    -customerID-name-surname

    Customer

  • Ejemplo de Select (1)

    PreparedStatement stmt = null; ResultSet result = null; Customer c = null; String sql = "SELECT * FROM CUSTOMER WHERE (CUSTOMERID = ? ) ";

    stmt = conn.prepareStatement(sql); //conn es una conexin vlida stmt.setString(1, customerID); result = stmt.executeQuery();

    result.next(); c = new Customer(); c.setCustomerID(result.getString("CUSTOMERID")); c.setName(result.getString("NAME")); c.setSurname(result.getString("SURNAME"));

    result.close(); stmt.close();

  • Ejemplo de Select (2)

    PreparedStatement stmt = null; List searchResults = new LinkedList(); ResultSet result = null; String sql = "SELECT * FROM Customer"; stmt = conn.prepareStatement(sql); //conn es una conexin vlida stmt.executeQuery(); result = stmt.executeQuery();

    while (result.next()) { Customer temp = new Customer(); temp.setCustomerID(result.getString("customerID")); temp.setName(result.getString("name")); temp.setSurname(result.getString("surname")); searchResults.add(temp); }

    result.close(); stmt.close();

  • Ejemplo de Insert

    PreparedStatement stmt = null; String oid = UIDGenerator.getInstance().getKey();

    String sql = "INSERT INTO CUSTOMER (OID, CUSTOMERID, NAME, SURNAME)+ VALUES (?, ?, ?, ?)"; stmt = conn.prepareStatement(sql);

    stmt.setString(1, oid); stmt.setString(2, c.getCustomerID()); stmt.setString(3, c.getName()); stmt.setString(4, c.getSurname());

    stmt.executeUpdate();

    stmt.close();

  • Ejemplo de Delete

    String sql = "DELETE FROM Customer WHERE (CUSTOMERID = ? ) "; PreparedStatement stmt = null; stmt = conn.prepareStatement(sql); //conn es una conexin vlida stmt.setString(1, customerID);

    stmt.executeUpdate();

    stmt.close();

  • ndice

    Introduccin JDBC

    Cargar/Descargar el driver Obtener/liberar conexiones Lanzar consultas Tratamiento de las excepciones

  • Tratamiento de excepciones

    Se pueden producir una excepcin: Al cargar el driver (Class.forName):

    InstantiationException IllegalAccessException ClassNotFoundException

    Al utilizar los mtodos definidos en las interfaces que proporciona JDBC (JDBC usa excepciones para el tratamiento de los errores) : SQLException

  • Captura de las excepciones

    ...try { // Aqu va el cdigo para cargar el driver} catch(Exception e) { System.err.println(e.getMessage());}...

    ...try {// Aqu va el cdigo que podra generar la excepcin.} catch(SQLException e) { // Descripcin del error System.out.println("Message: " + e.getMessage()); // identificacin del error System.out.println("SQLState: " + e.getSQLState()); // Cdigo de error del vendedor System.out.println("ErrorCode: " + e.getErrorCode());}...

    Carg

    ar

    dri

    ver

    Mto

    do

    s jd

    bc

  • Mtodos JDBC (liberacin recursos) A veces es necesario liberar recursos, se

    produzca o no una excepcin

    ...PreparedStatement stmt;ResultSet result;Connection conn;...try {// Aqu va el cdigo que podra generar la excepcin.// y que hace uso de stmt, result y conn} catch (SQLException e) { System.out.println("Message: " + e.getMessage()); System.out.println("SQLState: " + e.getSQLState()); System.out.println("ErrorCode: " + e.getErrorCode());} finally { conn.close(); if (result != null) {result.close();} if (stmt != null) {stmt.close();} }...

  • Gracias!

    Podemos mejorar esta leccin?

    Mndanos un email a [email protected]

    Visita la web: www.lsi.us.es