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
Top Related