Post on 28-Oct-2015
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.