Conceptos Esenciales

18
Instituto de Educación Superior Tecnológico Público “Víctor Álvarez Huapaya” C a r gar e l c o n t ro lad o r J DBC 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: Class.forName("Controlador JDBC"); Para el caso particular del controlador para MySQL, Connector/J, se tiene lo siguiente: Class.forName("com.mysql.jdbc.Driver"); 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(); Unidad Didáctica: Taller de Programación Concurrente

description

l

Transcript of Conceptos Esenciales

Page 1: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

C a r gar e l c o n t ro lad o r J DBC

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:

Class.forName("Controlador JDBC");

Para el caso particular del controlador para MySQL, Connector/J, se tiene lo siguiente:

Class.forName("com.mysql.jdbc.Driver");

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.*;

Unidad Didáctica: Taller de Programación Concurrente

Page 2: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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

{

Class.forName(“com.mysql.jdbc.Driver).newInstance(); conn = DriverManager.getConnection(url,login,password); if (conn != null)

{

System.out.println(“Conexión a la base de datos ”+bd+”... OK”);

conn.close();

}

}

catch(SQLException ex)

{

System.out.println(ex);

}

catch(ClassNotFoundException ex)

{

System.out.println(ex);

}

}

}

Unidad Didáctica: Taller de Programación Concurrente

Page 3: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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:

[blu e m a n @ c as i t a ] $ java TestConnection

Conexión a base de datos jdbc:mysql://localhost/agendita ... Ok

(significa: Todo funciona bien)

[blu e m a n @ c as i t a ] $ 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)

[blu e m a n @ c as i t a ] $ java TestConnection

java.sql.SQLException: Invalid authorization specification: Access denied for u s er : 'bingo@localhost' (Using password: YES)

(El login o el password proporcionados no nos permiten el acceso al servidor)

[blu e m a n @ c as i t a ] $ java TestConnection java.sql.SQLException: No suitable driver

(Probablemente se ha escrito de forma incorrecta el URL para la base de datos)

Unidad Didáctica: Taller de Programación Concurrente

Page 4: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

[blu e m a n @ c as i t a ] $ java TestConnection

j ava . s q l . S QL Exc e pti on : General error: Access denied for user: 'bingo@localhost' to database 'transportes'

(Probablemente se ha escrito de manera incorrecta el nombre de la base de datos)

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 d a t o s Connection getConnection(String url) throws SQLException

public static datos1 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:

Unidad Didáctica: Taller de Programación Concurrente

Page 5: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

public static Statement declaracion1 () throws SQLException

public 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 una

conexión es una operación costosa, por lo que tampoco se debe

estar abriendo y cerrando la conexión con frecuencia.

● 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 static ResultSet ejecutar(String sql) throws SQLException

Ejecuta una sentencia SELECT y devuelve el resultado mediante la interfaz ResultSet

public static int ejecutar1(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 static void setMaxRows(int max) throws SQLException

Establece el número máximo de registros que puede devolver executeQuery()

public static int getMaxRows() throws SQLException

Devuelve el número máximo de registros que puede devolver executeQuery()

public static 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

Unidad Didáctica: Taller de Programación Concurrente

Page 6: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

public static 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

public static void close() throws SQLException

Libera los recursos asociados a la sentencia

● La interfaz ResultSet, el método executeQuery que se utiliza

para ejecutar sentencias SQL devuelve un objeto de tipo ResultSet. Éste

contiene las filas o registros obtenidos al ejecutar una sentencia SELECT.

Para recuperar los datos contamos con muchas opciones. Todos los

métodos funcionan de la misma manera. Toman como parámetro el

índice o el nombre del campo que se desea obtener y devuelven el dato

en cuestión.

public static String getString(int columnIndex) throws SQLException

public static String getString(String columnName) throws SQLException

public static int getInt(int columnIndex) throws SQLException

public static 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 static int findColumn(String columnName) throws

SQLException Devuelve el número de columna cuyo nombre se pasa

como parámetro public static 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 static boolean wasNull() throws SQLException

Indica si el contenido de la última columna accedida es NULL SQL

public static void close() throws SQLException

Libera los recursos asociados al ResultSet

UNOS DETALLES PARA RELACIONARSE CON LA BASE DE DATOS

Unidad Didáctica: Taller de Programación Concurrente

Page 7: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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).

Posteriormente preparamos variables para indicar el nombre de la base de datos, el login, el password y el url

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(),

Unidad Didáctica: Taller de Programación Concurrente

Page 8: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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.

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.

Unidad Didáctica: Taller de Programación Concurrente

Page 9: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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.

Import java.sql.*;

Import java.swing.*;

Import java.swing.table*;

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

Unidad Didáctica: Taller de Programación Concurrente

Page 10: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

Para 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 del

formulario. Con el método limpiarDatos se limpia los cuadros de

textos.

Unidad Didáctica: Taller de Programación Concurrente

Page 11: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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 booleana

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 encuentra

dentro del while, su condición lógica se hará verdadero cuando

encuentre el código de estadio buscado, haciendo que los cuadros

Unidad Didáctica: Taller de Programación Concurrente

Page 12: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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, 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.

Unidad Didáctica: Taller de Programación Concurrente

Page 13: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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.

Unidad Didáctica: Taller de Programación Concurrente

Page 14: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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 campeonato, 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 conectarse 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.

Unidad Didáctica: Taller de Programación Concurrente

Page 15: Conceptos Esenciales

Instituto de Educación Superior Tecnológico Público“Víctor Álvarez Huapaya”

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 executeUpdate y se cierra

la conexión con el método close.

Unidad Didáctica: Taller de Programación Concurrente