FACULTAD DE INGENIERIA
E.A.P INGENIERIA DE SISTEMAS E INFORMATICA
MANUAL DE TECNOLOGIA CLIENTE - SERVIDOR CON JAVA
Ing. Mirko Manrique Ronceros
INDICE
Introducción 02
Programación Cliente – Servidor 03
Herramientas para la Programación Cliente – Servidor 04
Arquitectura Cliente – Servidor 06
Conectividad a la Base de Datos con JDBC 08
Uso del Entorno Netbeans para conexión a Base de Datos 16
Acceso de la base de datos y el paquete java.sql 26
Objeto de control JTable en mantenimiento de datos 38 Swing, Menús y mantenimiento de datos usando varias tablas 50 Mantenimiento de datos usando procedimientos almacenados 66
Transacciones y Búsquedas con base de datos 77
INTRODUCCION
La tecnología llamada Cliente /Servidor es actualmente utilizada en casi todas las aplicaciones administrativas e Internet/Intranet. Bajo este esquema, un servidor es un ordenador remoto, en algún lugar de una red, que proporciona información según se le solicite. Mientras que un cliente funciona en su computadora local, se comunica con el servidor remoto y pide a éste información.
Los sistemas Cliente-Servidor pueden ser de muchos tipos, pues esto depende principalmente de las aplicaciones instaladas en el propio servidor. Entre otros, existen: servidores de impresión mediante los cuales los usuarios comparten impresoras, servidores de archivos con los que los clientes comparten discos duros, servidores de bases de datos donde existe una única base de datos que es consultada por los clientes y puede o no ser modificada por ellos y servidores Web que utilizan también la tecnología Cliente/Servidor, aunque añaden aspectos nuevos y propios a la misma.
Los servidores web quizás actualmente son los de mayor importancia. Un servidor web es aquel que permite a los clientes compartir datos, documentos y multimedia en formato web. Aunque parte de la tecnología Cliente/Sevidor, el servidor Web aporta ventajas adicionales a un servidor tradicional.
El presente documento Tecnología Cliente Servidor con Java es un manual orientado al conocimiento del lenguaje Java, utilizando como entorno de desarrollo NetBeans y un gestor de bases de datos de preferencia MySql. En este manual se hará una presentación y estudio de las interfaces visuales a través de Java como lenguaje de programación. El manual tendrá 03 temas fundamentales, la primera es el “Acceso de Datos”, la segunda es “Mantenimiento de Datos” y la tercera “Consultas e Informes”.
Progra
m
aci
ó
n
Cliente - Servidor
Java es un nuevo lenguaje de programación, como tantos otros. Así que uno se pregunta el por qué del revuelo que se ha formado con su aparición. La respuesta no es inmediatamente obvia si se observa el asunto desde el punto de vista de la programación tradicional, porque aunque resuelve algunos de los problemas típicos de este tipo de programación, lo que verdaderamente es importante es que también resuelve los problemas que se generan en
Internet, en la Telaraña Mundial, en el World-Wide-Web, en la Web. Internet es un sistema
Cliente-Servidor gigante. La idea primaria de un sistema cliente-servidor es que debe haber un sitio donde se centraliza la información, que se desea distribuir bajo demanda a un conjunto de personas o máquinas.
La clave de este concepto radica en que si se produce un cambio en la información del sistema central, inmediatamente es propagada a los receptores de la información, a la parte cliente. Luego, el concepto básico es muy simple; el problema se presenta cuando hay solamente un servidor que tiene colgados a muchos clientes, en que el rendimiento general del sistema decrece de forma exponencial al aumento del número de clientes. El funcionamiento de la Web sigue este mismo principio. Inicialmente, se solicita una información a un servidor y éste envía de vuelta un fichero que será interpretado por el navegador (el cliente) que lo formateará para visualizarlo en la máquina cliente. El
navegador fue el primer paso adelante en la expansión de Internet, ya que permitía
visualizar un mismo fichero en plataformas diferentes sin hacerle cambio alguno; pero su finalidad principal es la visualización de ficheros, no la interactividad con el usuario, ni la posibilidad de ejecutar programas en la parte del usuario, en la parte cliente del sistema. Java está siendo continuamente extendido para proporcionarle nuevas características y librerías que resuelven elegantemente problemas que son muy difíciles en la programación tradicional como el acceso a bases de datos, el uso de multihilo, la programación de redes y la programación distribuida, y además porque Java, a través de los applets, permite la programación de la parte cliente. Un applet es un miniprograma que corre solamente bajo un navegador y es descargado automáticamente como parte de una página Web, al igual que cualquier gráfico, y cuando se activa, ejecuta un programa. Este es el interés, proporciona una forma a través de la cual se puede distribuir software al cliente desde el servidor, en el momento en que el cliente necesite ese software, y no antes, con lo cual siempre tendrá el cliente la última versión de ese software, se actualice cuando se actualice. Además, tal como está diseñado Java, el programador necesita crear su programa una sola vez, y ya estará listo para ser ejecutado en todas las plataformas que dispongan de un navegador con soporte Java.
H
e
rramientas
p
a
ra
la
Progra
m
aci
ó
n
Cliente
- S
e
r
v
i d
or
:
Tenemos:
Sockets
– Implementados en todos los sistemas operativos modernos.
– Comunican dos procesos que pueden estar alojados en dos máquinas diferentes. – El cliente debe conocer la máquina y el puerto donde se ubica el servidor.
– Se debe establecer un protocolo cliente/servidor para el correcto funcionamiento de la aplicación.
RPCs
– Basado en Sockets. Abstrae al programador del uso de Sockets.
– Sigue siendo necesaria la distinción del código cliente y del código servidor.
Alternativas para desarrollo de aplicaciones:
1.
C O RB A :Es necesario que exista una versión de CORBA para la plataforma donde se quiere implementar.
V
entajas :
● Soporta múltiples plataformas y lenguajes de programación. ● Dispone de una gran cantidad de servicios
● Definida por un organismo serio e independiente
Inc
o ve n ientes :
● Complejidad en el desarrollo ● Lentitud para adaptarse
● Pocas implementaciones libres.
2.
NETV
entajas :
● Soporta múltiples plataformas
● Fácil proceso de desarrollo (Visual Studio .Net) ● Entorno Windows muy extendido.
3.
J A V A EEV
entajas :
● Soporta para múltiples plataformas y sistemas operativos ● Avalado por múltiples empresas (SUN, IBM, ORACLE, etc) ● Competitividad
● Soluciones Libres
Inconvenientes:
● Exclusivo para el lenguaje Java
● Complejidad relativa en el desarrollo de aplicaciones ● No existe un entorno de desarrollo fijo.
Arquitectura Cliente Servidor:
Modelo Lógico:● Gestor de presentación: Muestra la interface del usuario.
● Lógica de Presentación: Establece que se debe mostrar al usuario. ● Lógica de la Aplicación: Funcionalidad de la aplicación.
● Lógica de Negocio: Funcionalidad de la empresa, común para todas las aplicaciones.
● Lógica de los datos: Definición lógica de los datos (vistas, tablas, tipos de datos, claves, etc.)
● Gestor de Datos: Encargada de escribir y acceder a la base de datos.
Modelo Físico:
– 2 capas (Cliente Servidor tradicional)
– 3 capas (Cliente – Lógica Negocio – Datos)
El modelo de 3 capas esta basado en objetos: – Clientes: Que son aplicaciones propias
– Lógica de Negocio y de Datos: Objetos distribuidos También está basado en la WEB:
– Clientes: Navagadores
– Lógica de Negocio y de Datos: Generación dinámica de contenidos en lenguaje HTML, XML, xHTML.
CONECTIVIDAD DE LA BASE DE DATOS CON JDBC
¿Qué es un JDBC?
La conectividad de la base de datos de Java (JDBC , Java Database Connectivity) es un marco de programación para los desarrolladores de Java que escriben los programas que tienen acceso a la información guardada en bases de datos, hojas de calculo, y archivos "planos". JDBC se utiliza comúnmente para conectar un programa del usuario con una base de datos por “detrás de la escena”, sin importar qué software de administración o manejo de base de datos se utilice para controlarlo.
Para la gente del mundo Windows, JDBC es para Java lo que ODBC es para Windows. Windows en general no sabe nada acerca de las bases de datos, pero define el estándar ODBC consistente en un conjunto de primitivas que cualquier driver o fuente ODBC debe ser capaz de entender y manipular. Los programadores que a su vez deseen escribir programas para manejar bases de datos genéricas en Windows utilizan las llamadas ODBC. Con JDBC ocurre exactamente lo mismo: JDBC es una especificación de un conjunto de clases y métodos de operación que permiten a cualquier programa Java acceder a sistemas de bases de datos de forma homogénea. Lógicamente, al igual que ODBC, la aplicación de Java debe tener acceso a un driver JDBC adecuado. Este driver es el que implementa la funcionalidad de todas las clases de acceso a datos y proporciona la comunicación entre el API JDBC y la base de datos real.
JDBC, que al estar escritos en Java son automáticamente instalables, portables y seguros. La conectividad de bases de datos de Java se basa en sentencias SQL, por lo que se hace imprescindible un conocimiento adecuado de SQL para realizar cualquier clase de operación de bases de datos. Aunque, afortunadamente, casi todos los entornos de desarrollo Java ofrecen componentes visuales que proporcionan una funcionalidad suficientemente potente sin necesidad de que sea necesario utilizar SQL, aunque para usar directamente el JDK se haga imprescindible
Acceso a base de datos con JDBC
A continuación vemos los modelos diferentes de acceso a base de datos:
Modelo de 2 capas
El presente modelo se basa en que la conexión se presenta entre la aplicación Java o el applet (que se ejecuta en el navegador), se conectan directamente a la base de datos.
Como sabemos en Java se puede tener dos tipos de aplicaciones: la aplicación Java propiamente dico y una aplicación applet, esta última que se ejecuta en un navegador. Observamos en la figura que el driver o controlador JDBC debe residir en la computadora local. La base de datos puede estar en cualquier otra máquina y se accede a ella mediante la red. Esta es la configuración de típica Cliente/Servidor: el programa cliente envía instrucciones SQL a la base de datos, ésta las procesa y envía los resultados de vuelta a la aplicación
Modelo de 3 capas
El presente modelo, las instrucciones son enviadas a una capa intermedia entre Cliente y Servidor, que es la que se encarga de enviar las sentencias SQL a la base de datos y
Comparando con el modelo anterior, se observa que el driver o controlador JDBC se encuentra junto al servidor de aplicaciones, esto hace que la máquina del cliente no se preocupe por instalar el controlador. El nivel intermedio mantiene en todo momento el control del tipo de operaciones que se realizan contra la base de datos.
Clasificación de los Drivers
El driver JDBC puede pertenecer a una de las siguientes categorías:
Puente JDBC-ODBC
Utilizada por Sun inicialmente para popularizar JDBC y consiste en aprovechar todo lo existente, estableciendo un puente entre JDBC y ODBC. Este driver convierte todas las llamadas JDBC a llamadas ODBC y realiza la conversión correspondiente de los resultados.
La ventaja de este driver, que se proporciona con el JDK, es que Java dispone de acceso inmediato a todas las fuentes posibles de bases de datos y no hay que hacer ninguna configuración adicional aparte de la ya existente. La desventaja está en que es lenta y no será posible ser usada en el sistema operativo Linux.
Java Binario
Este driver se salta la capa ODBC y habla directamente con la librería nativa del fabricante del sistema DBMS (como pudiera ser DB-Library para Microsoft SQL Server o
CT-Lib para Sybase SQL Server). Este driver es un driver 100% Java pero aún así
necesita la existencia de un código binario (la librería DBMS) en la máquina del cliente, con las limitaciones y problemas que esto implica.
100% Java/Protocolo Nativo
Este driver es realizado completamente en Java que se comunica con el servidor DBMS utilizando el protocolo de red nativo del servidor. De esta forma, el driver no necesita intermediarios para hablar con el servidor y convierte todas las peticiones JDBC en peticiones de red contra el servidor. La ventaja de este tipo de driver es que es una solución
100% Java y, por lo tanto, independiente de la máquina en la que se va a ejecutar
La única desventaja de este tipo de drivers es que el cliente está ligado a un servidor DBMS concreto.
100% Java/Protocolo Independiente
Requiere la presencia de un intermediario en el servidor. En este caso, el driver JDBC hace las peticiones de datos al intermediario en un protocolo de red independiente del servidor DBMS. El intermediario a su vez, que está ubicado en el lado del servidor, convierte las peticiones JDBC en peticiones nativas del sistema DBMS. La ventaja de este método es inmediata: el programa que se ejecuta en el cliente, y aparte de las ventajas de los drivers
100% Java, también presenta la independencia respecto al sistema de bases de datos que
se encuentra en el servidor.
Cargar el controlador JDBC
Para trabajar con el API JDBC se tiene que importar el paquete java.sql, tal y como se indica a continuación:
import java.sql.*;
En este paquete se definen los objetos que proporcionan toda la funcionalidad que se requiere para el acceso a bases de datos. El siguiente paso después de importar el paquete java.sql consiste en cargar el controlador JDBC, es decir un objeto Driver específico para una base de datos que define cómo se ejecutan las instrucciones para esa base de datos en particular.
Hay varias formas de hacerlo, pero la más sencilla es utilizar el método forName() de la clase Class:
Debe tenerse en cuenta que el método estático forName() definido por la clase Class genera un objeto de la clase especificada. Cualquier controlador JDBC tiene que incluir una parte de iniciación estática que se ejecuta cuando se carga la clase. En cuanto el cargador de clases carga dicha clase, se ejecuta la iniciación estática, que pasa a registrarse como un controlador JDBC en el DriverManager.
Es decir, el siguiente código:
Class.forName("Controlador JDBC");
es equivalente a:
Class c = Class.forName("Controlador JDBC"); Driver driver = (Driver)c.newInstance(); DriverManager.registerDriver(driver);
Algunos controladores no crean automáticamente una instancia cuando se carga la clase. Si forName() no crea por sí solo una instancia del controlador, se tiene que hacer esto de manera explícita:
Class.forName("Controlador JDBC").newInstance();
De nuevo, para el Connector/J:
Class.forName("com.mysql.jdbc.Driver").newInstance();
En toda aplicación de bases de datos con MySQL es indispensable poder establecer la conexión al servidor para posteriormente enviarle las consultas. Los programas en Java no son la excepción. El siguiente código nos servirá para verificar que podemos establecer una conexión a nuestra base de datos transportes
import java.sql.*;
public class
TestConnection {
Static String bd=”transportes”; static String login=”bingo”; static String password=”hola”;
static String url=”jdbc:mysql://localhost/”+bd;
public static void mian(String[ ] args)throws IOException {
Connection conn = null; try
{ System.out.println(ex); } catch(ClassNotFoundException ex) { System.out.println(ex); } } }
En esta programación se inicia importanto el paquete sql perteneciente a java. El signo del asterisco significa que el programa puede hacer uso de culaquier clase contenida en el paquete sql. Se construye la clase TextConnection, estableciendo 4 variables o atributos de tipo String donde se almacena el nombre de la base de datos, el login, la contraseña o password y el url.
Una vez en el método principal llamado main se declara la variable objeto conn y a través de la instrucción try se busca proteger la ejecución ante posibles errores (lo que se denomina manejo de excepciones).
Con la instrucción: Class.forName(“com.mysql.jdbc.Driver).newInstance();, se establece el driver para el gestor de base de datos MySql. Luego en la siguiente línea de programación se establece la conexión con la base de datos a través del método
getConnection perteneciente a la clase DriverManager. A través de la sentencia selectiva if se evalúa el éxito de la conexión, por lo tanto, si la variable conn es diferente de null
significa que se logró la conexión, caso contrario se mostrará mensajes de error, gracias a la instrucción catch.
A continuación se listan algunas de las salidas que se pueden obtener al ejecutar el programa anterior:
[blueman@casita]$ java TestConnection
Conexión a base de datos jdbc:mysql://localhost/agendita ... Ok
(significa: Todo funciona bien)
[blueman@casita]$ java TestConnection java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
(Seguramente no se ha puesto la ruta al archivo connector.jar en la variable de ambiente CLASSPATH)
(El login o el password proporcionados no nos permiten el acceso al servidor)
[blueman@casita]$ java TestConnection java.sql.SQLException: No suitable driver
(Probablemente se ha escrito de forma incorrecta el URL para la base de datos)
[blueman@casita]$ java TestConnection
java.sql.SQLException: General error: Access denied for user: 'bingo@localhost' to database 'transportes'
USO DEL ENTORNO DE NETBEANS PARA LA
CONEXIÓN DE BASE DE DATOS
Conector a la base de datos
Una aplicación en Java para que logre comunicarse con una base de datos usando la API JDBC, se requiere de un conector. Ese conector es específico para el manejador de base de datos y viene en la forma de un archivo “.jar” o “.zip”. El conector para la base de datos MySQL, está en el archivo:
mysql-connector-java-3.1.XX.jar
Existe versiones superiores como la versión 5.0 para dicho conector. NetBeans nos permite la tarea de conectar una aplicación a una base de datos
Conexión de una Aplicación a una base de datos creada en MySql
Para conectar a una aplicación a una base de datos, se requiere:
1.
Agregarle a NetBeans el conector como una biblioteca o librería. Esto permite que el conector este disponible para los proyectos.2.
Agregarle a un proyecto el conector. Esto permite que la aplicación se pueda conectar a la base de datos.A continuación procedemos agregarle a NetBeans un conector a una base de datos MySql: a. Seleccione la opción Tools/Libraries de la barra de menú del entorno de NetBeans.
b.
Se visualiza un cuadro de diálogo que permite administrar las librerías o bibliotecas de NetBeans. En la ventana, al lado izquierdo se observa las librerías agregadas a NetBeans. Del lado derechoaparece el nombre de la biblioteca y la trayectoria del archivo con la biblioteca. Para agregar el conector a MySQL a NetBeans presione el botón de comando New Library ...
a.
Se mostrará un cuadro de diálogo donde se establecerá el nombre que daremos al conector, como por ejemplo MySQL y luego damos click en el botón de comando OK.b.
Se cierra el cuadro de diálogo y volvemos a la ventana anterior donde se observará la nueva libreríaMySQL. Posteriormente
procedemos a dar clic en el botón de comando Add
d.
Al dar clic en Add JAR/Folder volvemos a la ventana anterior. Cabe señalar que en las últimas versiones de NetBeans ya existe una librería o biblioteca para la conexión a una base de datos de MySql, denominada MYSQL JDBC Driver.Damos click en el botón de comando Ok y vamos a crear un proyecto:
1)
Seleccionamos la opción File/New Proyect de la barra de menú del entorno de NetBeans.2)
Seleccionamos en Categories: Java y como proyecto: Java Application. Luego damos click en el botón de comando Next.3)
Luego indicamos como nombre del proyecto campeonatoUefa y posteriormente damos clic en el botón de comando Finish, quedando el entorno de NetBeans de la siguiente manera:4)
En Libraries lo seleccionamos y damos clic con el botón de derecho y eligimos la opción Add Library.5)
Aparece un cuadro de diálogo para seleccionar la librería a agregar, en este casoMySQL (en las últimas versiones de NetBeans tenemos el conector MySQL JDBC Driver) y damos clic en Add Library.
base de datos transportes, la misma que ya se encuentra creada conjuntamente con las tablas de Ciudad y
Ruta. Seleccionamos la pestaña Services y en Databases seleccionamos la carpeta Drivers.
8)
Para agregar el concetor MySQL, haga clic en el botón derecho del mouse en el nodo o carpeta Drivers y seleccione la opción New Driver.9)
Aparecerá el cuadro de diálogo para agregar un conector. Dar clic en el botón de comando Add.11)
En el cuadro de diálogo para agregar el conector se mostrará la información del conector seleccionado. Luego dar clic en el botón de comado OK.13)
Ahora procederemos a conectarnos con la base de datos de campeonatouefa. Seleccionamos el driver MySQL y damos clic botón derecho y elegimos la opciónConecting using.
14)
Se muestra un cuadro de diálogo para establecer el URL de la base de datos usando el siguiente formato:jdbc:mysql://servidor:puerto/baseDatos
donde servidor es la dirección IP (o nombre de dominio del servidor), en caso que el servidor esté en la misma computadora que NetBeans utiliza el nombre: localhost;
puerto es el puerto empleado por el servidor. Si el servidor utiliza el puerto
predefinido, se puede omitir; baseDatos es la base de datos a la que se desea conectar.
16)
En el entorno de NetBeans se mostrará un nuevo nodo de conexión a la base de datos.17)
Si damos click en + respecto al nodo creado se visualizará la tabla existente en la base de datos de campeonatouefa.USO DEL ENTORNO DE NETBEANS PARA EL ACCESO DE
LA BASE DE DATOS Y EL PAQUETE JAVA.SQL
Acceso a la base de datos desde NetBeans
NetBeans nos permite hacer operaciones sobre la base de datos como crear y borrar tablas, agregar y eliminar columnas, agregar, modificar y eliminar registros de datos como realizar consultas.
Vamos a proceder hacer algunas operaciones: 1. Expanda el nodo con la conexión a la base de datos.
2. Observamos en la figura anterior las carpetas referidas a Tables (tablas), Views (vistas) y Procedures (procedimeintos). Si expandimos el nodo referido a Tables veremos la tabla estadio.
3. Si seleccionamos el nodo referido a Tables y damos clic botón derecho, se muestra un menú flotante y luego elegimos la opción Create Table.
4. Vamos a proceder a crear la tabla de Equipo con los campos codequipo int, nombre varchar(40), representante varchar(32), entrenador varchar(40), grupo char(1) y estado bit. Una vez indicado los campos damos clic en el botón de comando
OK.
5. Volvemos al entorno de NetBeans y observamos en la pestaña de Services la nueva tabla de Equipo.
6. Si deseamos insertar un registro a una de las tablas a través del comando insert, seleccionamos el nodo referido a Tables. Dando clic botón derecho se muestra un menú flotante y luego seleccionamos la opción Execute Command...
7. Escribimos el comando para insertar un nuevo registro en la tabla de Equipo, luego procedemos a ejecutarlo.
8. Luego si escribimos el comando select para consultar los datos de la tabla Ciudad, observaremos el contenido de dicha tabla.
Como verán el entorno de NetBeans nos ofrece la oportunidad de acceder y manipular los datos y las estructuras de los elementos que conforman una base de datos. Ahora ustedes mismos, en base a la experiencia de los conocimeintos adquiridos en los cursos referentes a base de datos, procedan a experimientar el entorno gráfico que nos ofrece NetBeans.
Paquete Java.SQL para trabajar con base de datos
Para realizar una aplicación para que realice cualquier operación de lo más sencilla posible se necesita de la utilización de varias clases e interfases. JDBC ofrece el paquete java.sql en la que existen clases e interfaces muy útiles para trabajar con base de datos. Veamos las más importantes clases o interfases y en la medida en que se desarrolle las sesiones se detallarán más mencionando los métodos que tienen para hacer fácil el acceso a la base de datos.
● La clase DriverManager , permite llevar a cabo una conexión con la base de datos logrando cargar un driver. Existen varios métodos para ello, entre las cuales se destacan:
public static synchronized Connection getConnection(String url) throws SQLException
public static synchronized Connection getConnection(Strin url,String user, String password) throws
El primero de los métodos recibe como parámetro la dirección URL que identifica la base de datos. En el caso en que sea necesario proporcionar un usuario y una contraseña para acceder a la base de datos (como sucede en MySql) se utiliza el segundo de los métodos. Una dirección URL JDBC proporciona un método de localización de bases muy parecido al que representan las direcciones URL que identifican sitios Web de Internet. Los controladores JDBC tienen que ser capaces de conectar con la base de datos a partir de la información contenida en la dirección URL JDBC de la misma, por lo que son los desarrolladores los que fijan en la mayoría de los casos la sintaxis.
● La interfaz Connection, cuando se utiliza uno de los métodos anteriormente mencionados se obtiene un objeto de tipo Connection que representa como es de esperar la conexión con la base de datos. El objeto obtenido cuenta con varios métodos. Dos de los más importantes son:
public abstract Statement createStatement() throws SQLException public abstract void close() throws SQLException
El primero de los métodos sirve para crear un objeto del tipo Statement. Las frases SQL se ejecutan normalmente mediante la utilización de objetos del tipo Statement. Finalmente, es conveniente cerrar las conexiones tan pronto como dejen de utilizarse para liberar recursos. No obstante, ha de tenerse en cuenta que establecer
● La interfaz Statement, los objetos de tipo Statement permiten realizar consultas y efectuar operaciones de actualización, borrado o inserción de datos. En algunos casos es interesante también fijar ciertos parámetros vinculados con la consulta que se desea realizar, como por ejemplo el tiempo que estamos dispuestos a esperar a que el gestor de la base de datos devuelva el resultado de la consulta. Los métodos que se citan a continuación son algunos de los más importantes para llevar a cabo todas estas acciones.
public abstract ResultSet executeQuery(String sql) throws SQLException
Ejecuta una sentencia SELECT y devuelve el resultado mediante la interfaz ResultSet
public abstract int executeUpdate(String sql) throws SQLException
Ejecuta una sentencia UPDATE, DELETE, INSERT o cualquier otra sentencia SQL que no devuelva un conjunto de registros, y devuelve el número de registros afectados por la sentencia.
public abstract void setMaxRows(int max) throws SQLException
Establece el número máximo de registros que puede devolver executeQuery()
public abstract int getMaxRows() throws SQLException
Devuelve el número máximo de registros que puede devolver executeQuery()
public abstract void setQueryTimeout(int seconds) throws SQLException
Establece el tiempo en segundos que el controlador esperará hasta que el sistema gestor de bases de datos devuelva un resultado
public abstract int getQueryTimeout() throws SQLException
Devuelve el tiempo en segundos que el controlador esperará hasta que el sistema gestor de bases de Datos devuelva un resultado
parámetro el índice o el nombre del campo que se desea obtener y devuelven el dato en cuestión.
public abstract String getString(int columnIndex) throws SQLException public abstract String getString(String columnName) throws SQLException public abstract int getInt(int columnIndex) throws SQLException
public abstract int getInt(String columnName) throws SQLException
Además, existen otros métodos gracias a los cuales es posible recorrer los resultados guardados en el objeto de tipo ResultSet.
public abstract int findColumn(String columnName) throws SQLException
Devuelve el número de columna cuyo nombre se pasa como parámetro public abstract boolean next() throws SQLException
Un objeto de tipo ResultSet puede contener más de un resultado. Para ir avanzando por la lista de resultados utilizamos este método, que devuelve un valor indicando si existe otro resultado o no.
public abstract boolean wasNull() throws SQLException
Indica si el contenido de la última columna accedida es NULL SQL
public abstract void close() throws SQLException
Libera los recursos asociados al ResultSet
Vamos a proceder a visualizar en objetos Jlist, los datos contenidos de la tabla de Equipo. 1) Creamos un
objeto Jframe para abrir un nuevo formulario.
2) Indicamos como nombre de clase formulario: frmverEquipos. Luegos damos click en el botón de comando Finish.
Quedando el entorno de NetBeans de la siguiente manera:
3) Damos clic botón derecho sobre el diseño del formulario para cambiar el Set
Layout a AbsoluteLayout, lo cual nos permitirá usar los objetos de control más
4) Colocamos los objetos de control quedando el diseño del formulario de la siguiente manera:
5) Borramos los Items de cada objeto Jlist y colocamos los nombres a cada objeto de control. Recuerden que para eliminar los items de cada Jlist hay que hacer uso de model que se encuentra en la ventana de propiedades.
6) A continuación procedemos a colocar la programación.
En la primera llave (color rojo) observamos que importamos los paquetes java.sql (todo lo que acabamos de ver) y el paquete javax.swing para poder utilizar la clase JoptionPane para la visualización de un mensaje a través de su método ShowMessageDialog. En la segunda llave se define las variables que se van a usar. Vendría hacer los atributos de la clase frmVerEquipo. Como tenemos establecer conexión usaremos un objeto Connection (conn), para hacer una operación de consulta usaremos un objeto Statement (st) y para almacenar los resultados de la consulta usaremos un objeto ResultSet (rs). Como la aplicación hace uso de los Jlist se tiene
7) La clase frmVerEquipo tienen un método del mismo nombre frmVerEquipo(), esto es lo que se denomina método constructor. Deseamos que los datos se muestren en los objetos Jlist al momento de la ejecución del formulario debemos programar en el método antes mencionado.
Los objetos instanciados de la clase DefaultListModel deben ser vinculados a cada uno de las cajas de listas. Luego usando el bloque try{ } que por cierto sirve para interceptar errores y si lo hubiera ejecutaría lo programado en el bloque catch{ }, establecemos laconexión usando el método Enlace, creamos el objeto st de tipo Statement (se encuentra listo para relizar una operación) y luego ejecutamos una sentencia de consulta con select cuyo resultado va ocasionar que los datos se almacenen en el objeto rs del tipo ResultSet. Finalmente con el método next se logra desplazar a través de los registros de datos para ir llenado los objetos modelo1, modelo2, modelo3 y modelo4 y de esta forma llenamos los objetos Jlist lo que nos permitirá ver en el formulario los datos de la tabla de Equipo.
8) Recuerda que en la sesión anterior sólo se agregó un registro a la tabla de Equipo. Si gustan ingresen más registros a la tabla de Equipo y observarán los resultados. Si ejecutamos la aplicación observamos lo siguiente:
OBJETO DE CONTROL JTABLE EN
MANTENIMIENTO DE DATOS
Objeto de control JTable
La presentación de datos tabulados es una de las tareas más comunes que se presentan al momento de crear interfaces gráficas; desde la simple tabla que permite únicamente mostrar el resultado de una consulta, hasta las que permiten editar directamente el contenido de cada celda, ordenar las columnas, personalizar su apariencia, etc. Todas las tareas antes descritas, y muchas otras, son posibles de realizar utilizando la clase JTable; por supuesto, mientras más complejo sea el requerimiento a cubrir, se requerirá en igual medida utilizar más métodos o recursos de la clase.
El objeto Jtable como los modelos de la tabla representados a través de la interfaz
TableModel, pertenecen al paquete javax.swing.
El siguiente gráfico intenta mostrar como cada componente JTable obtiene siempre sus datos desde un modelo de tabla.
El TableModel se implementa a partir de la clase AbstractTableModel, aunque existe un modelo de tabla predeterminado denominado la clase DefaiultTableModel. Las propiedad más usada es model que permite definir el numero de filas y columnas, siendo los métodos más usados: setModel(), que permite vincular un modelo al obejto Jtable y
getRowCount(), devuelve el número de filas en la tabla. Para la clase DefaultTableModel
los métodos más utilizados son: AddRow(), añade una fila al final del modelo,
getRowCount() devuelve el número de filas de la tabla de datos, getValueAt()
devuelve el dato ubicado en la posición fila y columna y removeRow() elimina una fila del modelo según posición indicada.
Mantenimiento de Datos usando JTable como vista de datos
Un mantenimiento de datos consiste en grabar datos en una tabla, eliminar datos correspondiente a un registro de datos como también modificar datos ya almacenados. Pero para eliminar datos o modificar datos se supone que los datos ya existen en la tabla de datos entonces se procedera hacer búsquedas sencillas para lograr su ubicación y proceder a su eliminación o modificación de datos. En esta sesión haremos uso del reciente explicado objeto JTable para visualizar los datos contenidos en una tabla. A continuación vamos a seguir usando la base de datos de campeonatouefa ya utilizada desde la tercera sesión de aprendizaje:
1. Vamos a crear la tabla de estadio en la base de datos campeonatouefa. La instrucción para la creación de dicha tabla es:
create table estadio(codestadio int not null primary key auto_increment, nombre varchar(40) not null,
sede varchar(32) not null, pais varchar(20) not null, estado bit);
Cabe señalar que los campos referidos a la sede y al pais pudieron haber sidos tablas que se relacionen con la tabla de estadio. Lo importante es como hacer mantenimiento de datos a una tabla, la normalización que se pueda hacer a las tablas que irán creando en la base de datos campeonatouefa queda para las modificaciones que crean convenientes.
2. Logremos establecer la conexión con la base de datos de campeonatouefa en el entorno de NetBeans.
3. Volvamos a la pestaña Proyects donde vamos a crear métodos en la clase Main, necesarios para la conexión con la base de datos y el enlace con la tabla de estadio.
Agregamos los paquetes: java.io, java.sql y javax.swing. Este último paquete es necesario para el uso de los objetos del paquete swing principalmente el JOptionPane para la visualización de posibles mensajes de error. Estando dentro de la clase Main establecemos las variables conn del tipo Connection, st del tipo Statement y rs del tipo ResultSet ya descritos y esplicados en las sesiones anteriores. También definimos las varibales bd, login, password y url.
A continuación creamos el primer método estático denominado Enlace que devolverá un objeto del tipo Connection. Este método nos ayudará establecer la conexión con la base de datos campeonatouefa. Seguimos a continuación agregando más métodos a la clase Main.
Se crea el método sta que devolverá un objeto del tipo Statement. Básicamente permite crear el objeto del tipo Statement a partir del objeto connection a través del método createStatement(). Finalmente se necesita tener un método denominado EnlEst que permitirá enlazarnos con la tabla de Estadio aplicando el método executeQuery() estableciendo a través del comando select a todos los campos de la tabla de Estadio solo aquellos cuyo estado es igual a 1, es decir, los estadios que están habilitados para su uso.
Si observamos en cada uno de los métodos se esta usando throws SQLException, esto quiere decir que los métodos usan excepciones (intercepcion de errores) para los erroes que se pueden presentar durante la conexión y acceso de datos.
4. La tabla de Estadio posee realmente cinco campos, pero el último es para indicar si el estadio esta habilitado para su uso o no lo está, estom quiere decir si hacemos una elimnación se procederá a cambiar el estado a 0 (elimación lógica) y cada vez que grabemos los datos de un nuevo estadio se habilitará.
Vamos a diseñar el siguiente formulario al cual lo llamaremos frmMantEstadio dando los nombres correspondientes a cada uno de los objetos de control dibujados.
5. Vamos a proceder a programar, colocando las siguientes líneas de código.
Importamos los paquetes java.sql (para acceder a base de datos), javax.swing (para el uso de los controles visuales), javax.swing.table para el manejo de las clases del paquete table y el paquete campeonato_uefa que contiene a la clase Main con lo cual podremos hacer uso de todos los métodos que tenga.
Iniciamos la construcción de la clase frmMantEstadio, estableciendo como variables o atribnbutos conn, st y rs. Como se está utilizando un objeto JTable se define la variable
dtm del tipo DefaulTableModel. En el método constructor hacemos uso del método activabotones (programación que veremos luego), se establece un vector o arreglo del
tipo String donde se coloca los títulos que serán de cada una de las columnas del objeto
JTable. A partir del método setColumnIdentifiers indicamos los datos del vector titulos
al objeto dtm y con el método setModel vinculamos el objeto dtm al objeto JTable denominado tablaEstadio. Los métodos setSize y setLocation es para establecer el tamaño y la localización del formulario en la pantalla del computador.
El método activaBotones es para habilitar o inhabilitar el uso de los botones de comando, esto dependerá en que circunstancias nos encontremos en la ejecución de la aplicación de mantenimiento de datos de Estadios. Con el método limpiarDatos se limpia los cuadros de textos.
En el botón de comando btnBuscar si está habilitado después de dar clic en dicho botón, se procederá a la conexión con la base de datos, luego en la variable rs se almacenará los datos provenientes de la tabla de Estadio. En la variable b se coloca el valor ingresado en el cuadro de texto txtCodEst. Se define una variable boleana encuentra para manejar la situación de éxito o fracaso de la búsqueda. En la sentencia while utilizamos el método next que pertenece al objeto rs, es decir, es un método de la interfaz ResulSet. El método next devuelve verdadero si encuentra la primera fila de información, las siguientes veces se desplaza en cada registro almacenado en el rs. La sentencia if que se
El botón de comando btnVer (Ver Lista de Estadios), consiste en aumentar el tamaño del formulario para visualizar el objeto JTable. Posteriormente se establece la conexión con la base de datos y en la variable rs se almacena los datos provenientes de la tabla de Estadio. Se define un vector denominado datos de tamaño 5 elementos del tipo String que servirá colocar los datos de una fila para luego agregarlo al objeto dtm que está vinculado al objeto JTable llamado tablaEstadio. Pero antes de agregarlo debemos asegurarnos que no exista fila alguna de datos en el modelo dtm y por ende en la
tablaEstadio. El bucle de la sentencia while permite colocar en cada elemento del
arreglo los datos extraidos de una fila que almacena el objeto rs, esto es posible ya que el método getString, indicando la posición de la columna, podemos obtener el dato de la fila actual.
Con el método addRow logramos crear una fila con los datos del vector datos en el objeto dtm y como está vinculado a la tablaEstadio entonces se podrá ver los registros agregados.
Para el botón de comando btnNuevo, limpiamos los cuadros de textos con el método limpiarObjetos. Se inhabilita el cuadro de texto txtCodEst y se envía el cursor al cuadro de texto txtNom. Se inhabilta los botones de comando a excepción de grabar ya que estamos en el momento de ingresar nuevos datos y proceder a almacenar.
En el botón de comando btnGrabar se inicia visualizando un mensaje de confirmación para proceder a grabar, esto se logra usando el método showConfirmDialog de la clase JoptionPane. Si la respuesta es Sí entonces la sentencia if su condición lógica se hará verdadera y por lo tanto establecemos conexión con la base de datos campeonatouefa, pasamos los datos ingresados a variables como nom, sede y pais. En la variable comando establecemos la instrucción con el comando INSERT para luego usar el método executeUpdate quien procederá a grabar los datos. Posteriormente se procede a cerrar la conexión con el método close del objeto connection conn.
En el botón de comando btnEliminar, también se procede a través de un mensaje confirmar si procede la eliminación de los datos del Estadio. Si la respuesta es afirmativa se procede a conextarse a la base de datos y en la variable de memoria cod se almacenada el código del estadio ingresado a travñes del cuadro de texto txtCodEst. Se construye la instrucción usando el comando UPDATE, luego ejecutamos la eliminación lógica haciendo que el campo estado sea igual a cero y se cierra la conexión con la base de datos.
En el botón de comando btnModificar, al igual que de grabar o eliminar se procede a confirmar a través de un mensaje si se procede a la modificación de datos. Una vez salvados los datos ingresados en los cuadros de textos en variables de memoria se prepara la instrucción en la variable de memoria comando. Usamos el comando UPDATE para actualizar los datos. Se procede a ejecutar el comando con el método
En el botón de comando Cancelar, luego de dar respuesta afirmativa se procede a limpiar los cuadros de textos, habilta el cuadro de texto txtCodEst para su uso y se vuelve a su estado inicial la hablitación de los botones de comando.
El botón de comando btnCerrar, con el método dispose se cierra la ventana o formulario.
6. Procedemos a ejecutar el formulario, seleccionado Run File.
7. Observamos el formulario ejecutado.
8. Al dar clic en el botón de comando Nuevo podemos proceder a ingresar datos. Una vez ingresado damos clic en el botón de comando Grabar.
9. Luego de grabar, al dar clic en el botón de comando Ver Lista de Estadios, el formulario se mostrará de la siguiente forma.
SWING MENUS Y MANTENIMIENTO DE DATOS
USANDO VARIAS TABLAS
Los objetos Swing Menus
En todo desarrollo de un proyecto de un sistema informático se debe construir menús que permita al usuario interaccionar con las opciones del sistema.
Aquí podemos ver el árbol de herencias de las clases relacionadas con los menús:
Tenemos el JmenuBar que permite iniciar el diseño del menú, Se crea por defecto un objeto Jmenu que permitirá a partir de este crear las opciones, las cuales se crearán con los objetos JmenuItem.
Mantenimiento de datos usando varias tablas
Esta sesión abarca el desarrollo de un mantenimiento de datos usando más de una tabla Siguiendo la sesión anterior haremos uso de la base de datos campeonatouefa de MySql, Usar varias tablas no implica que se deba hacer mantenimiento de datos a todas a la vez. La base de datos de campeonatouefa ya tiene la tabla de Estadio, agregaremos la tabla de Equipo. Con las tablas de Estadio y Equipos podremos hacer la programación de los encuentros, para ello crearemos la tabla de Programacion. Para hacer el mantenimiento de datos de la tabla de Programación necesitaremos saber qué estadios están disponibles y cuales son los equipos participantes para el encuentro. Sólo se tendrá en cuenta la etapa eliminatoria del campeonato.
Vamos a proceder a crear las tablas y luego a construir la aplicación: 1. Creamos las tablas de Equipo usando el entorno de NetBeans.
visualizar la nueva tabla.
Posteriormente vemos la nueva tabla en la pestaña Services
4. Nuevamente usando la opción Execute Command, escribimos:
6.
Vamos a crear un formulario denominado frmPrincipal, donde diseñaremos el siguiente menú:El cuadro de texto referido al numero de programación tiene como nombre txtNroPro, para la fecha de encuentro txtFecha, para el JComboBox de la etapa de campeonato tiene como nombre cboEtapa, para el JComboBox referido a grupo se denomina
cboGrupo, para el objeto JList referido al Equipo 1 se llama lstEquipo1, para el objeto
JList referido al Equipo2 se denomina lstEquipo2, para el cuadro de texto de la hora programada se llama txtHora, para el objeto JcomboBox referido a los estadios se llama cboEstadios, para el objeto JcheckBox referido a Suspendido se denomina
chkSuspendido y para el objeto JTable se denomina tablaProgramacion.
Finalmente para los botones de
comando que realizarán el mantenimiento de datos de Programación de Partidos se denominan: btnNuevo, btnBuscar, btnModificar, btnGrabar, btnCancelar y
btnCerrar.
8. Vamos a proceder a agregar los métodos en la clase Main que utilizaremos para el mantenimiento de datos de la Programación de Partidos.
Para obtener los registros de datos de aquellos encuentros que están programados
Para obtener los equipos que pertenecen a un grupo indicado. Cada grupo debe estar conformado por 4 equipos.
Para obtener el nombre del equipo dado el código del equipo
Verifica si el encuentro entre un equipo y otro ya fue programado. Esta consulta construida a partir del comando select utiliza el concepto de subconsultas. Cuando tratemos el tema de consulta de datos se explicará la construcción de sentencias que usan varias tablas.
Para obtener el código del equipo dado el nombre del equipo. Este método nos servirá al momento de grabar datos.
Para obtener el código del estadio dado el nombre del estadio. Este método nos servirá al momento de grabar o modificar datos.
9. Veamos a continuación el código de la programación que tendrá el formulario frmProgramacionPartidos.
b. Definir los atributos o variables a usar en los distintos métodos que forma la clase frmProgramacionPartidos
c. El método constructor frmProgramacionPartidos() debe quedar de la siguiente manera:
d. Construimos los métodos activaBotones y limpiarObjetos()
e. Diseñamos el método llenarListas() para mostrar los posibles encuentros dado los 4 equipos que conforman un grupo.
f. También se tienen el método llenarTabla() para llenar de datos en la filas del objeto JTable denominado tablaProgramacion.
g. Cuando se seleccione una etapa del campeonato, como por ejemplo eliminatoria se habilitará el uso del objeto jComboBox llamado cboGrupo.
h. Ahora vamos a proceder a programar en cuando se seleccione el grupo. No se indicará todo el código ya que codificar para cuando se seleccione el grupo A, lo mismo sucederá con los demás grupos que conforma la etapa eliminatoria del campeonato.
En este último if que observamos hacemos lo mismo para el grupo B y así sucesivamente hasta el grupo H.
i. El botón de comando Buscar es para la búsqueda de una Programación de un encuentro, cuya programación es la siguiente.
j. Cuando se seleccione un equipo en la caja de lista lstEquipo1 se procederá a buscar si el encuentro ya fue programado o no.
Se hace lo mismo si la selección se hace del equipo en la caja de lista lstEquipo2.
k.
l. Para el botón de comando Grabar procedmeos a codificar lo siguiente:
continuamos ...
n. Para el botón de comando Modificar escribimos el siguiente código:
MANTENIMIENTO DE DATOS USANDO
PROCEDIMIENTOS ALMACENADOS
Procedimientos almacenados
Poco a poco las empresas y muchas personas en general empiezan a mirar más hacia el Software Libre y se dan cuenta que existen excelentes alternativas a distintos programas que para ellos son de uso frecuente en otro Sistema Operativo, como pueden ser OpenOffice, Mozilla Firefox, Eclipse, NetBeans, PostgreSQL, PHP y MySQL por citar algunos, en esta nota hablaré un poco del Manejador de Bases de datos MySQL, que en los últimos años ha tenido grandes avances en su desarrollo y actualmente es uno de los DBMS más usados en sitios web y que en sus últimas versiones ha incorporado nuevas características como la implementación de las tablas, disparadores, funciones y procedimientos almacenados. Los procedimientos almacenados son de gran utilidad para realizar tareas frecuentes en una base de datos, es sorprendente la cantidad de tiempo que se puede llegar a ahorrar al hacer uso de este mecanismo.
Interface PreparedStatement
Este componente permitirá hacer uso de los procedimientos almacenados. Una vez instanciado el objeto usaremos el método preparedStatement para invocar el uso de un procedimiento almacenado. También se hará uso de los métodos setString(), setInt(), setDate(), etc para indicar la posición del parámetro y el valor de dicho parámetro. Finalmente usaremos el método executeUpdate() para ejecutar el procedimiento almacenado.
A continuación, procedemos a diseñar el mantenimiento de datos de la tabla de Arbitro usando procedimientos almacenados:
2. Procedemos a crear el procedimiento almacenado sp_grabaArbitro que permitirá la grabación de datos cuando se inserte un registro de datos en la tabla de Arbitro.
Una vez ejecutado la creación del procedimeinto almacenado se observará en la pestaña de Services que dicho procedmiento se ha creado.
3.
Luego, procedemos a crear el procedimeinto almacenado sp_modificaArbitro que permitirá modificar o actualizar los datos de la tabla de Arbitro.Una vez ejecutado la creación del procedimeinto almacenado se observará en la pestaña de Services que dicho procedmiento se ha creado.
4. Posteriormente, procedemos a crear el procedmiento almacenado sp_eliminaArbitro que permitirá hacer una eliminación lógica del registro de datos.
Una vez ejecutado la creación del procedimeinto almacenado se observará en la pestaña de Services que dicho procedmiento se ha creado.
5. En el formulario frmPrincipal que contiene el diseño del menú, ubicamos la opción Arbitro dentro de Mantenimientos.
6. Seleccionado Arbitro y dando clic botón derecho del mouse elegimos
Events/Action/ActionPerformed.
Luego, escribimos el siguiente código:
8. En la clase Main colocar el método EnlArb().
9. Vamos a proceder a programar en el formulario frmMantArbitro colocando las siguientes líneas de código:
Importamos los paquetes java.sql (para acceder a base de datos), javax.swing (para el uso de los controles visuales), javax.swing.table para el manejo de las clases del paquete table y el paquete campeonato_uefa que contiene a la clase Main con lo cual podremos hacer uso de todos los métodos que tenga.
Preparamos las variables para el acceso de datos: conn, st, rs. En el método constructor frmMantArbitro() preparamos las columnas del objeto JTable y damos al formulario su tamaño y ubicación dentro de la pantalla.
Los métodos activaBotones() permitirá gestionar el uso de los botones de comando y el método limpiarDatos() es para limpiar los cuadros de textos.
En el botón de comando btnBuscar si está habilitado después de dar clic en dicho botón, se procederá a la conexión con la base de datos, luego en la variable rs se almacenará los datos provenientes de la tabla de Arbitro. En la variable b se coloca el valor ingresado en el cuadro de texto txtCodArb. Se define una variable boleana encuentra para manejar la situaciçon de éxito o fracaso de la búsqueda. En la sentencia while utizamos el método next() que pertenece al obejto rs, es decir, es un método de la interfaz ResulSet.
El método next devuelve verdadero si encuentra la primera fila de información, las siguientes veces se desplaza en cada registro almacenado en el rs. La sentencia if que se encuentra dentro del while, su condición lógica se hará verdadero cuando encuentre el código del árbitro buscado, haciendo que los cuadros de textos se muestren los demás datos, es entonces que la variable encuentra recién se hace verdadero.
El botón de comando btnVer (Ver Lista de Arbitros), consiste en aumentar el tamaño del formulario para visualizar el objeto JTable. Posteriormente se establece la
objeto dtm que está vinculado al objeto JTable llamado tablaArbitro. Pero antes de agregarlo debemos asegurarnos que no exista fila alguna de datos en el modelo dtm y por ende en la tablaArbitro. El bucle de la sentencia while permite colocar en cada elemento del arreglo los datos extraidos de una fila que almacena el objeto rs, esto es posible ya que el método getString, indicando la posición de la columna, podemos obtener el dato de la fila actual.
Con el método addRow logramos crear una fila con los datos del vector datos en el objeto dtm y como está vinculado a la tablaArbitro entonces se podrá observar los registros agregados.
En el botón de comando btnGrabar se inicia visualizando un mensaje de confirmación para proceder a grabar, esto se logra usando el método showConfirmDialog de la clase JoptionPane. Si la respuesta es Sí entonces la sentencia if su condición lógica se hará verdadera y por lo tanto establecemos conexión con la base de datos campeonatouefa, pasamos los datos ingresados a variables como ape, nom, fecha y
nac. En la variable pstmt establecemos como procedimiento almacenado a sp_grabaArbitro, colocando 4 signos de interrogación que expresa el manejo de 4 parámetros que tiene dicho procedimiento. Con los métodos setString() del objeto instanciado pstmt indicamos la posición del parámetro y el valor del parámetro, así por ejemplo: 1 indica ser el primer parámetro de entrada del procedimeinto almacenado
sp_grabaArbitro y ape contiene el dato apellido que se asignará al primer parámetro. Una vez indicado los valores a cada uno de los parámetros se hace uso del método executeUpdate() que permitirá ejecutar el procedimiento almacenado. Posteriormente se procede a cerrar la conexión con el método close del objeto connection conn.
Para el botón de comando btnNuevo, limpiamos los cuadros de textos con el método limpiarObjetos. Se inhabilita el cuadro de texto txtCodArb y se envía el cursor al cuadro de texto txtNom. Se inhabilta los botones de comando a excepción de grabar.
En el botón de comando btnEliminar, también se procede a través de un mensaje confirmar si procede la eliminación de los datos del Estadio. Si la respuesta es afirmativa se procede a conectarse a la base de datos y en la variable de memoria cod se almacenada el código del árbitro ingresado a través del cuadro de texto txtCodArb. En la variable pstmt establecemos como procedimiento almacenado a sp_eliminaArbitro, colocando un signo de interrogación que expresa el manejo de un sólo parámetro, luego se usa el método setInt() para indicar el valor del parámetro y posteriormente se cierra la conexión.
En el botón de comando btnModificar, al igual que de grabar o eliminar se procede a confirmar a través de un mensaje si se procede a la modificación de datos. Una vez salvados los datos ingresados en los cuadros de textos en variables de memoria se procede a utilizar el procedimiento almacenado sp_modificaArbitro. Usamos el comando UPDATE para actualizar los datos. Se procede a ejecutar el comando con el método executeUpdate y se cierra la conexión con el método close.
En el botón de comando Cancelar, luego de dar respuesta afirmativa se procede a limpiar los cuadros de textos, habilta el cuadro de texto txtCodArb para su uso y se vuelve a su estado inicial la hablitación de los botones de comando.
El botón de comando btnCerrar, con el método dispose se cierra la ventana o formulario.
TRANSACCIONES Y BUSQUEDAS CON BASE DE
DATOS
Transacciones con Base de Datos
Uno concepto que causa problemas a los principiantes en el mundo del desarrollo de aplicaciones de base de datos es la idea de transacciones. Fundamentalmente, una transacción representa una unidad de trabajo lógica. Como la principal responsabilidad de una base de datos es preservar la información, necesita tener algo que le indique a un usuario que se debe salvar el estado actual del programa. De igual forma, cuando las cosas han ido mal, necesita una forma para indicar que una base de datos debería ignorar el estado actual y volver a atrás, al estado del programa salvado anteriormente.
En el idioma de las bases de datos, estas funciones se llaman entregar una transación y
deshacer una transación, respectivamente. Para realizar estas tareas, el API JDBC
incluye dos métodos como parte del interface Connection. Dando un objeto Connection llamado con, el estado del programa se graba llamando a con.commit(), para volver al estado salvado anteriormente, con.rollback(). Estos dos métodos pueden lanzar SQLExceptions si algo va mal cuando la base de datos realice realmente la operación, por eso necesitamos envolverlos en bloques try ... catch. Por defecto, una conexión funciona en modo autocommit, es decir, cada vez que se ejecuta una sentencia SQL se abre y se cierra automáticamente una transacción, que sólo afecta a dicha sentencia. Es posible modificar esta opción mediante setAutoCommit(), mientras que getAutoCommit() indica si se está en modo autocommit o no. Si no se está trabajando en modo autocommit será necesario que se cierren explícitamente las trasancciones mediante commit() si tienen éxito, o roolback(). En un entorno mono-usuario, las transaciones son bastantes sencillas de entender -- simplemente implican salvar o deshacer el estado de una aplicación. Sin embargo, en modo multi-usuario, las transaciones son más complejas. La demostración clásica de una transación multi-usuario es una cuenta bancaria donde una aplicación está intentando hacer un cargo mientras otra aplicación está intentando hacer un depósito en la misma cuenta. En el caso del campeonatouefa al momento de ingresar los datos de las incidencias de un encuentro o partido tendremos que grabar dos registros uno de cada equipo, esto quiere
Búsquedas de datos con procedimientos almacenados usando
CallableStatement
Para las búsquedas y/o obtenciones de datos vamos a usar procedimientos almacenados. La novedad con el uso de los procedimientos almacenados es hacer uso de parámetros de salida. En esta oportunidad usaremos el interface CallableStatement que permitirá trabajar con procedimeintos almacenados que hacen uso del comando select. Vamos a usar el procedimiento almacenado sp_obtenerCodEquipo:
A continuación, procedemos a diseñar el proceso de Incidencias de un Encuentro o Partido usando procedimientos almacenados con la interfaz
CallableStatement y transacciones:
Luego de ejecutar la sentencia, hacemos una actualización usando Refresh.
Observaremos la nueva tabla creada.
2. Procedemos a crear el procedimiento almacenado sp_actualizaIncidencias que permitirá la grabación de datos cuando se inserte un registro de datos en la tabla de Incidencias.
Observaremos el nuevo procedimiento creado
3. Posteriormente creamos el procedimiento alcenado sp_modificaIncidencias que permitirá modificar los datos de la tabla de Incidencias.
Luego de ejecutar la sentencia, hacemos una actualización usando Refresh quedando la pestaña Services:
4. No olvidar de agregar el procedimeinto almacenado sp_obtenerCodEstadio (ver la segunda pagina de ésta sesión).