Cap V - Base de Datos

43
Capitulo V. JDBC 5.1. Introducción 5.2. ¿Qué es JDBC? 3.3. Mecanismos JDBC 5.4. Drives JDBC 5.5. Conexión a Sistemas de Gestión de Base de Datos. 5.5.1. Conexión a MySQL. 5.5.2. Conexión a PostgreSQL. 5.5.3. Conexión a ORACLE 5.5.4. Conexión a SQL Server 5.6. Sentencias 5.7. Interface ResultSet 5.8. Ejercicio 5.9. Evaluación

Transcript of Cap V - Base de Datos

Capitulo V. JDBC

5.1. Introducción

5.2. ¿Qué es JDBC?

3.3. Mecanismos JDBC

5.4. Drives JDBC

5.5. Conexión a Sistemas de Gestión de Base de Datos.

5.5.1. Conexión a MySQL.

5.5.2. Conexión a PostgreSQL.

5.5.3. Conexión a ORACLE

5.5.4. Conexión a SQL Server

5.6. Sentencias

5.7. Interface ResultSet

5.8. Ejercicio

5.9. Evaluación

Capitulo V. JDBC

5.1. Introducción

Una de las principales aplicaciones de cualquier lenguaje moderno es la posibilidad de

utilizar datos pertenecientes a un sistema de base de datos. La dificultad del manejo

de archivos y las facilidades de manejo de datos que ofrecen los sistemas gestores de

base de datos (SGBDs) son los causantes de esta necesidad.

En el mercado hay gran cantidad de bases de datos y cada una de ellas se maneja de

un modo diferente. Esto está en contra del planteamiento fundamental de Java que

intenta que la programación sea independiente de la plataforma. Hoy en día hay que

tener en cuenta que la inmensa mayoría de los SGBD administran bases de datos

relacionales. Éstas son bases de datos que permiten organizar los datos en tablas que

después se relacionan mediante campos clave y que trabajan con el lenguaje estándar

conocido como SQL. Cada tabla es una serie de filas y columnas, en la que cada fila

es un registro y cada columna un campo. Cada campo representa un dato de los

elementos almacenados en la tabla. Cada registro representa un elemento de la tabla.

No puede aparecer dos veces el mismo registro, por lo que uno o más campos forman

lo que se conoce como clave principal. La clave principal no se puede repetir en dos

registros y permite que los datos se relacionen.

En este capítulo se explica cómo acceder desde Java a MySQL, PostgreSQL,

ORACLE y SQL Server. La idea de Sun era desarrollar una sola API (Application

Programming Interfaces, Interfaz de Programación de Aplicaciones) para el acceso a

bases de datos, esta interfaz se conoce como JDBC (Java Data Base Connect). Los

requisitos eran:

JDBC sería una API a nivel SQL (el lenguaje SQL sería el que realizaría la

conexión con las bases de datos), independiente por tanto de la plataforma.

JDBC debía ser similar al funcionamiento de las API para acceso a bases de

datos existentes (en especial a la ya entonces famosa ODBC de Microsoft).

JDBC debía ser sencilla de manejar

5.2. ¿Qué es JDBC?

Java Database Connectivity (JDBC) es una interfaz de acceso a bases de datos con

conexión SQL que proporciona un acceso uniforme a una gran variedad de bases de

datos relacionales. JDBC también proporciona una base común para la construcción

de herramientas y utilidades de alto nivel. JDBC es una API de Java para ejecutar

sentencias SQL. Está formado por un conjunto de clases e interfaces programadas

con el propio Java. Permite interactuar con bases de datos, de forma transparente al

tipo de la misma. Como punto de interés JDBC es una marca registrada y no un

acrónimo, no obstante a menudo es conocido como “Java Database Connectivity”.

JDBC suministra una API estándar para los desarrolladores y hace posible escribir

aplicaciones de base de datos usando una API puro Java. Es decir, es una forma

única de programar el acceso a bases de datos desde Java, independiente del tipo de

la base de datos. JDBC realiza llamadas directas a SQL. Un único programa escrito

usando la API JDBC y el programa será capaz de enviar sentencias SQL a la base de

datos apropiada. Y, con una aplicación escrita en el lenguaje de programación Java,

tampoco es necesario escribir diferentes aplicaciones para ejecutar en diferentes

plataformas. La combinación de Java y JDBC permite al programador escribir una sola

vez y ejecutarlo en cualquier entorno. Java, siendo robusto, seguro, fácil de usar, fácil

de entender, y descargable automáticamente desde la red, es un lenguaje base

excelente para aplicaciones de base de datos. JDBC expande las posibilidades de

Java.

Estandares/Versiones JDBC

3.0 (desde JDK 1.4)

4.0 (desde JDK 1.6)

Se debe tener en cuenta descargar el driver JDBC para la versión de Java y el gestor

de Base de Datos correspondiente.

Ejemplo:

postgresql-8.3-603.jdbc4.jar

postgresql-8.3-603.jdbc3.jar

5.3. Mecanismo JDBC

Establecer conexión.

Crear sentencia.

Ejecutar sentencia.

Procesar resultados.

Finalizar sentencia.

Cerrar conexión.

Para acceder a un Sistema de Gestión de Base de Datos en Java es necesario:

Gestor de Base de

Datos

Conexión

Conexión

Conexión

Sentencia

Sentencia Sentenci

aInvocable

SentenciaPreparada

ExecuteUpdate()

ExecuteQuery()

Execute()getMoreResults()

getResultSet()

ResultSet

Metadatos

Datos

getConnection()

createStatement() prepareCall() prepareStatement()

Tener instalado el entorno de desarrollo de Java (SDK).

Tener instalada la API JDBC (normalmente incluido en el SDK).

Disponer del driver Java para el gestor de Base de Datos escogido o usar el

puente JDBC-ODBC.

Además de la API JDBC, el driver del gestor es una de las partes

fundamentales para al acceso a los datos. Es posible usar un driver Java

específico del gestor a acceder o se puede usar el driver JDBC-ODBC incluido

en la API.

5.4. Drivers JDBC

La conexión con la base de datos está manejada por la clase Driver JDBC. El SDK de

Java contiene sólo un driver JDBC, un puente jdbc-odbc que comunica con un driver

"Open DataBase Conectivity" (ODBC) existente. Otras bases de datos necesitan un

driver JDBC específico para esa base de datos.

En el siguiente enumerado se muestran cuatro clases diferentes de drivers JDBC con

url, nombre y password de Usuario. Este enumerado se utilizara en los ejemplos que

se presentan mas adelante.

public enum EDriverJDBC { MYSQL{ public String getName(){ return "MySQL"; } public String getDriver(){ return "com.mysql.jdbc.Driver"; } public String getUrl(){ return "jdbc:mysql://localhost/basedatos"; } public String getUserName(){ return "root"; } public String getPassword(){ return "admin"; } }, POSTGRESQL{ public String getName(){ return "PostgreSQL"; } public String getUserName(){ return "postgres"; }

public String getPassword(){ return "admin"; } public String getDriver(){ return "org.postgresql.Driver"; } public String getUrl(){ return "jdbc:postgresql://localhost/basedatos"; } }, SQLSERVER{ public String getName(){ return "SQL Server"; } public String getDriver(){ return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; } public String getUrl(){ return "jdbc:sqlserver://localhost:1433;databaseName=basedatos"; } public String getUserName(){ return "user"; } public String getPassword(){ return ""; } }, ORACLE{ public String getName(){ return "Oracle"; } public String getDriver(){ return "oracle.jdbc.driver.OracleDriver"; } public String getUrl(){ return "jdbc:oracle:thin:@192.168.1.2/ORCL"; } public String getUserName(){ return "oracle"; } public String getPassword(){ return "admin"; } }; public abstract String getName(); public abstract String getUserName(); public abstract String getPassword(); public abstract String getDriver(); public abstract String getUrl();}

getDriver(). Este método permite obtener el nombre del driver según el gestor

de Base de Datos a utilizar. Cada driver JDBC está configurado para entender

una URL específica, por eso se pueden cargar varios drivers JDBC a la vez.

getUrl(). Este método permite retornar la URL o cadena de conexión del gestor

Base de Datos a utilizar, en ella se especifica el nombre de la fuente de datos.

Este nombre identifica el esquema de la base de datos particular a la que

queremos acceder.

getUserName(). Este método permite retornar el nombre del usuario del gestor

de Base de Datos.

getPassword(). Este método permite retornar el password del usuario con el

cual vamos acceder al gestor de Base de Datos.

5.5. Conexión a Sistemas de Gestión de Base de Datos (SGBD)

El SGBD es el componente de software más importante de todo el sistema, maneja

todas las funciones generales, controla la transmisión de la información desde el nivel

externo hasta el nivel interno. El SGBD, suministra las herramientas necesarias para

manipular la BD y es catalogado como el componente de software más importante de

todo el sistema, maneja todas las funciones generales, tales como distanciar a los

usuarios de la base de datos de detalles de administración de base de datos.

Software que permite la interfase con la base de datos localizada en varios lugares.

A continuacion se presenta la clase generica conexión que permite:

Cargar el driver JDBC del gestor de Base de Datos.

Realizar la conexión con el gestor de Base de Datos.

Permitir el login del usuario que Ingresa al Sistema

Esta clase contiene todos lo métodos estaticos, se puede invocar estos métodos

dentro de otras clases de GUI con nombreClase.metodo().

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;

public class Conexion {

private static String userName = null; private static String password = null;

private static Connection connection = null; private static Statement statement = null; private static EDriverJDBC driverJDBC = null; private static Usuario userLogueado = null; /** * Método que carga el driver JDBC. * @param driverJDBC, driver seleccionado del enumerado * EDriverJDBC

*/ public static void cargarDriver(EDriverJDBC driverJDBC){ try { Conexion.driverJDBC = driverJDBC; Class.forName(Conexion.driverJDBC.getDriver()); conectar(); } catch( Exception e ) { System.out.println("No se pudo cargar el driver JDBC "+e.getMessage()); return; } } /** * Método que conecta a una Base de Datos. * */ private static void conectar(){ String url = null; userName = driverJDBC.getUserName(); password = driverJDBC.getPassword(); url = driverJDBC.getUrl(); try{ connection = DriverManager.getConnection(url,userName,password); if(connection != null){ System.out.println("Conectado a "+driverJDBC.getName()); } }catch(Exception e){ connection = null; System.out.println(e.getMessage()); } }

/** * Método que desconecta una Base de Datos. * */ public static void desConectar(){ try { if(statement != null){ statement.close(); } if(connection != null){ connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * Método que permite verificar si el lógin y contraseña introduccidos por el usuario * son correctos. * @param login, login de usuario * @param password, password de usuario * @return true si el login y el password son correctos. */ public static boolean getLogin(String login, String password){ if(login == null || login.trim().equals("")){ return false; } if(password == null || password.trim().equals("")){

return false; } PreparedStatement statement = null; ResultSet resultSet = null; try { switch(driverJDBC){ case MYSQL: statement = connection.prepareStatement("SELECT *FROM Usuario WHERE UsuLog LIKE ?"); statement.setString(1, login); resultSet = statement.executeQuery(); if(resultSet.next() && resultSet.getString("UsuPass").equals(password)){ setUsuario(resultSet); return true; } return false; case POSTGRESQL: statement = connection.prepareStatement("SELECT *FROM \"Usuario\" WHERE \"UsuLog\" LIKE ?"); statement.setString(1, login); resultSet = statement.executeQuery(); if(resultSet.next() && resultSet.getString("UsuPass").equals(password)){ setUsuario(resultSet); return true; } return false; case SQLSERVER: case ORACLE: statement = connection.prepareStatement("SELECT *FROM Usuario WHERE UsuLog LIKE ?"); statement.setString(1, login); resultSet = statement.executeQuery(); if(resultSet.next() && resultSet.getString("UsuPass").equals(password)){ setUsuario(resultSet); return true; } return false; default: return false; } } catch (SQLException e) { e.printStackTrace(); } return false; } /** * Método que permite guardar en un objeto los datos del usuario * logueado * @param resultado, hoja de resultados * @throws SQLException */ private static void setUsuario(ResultSet resultado) throws SQLException{ if(resultado == null){ return; } userLogueado = new Usuario(); userLogueado.setIdentificacion(resultado.getString("UsuCod")); userLogueado.setNombre(resultado.getString("UsuNom")); userLogueado.setApellido(resultado.getString("UsuApe")); userLogueado.setTipo(Integer.parseInt(resultado.getString("UsuTip"))); userLogueado.setLogin(resultado.getString("UsuLog")); userLogueado.setContraseña(resultado.getString("UsuPass")); } public static Connection getConexion() { return connection; } public static EDriverJDBC getDriverJDBC() {

return driverJDBC; } public static Usuario getUserLogueado() { return userLogueado; }}

5.5.1. Conexión a MySQL

Para poder conectar Java con una base de datos en MySQL, se requiere del Driver o

Connector (mysql-connector-java-3.0.17-ga-bin.jar). Este Driver puede habitualmente

bajarse de la página web de MySQL.

Este .jar o librería debe agregarse al proyecto que estamos desarrollando en el IDE

eclipse por medio de la opción Project explicada en el capítulo III (3.4.2. Creación de

Proyectos).

A manera de ejemplo vamos a crear una base de datos.

Usuario: root

Contraseña: admin

Base de Datos: basedatos

Tabla: Usuario.

a) Cargar el Driver JDBC. La clase driver JDBC se carga con una llamada a

Class.forName(drivername).

public static void cargarDriver(EDriverJDBC driverJDBC){ try { Conexion.driverJDBC = driverJDBC;

Class.forName(Conexion.driverJDBC.getDriver()); conectar(); } catch( Exception e ) { System.out.println("No se pudo cargar el driver JDBC "+e.getMessage()); return; } }

Se le pasa al llamado del método “cargarDriver” el valor MYSQL del enumerado.

getDriver() es igual a: "com.mysql.jdbc.Driver".

private void seleccionarDriver(){ Conexion.cargarDriver(EDriverJDBC.MYSQL);}

b) Conexión

public static void conectar(){ String url = null; userName = driverJDBC.getUserName(); password = driverJDBC.getPassword(); url = driverJDBC.getUrl(); try{ connection = DriverManager.getConnection(url,userName,password); if(connection != null){ System.out.println("Conectado a "+driverJDBC.getName()); } }catch(Exception e){ System.out.println(e.getMessage()); } }

Los datos del usuario, password y URL se sacan del Enumerado (EDriverJDBC) para

el gestor de Base de Datos MySql.

Debemos tener en cuenta que en la URL (jdbc:mysql://localhost/basedatos;)

localhost lo podemos remplazar por la IP donde está el SGBD.

Una conexión con una base de datos puede establecerse con la llamada al método

DriverManager.getConnection. La llamada toma una URL que identifica la base de

datos, y opcionalmente el nombre de usuario y la password para la base de datos.

Después de establecer la conexión, se puede ejecutar una sentencia contra la base

de datos. Los resultados de la sentencias pueden recuperarse y cerrarse la conexión.

A continuación el método que permite cerrar la conexión.

public static void desConectar(){ try { if(statement != null){ statement.close(); } if(connection != null){

connection.close(); } } catch (SQLException e) { e.printStackTrace(); } }

5.5.2. Conexión a PostgreSQL.

Para poder conectar Java con una base de datos en PostgreSQL se requiere del

Driver (postgresql-8.3-603.jdbc3.jar). Este Driver puede habitualmente bajarse de la

página web de PostgreSQL.

A manera de ejemplo vamos a crear una base de datos.

Usuario: postgres

Contraseña: admin

Base de Datos: basedatos

Tabla: Usuario.

a) Cargar el Driver JDBC. La clase driver JDBC se carga con un llamada a

Class.forName(drivername).

public static void cargarDriver(EDriverJDBC driverJDBC){ try { Conexion.driverJDBC = driverJDBC; Class.forName(Conexion.driverJDBC.getDriver()); conectar(); } catch( Exception e ) { System.out.println("No se pudo cargar el driver JDBC "+e.getMessage()); return;

} }

Se le pasa a la llamada del método “cargarDriver” el valor PostgreSQL del enumerado.

getDriver() es igual a: "org.postgresql.Driver ".

private void seleccionarDriver(){ Conexion.cargarDriver(EDriverJDBC.POSTGRESQL);}

b) Conexión

public static void conectar(){ String url = null; userName = driverJDBC.getUserName(); password = driverJDBC.getPassword(); url = driverJDBC.getUrl(); try{ connection = DriverManager.getConnection(url,userName,password); if(connection != null){ System.out.println("Conectado a "+driverJDBC.getName()); } }catch(Exception e){ System.out.println(e.getMessage()); } }

Los datos del usuario, password y URL se sacan del Enumerado (EDriverJDBC) para

el Sistema de Gestión de Base de Datos PostgreSQL.

Debemos tener en cuenta que en la URL

(jdbc:postgresql://localhost/basedatos;) localhost lo podemos remplazar por

la IP donde está el SGBD.

5.5.3. Conexión a ORACLE

Para poder conectar Java con una base de datos en ORACLE se requiere del Driver

(ojdbc14.jar). Este Driver puede habitualmente bajarse de la página web de ORACLE.

A manera de ejemplo también vamos a crear una base de datos.

Usuario: oracle

Contraseña: admin

Base de Datos: basedatos:

Tabla: Usuario.

a) Cargar el Driver JDBC. La clase driver JDBC se carga con un llamada a

Class.forName(drivername).

public static void cargarDriver(EDriverJDBC driverJDBC){ try { Conexion.driverJDBC = driverJDBC; Class.forName(Conexion.driverJDBC.getDriver()); conectar(); } catch( Exception e ) { System.out.println("No se pudo cargar el driver JDBC "+e.getMessage());

return; } }

Se le pasa al llamado del método “cargarDriver” el valor ORACLE del enumerado.

getDriver() es igual a: "oracle.jdbc.driver.OracleDriver".

private void seleccionarDriver(){Conexion.cargarDriver(EDriverJDBC.ORACLE);

}

b) Conexión

public static void conectar(){ String url = null; userName = driverJDBC.getUserName(); password = driverJDBC.getPassword(); url = driverJDBC.getUrl(); try{ connection = DriverManager.getConnection(url,userName,password); if(connection != null){ System.out.println("Conectado a "+driverJDBC.getName()); } }catch(Exception e){ System.out.println(e.getMessage()); } }

Los datos del usuario, password y URL se sacan del Enumerado (EDriverJDBC) para

el Sistema de Gestión de Base de Datos ORACLE.

Debemos tener en cuenta que en la URL

(jdbc:oracle:thin:@192.168.1.2/ORCL;) localhost se cambio por la IP

192.168.1.2 donde está instalada la Base de Datos ORCL de ORACLE.

5.5.4. Conexión a SQL Server

La conexión SQL Server se hace igual que las anteriores conexiones, solo que se debe usar el driver sqljdb.

5.6. Sentencias

Hay tres tipos básicos de sentencias SQL usadas en el API JDBC: CallabelStatement,

Statement, y PreparedStatement. Cuando se envía una sentencia Statement o

PreparedStatement a la base de datos, el driver la traduce a un formato que la base de

datos pueda reconocer.

Sentencias Callable. Una vez que hemos establecido una conexión con una

base de datos, podemos usar el método Connection.prepareCall para crear

una sentencia callable. Estas sentencias nos permite ejecutar procedimientos

almacenados SQL.

El siguiente ejemplo crea un objeto CallableStatement con seis parámetros para

almacenar información en la tabla Usuario en ORACLE.

private CallableStatement callableStatement = null;

callableStatement = this.connection.prepareCall("{call insertar_datos(?,?,?,?,?,?)}");callableStatement.setInt(1, Integer.valueOf(getCodigoTextField().getText()));callableStatement.setString(2, getNombreTextField().getText());callableStatement.setString(3, getApellidoTextField().getText());callableStatement.setInt(4, getTipoUsuario());callableStatement.setString(5, getLoginTextField().getText());callableStatement.setString(6, getContraTextField().getText());callableStatement.executeUpdate();

El procedimiento PL/SQL se muestra a continuación:

CREATE OR REPLACE PROCEDURE insertar_datos(v_codigo Usuario.UsuCod%type, v_nombre Usuario.UsuNom%type, v_apellido Usuario.UsuApe%type, v_tipo Usuario.UsuTip%type, v_login Usuario.UsuLog%type, v_pass Usuario.UsuPass%type)as beginINSERT INTO UsuarioVALUES(v_codigo,v_nombre,v_apellido,v_tipo,v_login,v_pass);end;/

El siguiente ejemplo crea un objeto CallableStatement con un parámetro para eliminar

un registro de la tabla Usuario en ORACLE.

private CallableStatement callableStatement = null;

callableStatement = this.connection.prepareCall("{call eliminar_datos(?)}");callableStatement.setInt(1, Integer.valueOf(getCodigoTextField().getText()));callableStatement.executeUpdate();

El procedimiento PL/SQL se muestra a continuación:

CREATE OR REPLACE PROCEDURE eliminar_datos(v_codigo Usuario.UsuCod%type)as beginDELETE FROM UsuarioWHERE UsuCod = v_codigo;end;/

Statements. El interface Statement nos permite ejecutar una simple sentencia

SQL sin parámetros. Las instrucciones SQL son insertadas dentro del objeto

Statement cuando se llama al método Statement.executeXXX method.

o Sentencias Query: El siguiente ejemplo crea un objeto Statements que

permite consultar la Tabla Usuarios en PostgreSQL y traer los registros

ordenados por el código del Usuario, estos resultados se asignan a un

objeto resultSet que se tratara más adelante.

private ResultSet resultSet = null;private Statement statement = null;

this.statement = this.connection.createStatement();this.resultSet =this.statement.executeQuery("select *from \"Usuario\" Order

by \"UsuCod\"");

o Sentencias Update: Este segmento de código crea un objeto Statement

y llama al método Statement.executeUpdate para eliminar un registro

de la tabla Usuario en PostgreSQL:

private Statement statement = null;

this.statement = this.connection.createStatement();this.statement.executeUpdate("delete from \"Usuario\" where \"UsuCod\" like '" + codigoTextfield.getText()+ "'");

Setencias Prepared. La interface PreparedStatement desciende del interface

Statement y usa una plantilla para crear peticiones SQL. Se usa una

PreparedStatement para enviar sentencias SQL pre compiladas con uno o

más parámetros.

o Query PreparedStatement: Los datos de los parámetros se insertan

dentro del objeto PreparedStatement llamando a sus métodos setXXX

y especificando el parámetro y su dato. Las instrucciones SQL y los

parámetros son enviados a la base de datos cuando se llama al

método executeXXX.

En este ejemplo se crea un objeto PreparedStatement para seleccionar y traer los

registros ordenados por el código de la Tabla Usuario de MySQL. El interrogante ("?")

indica que este sentencia tiene un parámetro:

private PreparedStatement statement = null;private ResultSet resultSet = null;

this.statement = this.connection.prepareStatement("SELECT *FROM Usuario ORDER BY ?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); this.statement.setString(1, "UsuCod");this.resultSet = this.statement.executeQuery();

o Update PreparedStatement: Este segmento de código crea un objeto

PreparedStatement para modificar el registro de la tabla Usuario de

SQL Server. La plantilla tiene seis parámetros, que se seleccionan con

seis llamadas a los métodos PreparedStatement.setXXX apropiados.

private PreparedStatement statement = null;

statement = this.connection.prepareStatement("UPDATE Usuario SET " + "UsuNom = ? , UsuApe = ?, UsuLog = ? ," + "UsuPass = ?, UsuTip = ? WHERE UsuCod = ?");

statement.setString(1, getNombreTextField().getText());statement.setString(2, getApellidoTextField().getText());statement.setString(3, getLoginTextField().getText());statement.setString(4, getContraTextField().getText());statement.setInt(5, getTipoUsuario());statement.setInt(6, Integer.valueOf(getCodigoTextField().getText()));statement.executeUpdate();

5.7. Interface ResultSet

El interface ResultSet maneja accesos a datos devueltos por una consulta. Los datos

devueltos son igual a una línea de la base de la tabla de la base de datos. Algunas

consultas devuelven una línea, mientras que muchas consultas devuelven múltiples

líneas de datos.

Se utilizan los métodos getType para recuperar datos desde columnas específicas

para cada fila devuelta en la consulta

EL siguiente método permite loguear a un Usuario cuando entra al Sistema validando

que el login y la contraseña digitada en la interfaz de Usuario sean correctos. Este

método funciona para ORACLE, MySQL y SQL Server. El método results.next mueve

hasta la siguiente fila recuperada hasta que se hayan procesado todas las filas

devueltas:

public static boolean getLogueo(String login, String password){ if(login == null || login.trim().equals("")){ return false; } if(password == null || password.trim().equals("")){ return false; } PreparedStatement statement = null; ResultSet resultSet = null; try { statement = connection.prepareStatement("SELECT *FROM Usuario WHERE UsuLog LIKE ?");

statement.setString(1, login); resultSet = statement.executeQuery(); if(resultSet.next() && resultSet.getString("UsuPass").equals(password)){ setUsuario(resultSet); return true; } return false; } catch (SQLException e) { e.printStackTrace(); } return false;}

Este método permite guardar la información del Usuario logreado en un beam. Se

recupera el valor de la columna con el método getString ().

private static Usuario userLogueado = null;

private static void setUsuario(ResultSet resultado) throws SQLException{ if(resultado == null){ return; } userLogueado = new Usuario(); userLogueado.setIdentificacion(resultado.getString("UsuCod")); userLogueado.setNombre(resultado.getString("UsuNom")); userLogueado.setApellido(resultado.getString("UsuApe")); userLogueado.setTipo(Integer.parseInt(resultado.getString("UsuTip"))); userLogueado.setLogin(resultado.getString("UsuLog")); userLogueado.setContraseña(resultado.getString("UsuPass"));}

Tanto Statements como PreparedStatements tienen un constructor adicional que

acepta un parámetro tipo scroll y otro tipo update. El valor del tipo scroll puede ser uno

de los siguientes valores:

ResultSet.TYPE_FORWARD_ONLY. Comportamiento por defecto en JDBC

1.0, la aplicación sólo puede llamar a next() sobre la hoja de resultados.

ResultSet.TYPE_SCROLL_SENSITIVE. La hoja de resultados es totalmente

navegable y las actualizaciones son reflejadas en la hoja de resultados cuando

ocurren.

ResultSet.TYPE_SCROLL_INSENSITIVE. La hoja de resultados es totalmente

navegable pero las actualizaciones son sólo visibles cuando se cierra la hoja

de resultados. Necesitamos crear una nueva hoja de resultados para verlos.

El parámetro del tipo update puede ser uno de estos dos valores:

ResultSet.CONCUR_READ_ONLY. La hoja de resultados es de sólo lectura.

ResultSet.CONCUR_UPDATABLE. La hoja de resultados puede ser

actualizada.

La hoja de resultados totalmente scrollable devuelve un cursor que puede moverse

usando comandos sencillos. Por defecto el cursor de la hoja de resultados apunta a la

fila antes de la primera fila en la hoja de resultados. Una llamada a next() recupera la

primera fila de la hoja de resultados. el cursor puede tambien moverse llamando a uno

de los siguientes métodos de ResultSet:

boolean next(). Avanza el puntero de registros del conjunto de resultados al

siguiente registro. Devuelve true si existe registro siguiente.

boolean previous(). Coloca el puntero de registros en el registro anterior si lo

hay, si no lo hay devuelve false.

boolean absolute(int registro). Coloca el puntero de registros en la fila

indicada. Si esa fila no existe, devuelve false. Si el número de fila se indica con

un número negativo, la fila se cuenta desde el final.

boolean relative(int fila). Coloca el puntero de registros en la fila indicada a

partir de la posición actual del puntero. Si esa fila no existe, devuelve false. El

número de fila se puede indicar de forma negativa y en ese caso el puntero se

mueve hacia el primer registro (si es positivo se mueve hacia el final).

boolean first(). Coloca el puntero en el primer registro. Si no hay primer

registro, devuelve false.

boolean last(). Coloca el puntero en el último registro. Si no hay último registro,

devuelve false.

void beforeFirst(). Coloca el puntero delante del primer registro. El método

next se movería al primer registro si se utiliza tras esta orden.

void afterLast(). Coloca el puntero detrás del último registro. El método

previous se movería al último registro si se utiliza tras esta orden.

boolean isFirst(). Devuelve true si el puntero está situado en el primer registro.

boolean isLast(). Devuelve true si el puntero está situado en el último registro.

boolean isBeforeFirst(). Devuelve true si el puntero está situado delante del

primer registro.

boolean isAfterLast(). Devuelve true si el puntero está situado detrás del último

registro.

int getRow(). Obtiene el número de registro actual.

5.8. Ejercicio

Nunca hay dos compañías iguales, pero la mayoría se enfrenta al mismo tipo de

problema a la hora de proteger su negocio. En la actualidad, las empresas tienen casi

asumida la protección de la red, si bien olvidan o postergan muchos problemas de

seguridad que amenazan desde fuera de la red. Este es un error peligroso. Imagine el

impacto en los siguientes casos: 

A un ejecutivo le roban o deja olvidado en un taxi su ordenador portátil, en el

que guardaba la estrategia de la empresa y datos financieros.

Una unidad de disco duro, retirada de un sistema que utilizaba el departamento

de administración y con información sobre nóminas, se reutiliza y acaba en el

ordenador del representante del departamento de atención al cliente, con todos

los datos en su interior.

Un dispositivo de almacenamiento digital, que contiene los datos de su plan de

marketing y lanzamientos de productos para el siguiente año fiscal, se cae del

bolsillo del jefe de marketing durante una feria comercial.

El reproductor de música digital de un trabajador en el que solía almacenar y

transferir proyectos de trabajo se vendió sin borrar todos los datos de la unidad.

La solución al problema es ocultar el contenido de un mensaje por medio de una serie

codificada de signos con el fin de transmitirlo a un receptor sin que nadie más pueda

leerlo, esto existe desde hace siglos. En la historia, la criptografía ha sido utilizada por

imperios, gobiernos y ejércitos para ocultar o codificar información secreta, a esto se le

llama cifrado de datos, que se puede entender como el hecho de guardar algo valioso

dentro de una caja fuerte cerrada con llave. Los datos confidenciales se cifran con un

algoritmo de cifrado y una clave que los hace ilegibles si no se conoce dicha clave. Las

claves de cifrado de datos se determinan en el momento de realizar la conexión entre

los equipos. El uso del cifrado de datos puede iniciarse en su equipo o en el servidor al

que se conecta.

El propósito fue desarrollar una aplicación que proporcione el cifrado de datos u

archivos confidenciales. De esta manera se incorpora una solución, aumentando la

seguridad contra ataques consistentes en el acceso de la información privada.

El software esta diseñado en un entorno gráfico facil de manejar para el usuario

permitiendo así que tanto el emisor como el receptor interesados en el encriptamiento

y desencriptamiento de la información puedan operarlo fácilmente. Se implementa dos

tipos de Usuario, un administrador encargado de crear los usuarios del sistema y un

empleado que tendrá acceso a los otros modulos de la aplicación excepto el modulo

de usuarios. La protección de datos mediante el cifrado de datos permite la protección

de cada archivo por separado con su propia clave y algoritmo de cifrado, de esta

manera, cada archivo permanece protegido de forma individual, independiente de

donde se encuentre (disco duro, servidor de red o soportes móviles, por ejemplo), y

solo pueden leerlo de forma clara los usuarios autorizados.

AgoCript proporciona una solución de software que permite a las pequeñas y

medianas empresas conseguir una protección de datos rápida, fiable y fácil de

administrar para todos sus ordenadores.

Las funciones que realiza AgoCript, las podemos clasificar en:

Funciones de Acceso al Sistema: En el módulo Usuarios se crean los usuarios

que tendrán acceso al sistema.

Funciones de Encriptamiento y Desencriptamiento: Permite encriptar y

desencriptar la información. Se utiliza la librería jasypt-1.5. Jasypt es una de

esas herramientas que facilitan la criptografía.

o Sigue los estándares y normas marcados por RSA tanto para message

digesting como para cifrado basado en clave, que el API de Java de por

sí no sigue.

o Es thread-safe por lo que evita todos los problemas relacionados con la

concurrencia.

AgoCript funciona con los siguientes Sistemas de Gestión de Base de Datos: MySQL,

PostgreSQL, ORACLE y SQL Server. La aplicación utiliza una base de datos con una

única tabla llamada Usuarios, donde se guarda la información de los usuarios que

tendrán acceso al sistema, estos usuarios son creados por otro usuario con el

privilegio Administrador.

La tabla Usuarios usa el siguiente esquema esquema: las 3 primeras letras de la tabla

y su complemento ejemplo UsuCod – Código del Usuario. A continuación se presentan

la estructura de datos para la tabla:

Tabla 1. Usuario

CAMPO TIPO DE DATO

TAMAÑO LLAVE REQUERIDO ALMACENA

UsuCod Numerico 2 Primaria Si Código de usuario

UsuNom Alfanumérico 40 Si Nombre de usuario

UsuApe Alfanumérico 45 Si Apellido del usuario

UsuTip Numerico 1 Si Tipo de usuario

UsuLog Alfanumerico 45 Si Login de usuario

UsuPass Alfanumérico 10 Si Contraseña del usuario

Fuente: Autores del Proyecto

Casos de Uso

Diagrama de Actividades

Diagrama de Clases

Las clases utilizadas en esta aplicación utilizan el siguiente esquema. [NombreClase]

[Componente que se utilizo JFrame, JDialogo o JPanel etc]. Las clases desarrolladas

para este sistema fueron:

IngresoAlSistemaPanel.java. Esta clase contiene los componentes necesarios

para la interfaz de acceso al sistema.

PrincipalFrame.java. Esta clase es la principal de la aplicación. Con el método

add se agrega el IngresoAlSistemaPanel.java al Frame y si los datos del

usuario son correctos se hace un removeAll al Frame y nuevamente con el

método add se agrega MenuPrincipalPanel.java.

MenuPrincipalPanel.java. Esta clase contiene los componentes necesarios

para mostrar la interfaz que permite navegar por toda la aplicación.

EncriptarDialog.java. Esta clase contiene los componentes necesarios para

mostrar la interfaz que permite encriptar los mensajes.

DesencriparDialog.java. Esta clase contiene los componentes necesarios para

mostrar la interfaz que permite desencriptar los mensajes.

UsuarioDialog.java. Esta clase contiene los componentes necesarios para

mostrar la interfaz que permite crear, editar y eliminar usuarios del sistema.

Otras clases.

Encriptar.java. Esta clase tiene metodos que permiten encriptar y desencriptar

un mensaje usando una clave pública (javax.crypto) o una clave privada

(Jasypt).

Cifrado.java. Un beam que permite guardar información sobre el mensaje y la

clave publica.

ClaseFileChooser.java. Esta clase permite agregar nuevas funcionalidades a la

clase JFileChooser.

ClaseFileFilter.java. Esta clase permite agregar nuevas funcionalidades a la

clase FileFilter.

ClasePanel.java. Esta clase permite agregar nuevas funcionalidades a la clase

JPanel.

ClaseConexion.java. Esta clase permite establecer la conexión con el gestor de

Base de Datos.

EDriverJDBC.java. Este enumerado permite tener a disposición los datos

necesarios de lo gestores de Base de Datos: MySQL, SQL Server, Oracle y

PostgreSQL para establecer las conexiones.

EOperacion.java. Este enumerado permite controlar las operaciones que se

hacen contra una tabla de la base de datos.

ETipoUsuario.java. Este enumerado permite controlar los tipos de usuarios que

se manejan para la aplicación.

Imagen.java. Esta clase permite consultar la ruta de una imagen en un archivo

de properties.

LimitadorNombres.java. Esta clase permite que en los compontes JTextField

que implementen esta clase, acepte solo valores alfanuméricos.

LimitadorNumeros.java. Esta clase permite que en los compontes JTextField

que implementen esta clase, acepte solo valores numéricos.

Usuario.java. Este beam permite almacenar la información de Usuario

logueado.

IconoImage.properties. Este archivo de properties permite establecer un

nombre y una ruta de la imagen. Con el nombre en el GUI tenemos acceso a la

ruta de la imagen.

5.9. Evaluación

Para cada uno de los siguientes ejercicios desarrollar:

Un modelo de base de datos que permita almacenar la información relacionada

con el sistema y que facilite la generación de informes y consultas

establecidas.

Realizar un diseño modular para la aplicación.

Elaborar los diagramas de Caso de Uso, Clases y Actividades.

Realizar la conexión con a la Base de Datos.

Desarrollar un proyecto para cada sistema que contenga: paquetes, clases,

métodos, enumerados, estructuras, etc...

Las aplicaciones deberán presentar una interfaz gráfica que permita realizar todas

las operaciones soportadas por cada una de ellas. El diseño de la interfaz del

sistema es libre. Únicamente se deberá tener en cuenta que permita una

interacción intuitiva y sencilla, además de cumplir con los requerimientos.

I. En una empresa se requiere implementar un control de la correspondencia

recibida y que deberá ser atendida por las diferentes secciones o

departamentos de la empresa.

Por cada recibo de correspondencia se almacena un código, un remitente, la

sección a la cual va dirigida, el asunto y la fecha y hora de recepción. Además

para cada correspondencia se plantea una prioridad, así: Rutinaria, Importante,

Urgente. Cada correspondencia tiene una sola prioridad.

Para cada sección se almacena un código, un jefe de sección y la ubicación de

la oficina.

Para cada remitente se almacena un código, nombre, teléfono y dirección.

El sistema debe permitir:

Listar las correspondencias enviadas a una sección específica.

Listar las correspondencias según un tipo de prioridad.

Listar las correspondencias del numero telefónico 6009870.

Desplegar solo la fecha en formato dd-month-yy de las correspondencias de

Andrea Estupiñan.

II. En una empresa educativa se requiere sistematizar el proceso de pago a

docentes de tiempo parcial. A un docente se le hace un contrato por número de

horas dictadas con un costo total, se debe tener en cuenta que cada docente

reporta mensualmente un número de horas y que cada hora tiene un valor

dependiendo del tipo de profesional que sea el docente (Técnico $9000,

Tecnólogo $11000, Ingeniero $14.000) este valor reportado debe se

descontado del valor total del contrato, también se debe tener en cuenta que

un docente puede tener más de un contrato no simultaneo y controlar que

materia es la que dicta.

El sistema debe permitir:

Listas las materias dictadas por un docente en particular.

Listar los docentes cuya profesión sean Ingenieros Electrónicos.

Listas los docentes que dictan la asignatura Base de Datos.

Listar las horas reportadas por el docente Ángel Fernando Lizcano Novoa y

Elkin Doney Suarez Gómez.

Listas las asignaturas dictadas por Katherine Martínez.

Listas los docentes cuyo costo total del contrato sea superior a $1.000.000 e

inferior a 3.000.000.

Desplegar las horas del contrato de Rafael Méndez de la asignatura

Programación Web.

III. Desarrollar un prototipo de software que facilite el registro de matrículas

académicas y el pago de pensiones de instituciones privadas de educación

media, con el fin de agilizar los procesos de captura de datos y generación de

informes, que faciliten la toma de decisiones por parte de los directivos.

El sistema debe permitir:

Almacena información básica del sistema como: estudiantes, grupos,

materias, docentes, entre otros.

facilitar el proceso de matrícula del estudiante.

generar los recibos de pago de pensión y se controlará el pago de los

mismos.

Validar los usuarios y el backup del sistema.

IV. Modulo I. Los siguientes enunciados constan de cuatro posibles respuestas,

usted debe marcar con una x la letra que corresponda a la respuesta que

considere correcta.

1. El objeto connection.

a. Representa una conexion con un objeto

b. Representa una conexion con una tabla

c. Representa una conexion con una base de datos.

d. Representa una conexion con la clase JDBC

2. La forma estandar de establecer una conexion a la base de datos

a. Es mediante la llamada al método: DriverManager.getConnection

b. Es mediante la llamada al método: connection

c. Es mediante la llamada al método: prepareStatement

d. Es mediante la llamada al método: getString

3. La sentencia Callable

a. Ejecutan procedimientos PL/SQL.

b. Ejecutan sentencias Insert

c. Ejecutan sentencias Update

d. Ejecutan sentencias Delete

4. La sentencia Statements

a. Ejecutan simples sentencias sin parámetros

b. Ejecutan sentecias con parámetros.

c. Ejecutan solo sentencias Insert y Update.

d. No Ejecutan ninguna sentencia.

5. La setencia Prepared

a. Ejecuta sentecias con paramtretros

b. Ejecuta procedimientos almacenados

c. Ejecuta sentencias unificadas

d. Ejecuta instrucciones SQL al servidor.

6. El metodo ResultSet.next se usa:

a. Para moverse a la siguiente fila del result set, convirtiendo a esta en la

fila actual.

b. Para moverse a la anterior fila

c. Para moverse a la siguiente fila del result set, convirtiendo a esta en la

fila siguiente.

d. Para moverse a la siguiente fila del result set, convirtiendo a esta en la

última fila.

7. El valor de ResultSet.TYPE_SCROLL_INSENSITIVE

a. Hoja de resultados es navegable

b. Hoja de resultados no es navegable

c. Solo funciona el metodo ResultSet.next

d. Todas las afirmaciones anteriores son falsas.

8. El metodo isFirst

a. Coloca el puntero delante del primer registro.

b. Devuelve true si el puntero está situado en el primer registro

c. Obtiene el número del registro actual

d. Devuelve false si está en el último registro

9. Son comando DML (Lenguaje de Manipulacion de Datos).

a. SELECT, CREATE Y DROP

b. SELECT, INSERT, UPDATE Y DELETE

c. SELECT, CREATE, UPDATE

d. SELECT, INSERT, UPDATE, DELETE Y CREATE.

10. Son comandos DDL (Lenguaje de Definición de Datos).

a. CREATE, DROP Y ALTER

b. UPPER, DROP Y ALTER

c. REPLACE, CREATE Y ALTER

d. CREATE, DROP, ALTER Y UPDATE

V. Modulo II. Los siguientes enunciados constan de cuatro posibles respuestas,

usted debe marcar con una x la letra que corresponda a la respuesta que

considere incorrecta.

11. JDBC

a. Es una interfaz de acceso a bases de datos.

b. Es una API de Java para ejecutar sentencias SQL.

c. Suministra una API estandar para los desarrolladores y hace posible

escribir aplicaciones de base de datos usando una API puro de Java.

d. JDBC es una Clase de acceso a base de datos.

12. Los tipos se sentencias SQL usadas en el API – JDBC

e. CallabelStatement

f. Statement

g. PreparedStatement

h. Insert, Delete y Update

13. La Interfaz ResultSet

i. Manejo accesos a datos devueltos por una consulta.

j. Contiene todas las filas que satisfacen las condiciones de una sentencia

SQL.

k. Proporciona el acceso a los datos mediante metodos get.

l. Usa paramentros de acceso a datos

14. JDBC realiza varias funciones:

a. Conecta con la base de datos, la base de datos puede ser local o

remota

b. Envia sentencias SQL

c. Manipula los registros de la base de datos

d. Permite conectar dos interfaces.

15. JDBC vs ODBC

a. ODBC está escrito en C

b. El gestor de drivers ODBC y el propio driver han de ser instalados en

todos los ordenadores.

c. JDBC esta escrito en Java y permite obtener aplicaciones completas en

Java.

d. JDBC disminuye el rendimiento de maquina.