Instructivo de instalación de manejador de base de datos “MySQL” en Windows y pruebas con NetBeans. MySQL es el manejador de bases de datos de código abierto más popular del mundo. Con su velocidad superior y fácil uso, MySQL se ha convertido en la opción preferida por los desarrolladores de software debido a que elimina una gran cantidad de problemas relacionados con el tiempo de respuesta, mantenimiento y administración de aplicaciones web, entre muchas otras cosas. Debido a esto es el software que se utilizará en la clase para aprender y comprender la forma en cómo se trabaja con bases de datos desde aplicaciones Java. Cabe destacar que existen varias maneras de operar bases de datos desde aplicaciones Java, pero son formas más avanzadas. Para comenzar a familiarizarse con este tipo de manejadores MySQL es la mejor opción. A continuación se ejemplificará el procedimiento a seguir para instalar esta herramienta en un sistema operativo Windows. 1. Descarga a. Ingresar a la URL http://dev.mysql.com/downloads/windows/installer/. b. Ya en la página, deslizar el scroll hacia abajo hasta la parte donde se debe seleccionar el sistema operativo y el instalador a descargar. Verificar que la plataforma sea “Microsoft Windows” y seleccionar la opción de descarga de mayor peso (248.2 M). Esta acción redirecciona hacia otra página. En la parte inferior de dicha página, se encuentra un vínculo que dice “No thanks, just start my download”. Dar clic en este vínculo para comenzar con la descarga. c. 2. Seleccionar “Guardar” y esperar a que se complete la descarga. NOTA: normalmente los archivos descargados se almacenan en el directorio “Descargas”, a menos que se modifique esta configuración. Instalación a. Ir al directorio en el cual se almacenó el archivo de instalación “mysql-installer-community-5.6.20.0.msi” y dar doble clic sobre él. NOTA: Si aparecen las solicitudes de autorización para iniciar la instalación, seleccionar “Si” o “Continuar”. b. Al iniciarse el instalador, aparecerá la siguiente ventana: Seleccionar “Install MySQL Products”. c. En la siguiente pantalla, seleccionar la casilla “I accept the licence terms” y dar clic en “next”. Aparecerá un mensaje diciendo que el instalador buscará los productos más nuevos de MySQL (en caso que los haya). Simplemente hay que dar clic en “Execute”. El instalador realizará sus operaciones y al terminar mostrará el botón “Next”. Dar clic en este botón. d. En la siguiente ventana se pueden seleccionar diversos productos que ofrece el instalador. Como no vamos a utilizar todas las herramientas disponibles, seleccionamos la opción “Custom” y damos clic en el botón “Next” (dejamos los directorios de instalación por defecto). e. Después damos clic en “MySQL Server 5.6.20” y seleccionamos todas las opciones del menú de la derecha. f. Si se encuentra activa la casilla de aplicaciones, la deseleccionamos. Esto es para ahorrar espacio en disco. Si alguien desea instalar estas aplicaciones, lo puede hacer. En la parte de “MySQL Connectors” seleccionamos solamente la opción “Connector/J 5.1.31”. g. Finalmente seleccionamos “Documentation”, verificamos que ambas selecciones del menú derecho estén activadas y damos clic en “Next”. h. Después se comprobarán requerimientos adicionales. Damos clic en “Next”. i. En la siguiente pantalla se mostrarán los productos a instalar. Verificamos que estén correctos y damos clic en “Execute”. j. Cuando los productos se terminen de instalar, su “status” aparecerá como “Install success”. Damos clic en “Next”. k. Posteriormente se iniciará la configuración del servidor MySQL recién instalado. Damos clic en “Next”. l. En la parte “Config Type” seleccionamos “Development Machine”. Habilitamos las casillas “Enable TCP/IP Networking” y “Open Firewall port for network access”; el número de puerto lo dejamos por default y deshabilitamos la casilla “Show Advanced Options”. Clic en “Next”. m. Escogemos un password para nuestro usuario root (administrador) y lo escribimos en los campos de texto “MySQL Root Password” y “Repeat Password”. En este momento no agregaremos más usuarios, así que simplemente damos clic en “Next”. n. En “Windows Service Name” dejamos el valor por defecto. Deshabilitamos la casilla “Start the MySQL Server at System Startup” y seleccionamos “Standard System Account”. Clic en “Next”. o. Al configurarse correctamente el servidor, se mostrará una “paloma”. Ahora sigue instalar lo demás. Damos clic en “Next”. Al terminarse la instalación de todos los productos se mostrarán “palomas” en ellos. Clic en “Next”. p. 3. Ya tenemos instalado nuestro servidor MySQL en el sistema operativo. Damos clic en “Finish” para cerrar el instalador. Uso de MySQL Lo primero que debemos saber es que como no instalamos un software gráfico para el manejo del servidor MySQL, solo lo tendremos dos opciones para operarlo: I. Desde una consola II. Desde NetBeans IDE Si alguien instaló las herramientas adicionales tendrá más opciones de visualizar las bases de datos que residan en nuestro servidor. Además, existen muchas más herramientas para poder operar con MySQL, pero ejemplificar más de estas herramientas no es el objetivo de este instructivo. Pasando a los ejemplos de manejo de MySQL, al terminar la instalación se crean accesos directos a una aplicación llamada “mysql.exe” ubicada en el directorio “C:\Program Files\MySQL\MySQL Server 5.6\bin”. Estos accesos directos nos sirven si queremos operar MySQL desde consola. Podemos dar doble clic sobre uno de estos accesos para comenzar a utilizar MySQL o, podemos abrir una consola y ejecutar el programa “mysql.exe” directamente. A continuación mostraré la forma de entrar al servidor MySQL desde una consola: a. Oprimir la tecla “Windows” (normalmente ubicada al lado derecho de la tecla ctrl izquierdo) más la tecla “R”. Esto desplegará en pantalla la ventana de “Ejecutar”. Escribimos “cmd” y damos clic en “Aceptar”. Esto nos abrirá una consola. Escribimos lo siguiente para cambiarnos al directorio que contiene el programa “mysql.exe”: “cd ../../Program Files/MySQL/MySQL Server 5.6/bin” (sin las comillas). b. Después escribimos el comando que nos permitirá identificarnos con el servidor MySQL: “mysql –u root -p” (sin las comillas). Damos “enter” y se nos solicitará el password que definimos en la configuración del servidor. Lo escribimos y damos nuevamente “enter” para poder identificarnos. c. Ya identificados, podremos escribir sentencias SQL para operar nuestras bases de datos. Las sentencias SQL más básicas que estaremos utilizando son: CREATE DATABASE nombre_bd; para crear una nueva base de datos llamada “nombre_bd”. SHOW DATABASES; para mostrar las bases de datos almacenadas. DROP DATABASE nombre_bd; elimina la base de datos llamada “nombre_bd”. USE nombre_bd; para trabajar con la base de datos llamada “nombre_bd”. CREATE TABLE nombre_tabla (atributos…); para crear una nueva tabla de una base de datos con sus atributos llamada “nombre_tabla”. SHOW TABLES; para mostrar las tablas de una base de datos. DROP TABLE nombre_tabla; elimina la tabla llamada “nombre_tabla”. INSERT INTO nombre_tabla VALUES (valores…); para agregar datos a la tabla “nombre_tabla”. SELECT [atributos…] FROM nombre_tabla; para consultar la información de la tabla llamada “nombre_tabla”. DELETE FROM nombre_tabla; para eliminar información de la tabla llamada “nombre_tabla”. UPDATE nombre_tabla SET atributos…; Las sentencias “SELECT”, “DELETE” y “UPDATE” pueden ser condicionadas con la palabra “WHERE”. A continuación muestro un ejemplo de ello: SELECT * FROM usuarios WHERE id=1; selecciona todos los atributos de la tabla “usuarios” donde el atributo “id” es igual a 1. DELETE FROM usuarios WHERE id=1; elimina la información de la tabla “usuarios” donde el atributo “id” es igual a 1. UPDATE usuarios SET nombre=’daniel’, edad=28 WHERE id=1; actualiza los atributos “nombre” y “edad” de la tabla “usuarios” donde el atributo “id” es igual a 1. Ya que terminemos de trabajar con MySQL desde la consola, para salir escribimos “exit”. d. Ahora que ya sabemos cómo acceder al servidor MySQL desde una consola, voy a mostrar cómo trabajar con él desde NetBeans IDE: a. Lo primero es ejecutar NetBeans. b. En el menú del lado izquierdo, seleccionamos la pestaña “Services” para poder ver las bases de datos con las que contamos. En caso de que no se muestre dicha pestaña, damos clic en el menú “Window” y seleccionamos “Services”. De esta forma ya nos aparecerá. c. Ya en la pestaña “Services” podremos ver los servidores de bases de datos que tenemos instalados. En nuestro caso, nos interesa “MySQL Server”. Nos aparecerá el “localhost:3306 [root] (disconnected)”. Damos clic derecho en el servidor MySQL y seleccionamos “Properties…”. d. En la ventana de propiedades, escribimos el password que especificamos al configurar nuestro servidor MySQL y activamos la casilla “Remember Password”. Clic en “OK”. e. Después nuevamente damos clic derecho en el servidor MySQL y seleccionamos “Connect”. Al establecerse la conexión con MySQL se mostrarán las bases de datos almacenadas. f. Ahora vamos a crear una base de datos para realizar pruebas. Damos clic derecho en el servidor MySQL y seleccionamos “Create Database…”. Nombramos la base de datos como “biblioteca” y damos clic en “OK”. La nueva base de datos se mostrará debajo del servidor MySQL. Damos clic derecho sobre “biblioteca” y seleccionamos “Connect…”. Esperamos a que se establezca la conexión y al terminar, debajo de “Drivers”, se visualizará “jdbc:mysql://localhost:3306/biblioteca…”. Desplegamos el árbol para ver el contenido. g. Como la base de datos es nueva, no contiene información. Vamos a crear una tabla para ingresar datos. Damos clic derecho en “Tables” y seleccionamos “Create Table…”. h. Nombramos la tabla como “Libros”. Nótese que el botón “OK” no está activo. Éste se activará después de que agreguemos columnas a nuestra tabla. Para ello, damos clic en el botón “Add column” que se encuentra del lado derecho. i. j. k. Nombramos la columna como “autor” de tipo “VARCHAR” y tamaño 50. Desactivamos la casilla “Null” (debido a que esta información nunca puede faltar) y damos clic en “OK”. De esta misma forma creamos otras cuatro columnas no nulas: “titulo” de tipo “VARCHAR” y tamaño 50 ”editorial” de tipo “VARCHAR” y tamaño 50 ”anio” de tipo “INT” ”edicion” de tipo “INT” Finalmente creamos una última columna llamada “isbn” de tipo “VARCHAR” y tamaño 20. A diferencia de las demás columnas, ésta será la llave primaria. Activamos la casilla “Primary key”, dejamos los valores por defecto y damos clic en “OK”. Ya que hayamos terminado de agregar nuestras columnas (atributos de la tabla o campos) damos clic en el botón “OK” que ya estará activo. Podremos observar en nuestra base de datos que se ha creado la nueva tabla con sus respectivos campos. 4. Pruebas del servidor MySQL con clases Java Ahora vamos a realizar nuestras pruebas con MySQL insertando, consultando, eliminando y actualizando datos en la tabla “libros” perteneciente a la base de datos “biblioteca” que creamos anteriormente. a. Primero creamos un nuevo proyecto de NetBeans tipo “Java Application” llamado “Biblioteca” sin crear la clase principal. b. Creamos 2 nuevos paquetes: uam.azc.mx.modelo uam.azc.mx.vista En el paquete “modelo”, agregamos una nueva clase Java llamada “Libro” y en el paquete “vista” agregamos un nuevo “JFrame Form” llamado “GUI”. c. d. e. Abrimos la clase “Libro”, agregamos seis datos miembro de la siguiente forma: private String autor; private String titulo; private String editorial; private String ISBN; private int anio; private int edicion; Agregamos un constructor: public Libro(String autor,String titulo,String editorial,String ISBN,int anio,int edicion){ this.autor=autor; this.titulo=titulo; this.editorial=editorial; this.ISBN=ISBN; this.anio=anio; this.edicion=edicion; } Después agregamos los métodos “get” de nuestros datos miembro: public String getAutor(){ return(this.autor); } public String getTitulo(){ return(this.titulo); } public String getEditorial(){ return(this.editorial); } public String getISBN(){ return(this.ISBN); } public int getAnio(){ return(this.anio); } public int getEdicion(){ return(this.edicion); } f. g. h. Sobrescribimos el método “toString”: @Override public String toString(){ return("Autor:\t\t" + this.autor + "\nTitulo:\t\t" + this.titulo + "\nEditorial:\t" + this.editorial + "\nISBN:\t\t" + this.ISBN + "\nAnio:\t\t" + this.anio + "\nEdicion:\t" + this.edicion + "\n----------------------------------------------------------"); } Ya que tenemos nuestra clase “Libro” terminada creamos una clase “Test” en el paquete “default” para corroborar que esté correcta. A esta nueva clase le agregamos el siguiente código dentro del método principal: Libro [] libros=new Libro[5]; libros[0]=new Libro("Thomas H. Cormen","Introduction to Algorithms","McGrow-Hill","107013151",2001,2); System.out.println(libros[0].toString()); libros[1]=new Libro("Cay Horstmann","BIG JAVA","Wilew","326902040",2008,3); System.out.println(libros[1].toString()); libros[2]=new Libro("Deitel & Deitel","Como Programar en Java","Pearson","970260548",2003,5); System.out.println(libros[2].toString()); libros[3]=new Libro("Stuart J. Russell","Inteligencia Artificial: Un Enfoque Moderno","Pearson","842054003",2004,2); System.out.println(libros[3].toString()); libros[4]=new Libro("Barry B. Brey","The Intel Microprocessors","Prentice-Hall International","113802745",1997,4); System.out.println(libros[4].toString()); Para ejecutar nuestra clase “Test” presionamos “Shift” + “F6”. La salida que se debe mostrar es la siguiente: run: Autor: Thomas H. Cormen Titulo: Introduction to Algorithms Editorial: McGrow-Hill ISBN: 107013151 Anio: 2001 Edicion:2 ---------------------------------------------------------Autor: Cay Horstmann Titulo: BIG JAVA Editorial: Wilew ISBN: 326902040 Anio: 2008 Edicion:3 ---------------------------------------------------------Autor: Deitel & Deitel Titulo: Como Programar en Java Editorial: Pearson ISBN: 970260548 Anio: 2003 Edicion:5 ---------------------------------------------------------Autor: Stuart J. Russell Titulo: Inteligencia Artificial: Un Enfoque Moderno Editorial: Pearson ISBN: 842054003 Anio: 2004 Edicion:2 ---------------------------------------------------------Autor: Barry B. Brey i. j. k. Titulo: The Intel Microprocessors Editorial: Prentice-Hall International ISBN: 113802745 Anio: 1997 Edicion:4 ---------------------------------------------------------BUILD SUCCESSFUL (total time: 0 seconds) Si no se mostró lo anterior, hay que consultar los pasos anteriores para determinar a qué se debe. Además, no hay que olvidar agregar la documentación necesaria para nuestro constructor y los métodos utilizados. Ahora vamos a ingresar esta información (los cinco libros) en nuestra base de datos “biblioteca”. Para ello, creamos un nuevo paquete llamado “uam.azc.mx.control” y agregamos una clase Java llamada “SQL”. Esta nueva clase nos servirá para establecer una conexión entre el servidor MySQL y nuestra aplicación Java, para así poder manipular la información contenida en la base de datos “biblioteca”, que por el momento solo contendrá información de libros. Abrimos la clase SQL y añadimos las siguientes importaciones: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import uam.azc.mx.modelo.Libro; Agregamos un dato miembro privado de tipo “Connection” llamado “conn” y el constructor de la clase: private Connection conn; public SQL(){ this.conn=null; } Creamos un nuevo método público tipo “boolean” llamado “conectar”, que reciba cuatro objetos de la clase “String”, con los cuales sabremos el host al que nos conectaremos, el nombre de la base de datos, el usuario y el password necesarios para poder establecer la conexión: public boolean conectar(String server,String bd,String user,String pass){ try{ Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException e){ System.err.println("Error: " + e.getMessage()); return(false); } try{ this.conn=DriverManager.getConnection("jdbc:mysql://" + server + "/" + bd,user,pass); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } Éste método creará una conexión con el servidor MySQL y regresará verdadero (true) si se tiene éxito. Si se produce un error al intentar conectarse regresará falso (false). l. Ahora creamos el método que cerrará la conexión con MySQL: public void desconectar(){ try{ this.conn.close(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); } } No olvidemos que cada que creamos una nueva conexión con una fuente externa a nuestra aplicación (MySQL, archivos, servidores web, etc.) debemos siempre cerrar el canal de comunicación que se crea. m. Ya que tengamos nuestra conexión establecida, debemos ingresar la información de nuestros libros en la base de datos. Para ello, creamos el método público de tipo “boolean” llamado “agregaLibro”, que recibirá como argumento un objeto de tipo “Libro” para después acceder a sus atributos e ingresarlos a la base de datos. Lo hacemos de la siguiente manera: public boolean agregaLibro(Libro libro){ String query="INSERT INTO libros(autor,titulo,editorial,anio,edicion,isbn) VALUES('" + libro.getAutor() + "','" + libro.getTitulo() + "','" + libro.getEditorial() + "'," + libro.getAnio() + "," + libro.getEdicion() + ",'" + libro.getISBN() + "')"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } Si el libro se ingresa correctamente, el método regresará verdadero (true), si no, será falso (false). n. También podemos llegar a prescindir de cierta información. Es por eso que necesitaremos un método que elimine libros de nuestra base de datos. Para identificar qué libro vamos a eliminar, pasaremos como argumento el “isbn” del libro. El método será público de tipo “boolean” y se llamará “eliminaLibro”: public boolean eliminaLibro(String isbn){ String query="DELETE FROM libros WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } Si el libro se elimina correctamente, el método regresará verdadero (true), si no, será falso (false) o. Para poder consultar la información que tenemos en nuestra base de datos “biblioteca”, en particular en la tabla “libros”, requeriremos de un método público tipo “void” llamado “verLibros”: public void verLibros(){ String query="SELECT * FROM libros"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ResultSet libros=ps.executeQuery(); while(libros.next()){ Libro libro=new Libro(libros.getString("autor"), libros.getString("titulo"), libros.getString("editorial"), libros.getString("isbn"), Integer.parseInt(libros.getString("anio")), Integer.parseInt(libros.getString("edicion"))); System.out.println(libro.toString()); } } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); } p. } Cuando se creen nuevas tablas en la base de datos se deberán hacer sus propios métodos para realizar una consulta. Obviamente serán muy parecidos a este método. Finalmente, crearemos métodos para actualizar los campos de nuestra tabla “libros”. Debido a que tenemos seis campos en la tabla, escribiremos seis métodos, uno para actualizar cada campo. Todos los métodos serán públicos de tipo “boolean” y la actualización se realizará al libro identificado por su ISBN. A continuación muestro los seis métodos: public boolean actualizaAutor(String isbn,String autor){ String query="UPDATE libros SET autor='" + autor + "' WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } public boolean actualizaTitulo(String isbn,String titulo){ String query="UPDATE libros SET titulo='" + titulo + "' WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } public boolean actualizaEditorial(String isbn,String editorial){ String query="UPDATE libros SET editorial='" + editorial + "' WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); q. r. s. } public boolean actualizaISBN(String isbn,String nuevo){ String query="UPDATE libros SET isbn=’" + nuevo + "’ WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } public boolean actualizaAnio(String isbn,int anio){ String query="UPDATE libros SET anio=" + anio + " WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } public boolean actualizaEdicion(String isbn,int edicion){ String query="UPDATE libros SET edicion=" + edicion + " WHERE isbn='" + isbn + "'"; try{ PreparedStatement ps=this.conn.prepareStatement(query); ps.execute(); } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); return(false); } return(true); } Nótese que en estos métodos se repite el código que ejecuta el query en MySQL. Esto se puede reducir. Además, no hay que olvidarse de documentar todos los métodos de la clase “SQL”. Ya que tenemos terminada la clase “SQL”, modificamos la clase “Test” para realizar pruebas. Primero, importamos lo siguiente: import uam.azc.mx.control.SQL; Después eliminamos los “System.out.println” que escribimos anteriormente., quedando el código anterior como: Libro [] libros=new Libro[5]; libros[0]=new Libro("Thomas H. Cormen","Introduction to Algorithms","McGrow-Hill","107013151",2001,2); libros[1]=new Libro("Cay Horstmann","BIG JAVA","Wilew","326902040",2008,3); libros[2]=new Libro("Deitel & Deitel","Como Programar en Java","Pearson","970260548",2003,5); libros[3]=new Libro("Stuart J. Russell","Inteligencia Artificial: Un Enfoque Moderno","Pearson","842054003",2004,2); libros[4]=new Libro("Barry B. Brey","The Intel Microprocessors","Prentice-Hall International","113802745",1997,4); De esta forma, solo creamos el arreglo de libros y no lo imprimimos en pantalla. Ahora creamos un objeto de tipo “SQL” llamado “conexion”: SQL conexion=new SQL(); t. Nos conectamos con el servidor MySQL: conexion.conectar("localhost","biblioteca","root","123456"); System.out.println("Conexión establecida"); Imprimimos en pantalla mensajes de control. u. Ingresamos los libros que tenemos en el arreglo a la base de datos con ayuda de un ciclo “for each”: for(Libro l : libros){ conexion.agregaLibro(l); System.out.println("Libro agregado"); } v. Desplegamos en pantalla los libros recién agregados: conexion.verLibros(); w. A continuación probamos los demás métodos programados agregando un libro personalizado y desconectándonos del servidor MySQL: conexion.agregaLibro(new Libro("Daniel Torres","Libro de Muestra","UAM-A","000111222",2014,1)); System.out.println("Nuevo libro agregado"); conexion.verLibros(); conexion.actualizaAnio("000111222",2000); System.out.println("Año actualizado"); conexion.actualizaAutor("000111222","Daniel Alberto Torres Gonzalez"); System.out.println("Autor actualizado"); conexion.actualizaEdicion("000111222",2); System.out.println("Edición actualizada"); conexion.actualizaEditorial("000111222","UAM Azcapotzalco"); System.out.println("Editorial actualizado"); conexion.actualizaISBN("000111222","222111000"); System.out.println("ISBN actualizado"); conexion.actualizaTitulo("222111000","Muestras de libro en BD"); System.out.println("Titulo actualizado"); conexion.verLibros(); conexion.eliminaLibro("222111000"); System.out.println("Libro eliminado"); conexion.verLibros(); conexion.desconectar(); x. Ya que tengamos nuestro código de prueba listo, necesitaremos agregar a las librerías del proyecto el conector que instalamos cuando cargamos MySQL. Para esto, dar un clic derecho en “Libraries”, localizado debajo de “Source Packages”, en el menú izquierdo y seleccionar “Add JAR/Folder”. En la ventana que se despliega, buscar la ruta “C:\Program Files (x86)\MySQL\Connector J 5.1.31”, seleccionar el archivo “mysql-connector-java-5.1.31-bin.jar” y dar clic en “Abrir”. Al agregar la librería se mostrará debajo de “Libraries”. y. Ahora ejecutamos la clase “Test” presionando “Shift” + “F6”. Observamos la salida en pantalla paso a paso para comprobar que todo esté correcto. Si han realizado cada paso exactamente a como se ha descrito, la salida deberá ser: run: Conexión establecida Libro agregado Libro agregado Libro agregado Libro agregado Libro agregado Autor: Thomas H. Cormen Titulo: Introduction to Algorithms Editorial: McGrow-Hill ISBN: 107013151 Año: 2001 Edicion:2 ---------------------------------------------------------Autor: Barry B. Brey Titulo: The Intel Microprocessors Editorial: Prentice-Hall International ISBN: 113802745 Año: 1997 Edicion:4 ---------------------------------------------------------Autor: Cay Horstmann Titulo: BIG JAVA Editorial: Wilew ISBN: 326902040 Año: 2008 Edicion:3 ---------------------------------------------------------Autor: Stuart J. Russell Titulo: Inteligencia Artificial: Un Enfoque Moderno Editorial: Pearson ISBN: 842054003 Año: 2004 Edicion:2 ---------------------------------------------------------Autor: Deitel & Deitel Titulo: Como Programar en Java Editorial: Pearson ISBN: 970260548 Año: 2003 Edicion:5 ---------------------------------------------------------Nuevo libro agregado Autor: Daniel Torres Titulo: Libro de Muestra Editorial: UAM-A ISBN: 000111222 Año: 2014 Edicion:1 ---------------------------------------------------------Autor: Thomas H. Cormen Titulo: Introduction to Algorithms Editorial: McGrow-Hill ISBN: 107013151 Año: 2001 Edicion:2 ---------------------------------------------------------Autor: Barry B. Brey Titulo: The Intel Microprocessors Editorial: Prentice-Hall International ISBN: 113802745 Año: 1997 Edicion:4 ---------------------------------------------------------Autor: Cay Horstmann Titulo: BIG JAVA Editorial: Wilew ISBN: 326902040 Año: 2008 Edicion:3 ---------------------------------------------------------Autor: Stuart J. Russell Titulo: Inteligencia Artificial: Un Enfoque Moderno Editorial: Pearson ISBN: 842054003 Año: 2004 Edicion:2 ---------------------------------------------------------Autor: Deitel & Deitel Titulo: Como Programar en Java Editorial: Pearson ISBN: 970260548 Año: 2003 Edicion:5 ---------------------------------------------------------Año actualizado Autor actualizado Edición actualizada Editorial actualizado ISBN actualizado Titulo actualizado Autor: Thomas H. Cormen Titulo: Introduction to Algorithms Editorial: McGrow-Hill ISBN: 107013151 Año: 2001 Edicion:2 ---------------------------------------------------------Autor: Barry B. Brey Titulo: The Intel Microprocessors Editorial: Prentice-Hall International ISBN: 113802745 Año: 1997 Edicion:4 ---------------------------------------------------------Autor: Daniel Alberto Torres Gonzalez Titulo: Muestras de libro en BD Editorial: UAM Azcapotzalco ISBN: 222111000 Año: 2000 Edicion:2 ---------------------------------------------------------Autor: Cay Horstmann Titulo: BIG JAVA Editorial: Wilew ISBN: 326902040 Año: 2008 Edicion:3 ---------------------------------------------------------Autor: Stuart J. Russell Titulo: Inteligencia Artificial: Un Enfoque Moderno Editorial: Pearson ISBN: 842054003 Año: 2004 Edicion:2 ---------------------------------------------------------Autor: Deitel & Deitel Titulo: Como Programar en Java Editorial: Pearson ISBN: 970260548 Año: 2003 Edicion:5 ---------------------------------------------------------Libro eliminado Autor: Thomas H. Cormen Titulo: Introduction to Algorithms Editorial: McGrow-Hill ISBN: 107013151 Año: 2001 Edicion:2 ---------------------------------------------------------Autor: Barry B. Brey Titulo: The Intel Microprocessors Editorial: Prentice-Hall International ISBN: 113802745 Año: 1997 Edicion:4 ---------------------------------------------------------Autor: Cay Horstmann Titulo: BIG JAVA Editorial: Wilew ISBN: 326902040 Año: 2008 Edicion:3 z. ---------------------------------------------------------Autor: Stuart J. Russell Titulo: Inteligencia Artificial: Un Enfoque Moderno Editorial: Pearson ISBN: 842054003 Año: 2004 Edicion:2 ---------------------------------------------------------Autor: Deitel & Deitel Titulo: Como Programar en Java Editorial: Pearson ISBN: 970260548 Año: 2003 Edicion:5 ---------------------------------------------------------BUILD SUCCESSFUL (total time: 0 seconds) Si hay algún dato que no coincida, regresar a los pasos anteriores para verificar a que se debe. Finalmente, mostraré como visualizar con NetBeans la información recién almacenada en nuestra tabla “libros”. En la pestaña “Services”, damos clic derecho en el nombre de la tabla “libros” y seleccionamos “Refresh”. Con esto actualizaremos la información almacenada en la tabla. Nuevamente damos clic derecho en el nombre de la tabla “libros”, pero ahora seleccionamos “View Data…”. Con esto, se enviará un query de selección al servidor MySQL y nos regresará la información contenida en la tabla, la cual será desplegada en una nueva pestaña de NetBeans. En la parte superior veremos el nombre de la pestaña; en la parte central veremos el query enviado; debajo del query veremos la información almacenada en la tabla “libros” y en la parte inferior veremos el resultado de la ejecución del query. 5. Con esto comprobamos que el código escrito es correcto. Interfaz gráfica Ahora vamos a crear una interfaz gráfica simple con ayuda de NetBeans para manipular nuestra base de datos. a. Abrimos la clase “GUI” creada en el paquete “uam.azc.mx.vista”. Se desplegará la vista de diseño. En la parte inferior izquierda podremos ver el navegador. Aquí se mostrarán todos los componentes gráficos que agreguemos a nuestra clase. En la parte central tendremos la vista de nuestro JFrame principal, en el cual vamos a agregar los componentes gráficos. Del lado superior derecho tenemos la paleta de componentes gráficos. De aquí podemos seleccionar el componente que deseamos mostrar en nuestro JFrame principal arrastrándolo directamente hacia él. De los “Swing Containers” utilizaremos solamente el “Scroll Pane”. De los “Swing Controls” utilizaremos “Label”, ”Button”, ”Radio Button”, ”Button Group”, ”Text Field” y ”Separator”. En la parte inferior derecha podremos ver las propiedades del componente que seleccionemos. b. Ahora vamos a agregar nuestros componentes al JFrame principal arrastrándolos desde la paleta. Los componentes que seleccionaremos son: Siete Button: Conectar, Desconectar, Ver Libros, Agregar, Eliminar, Cambiar, Salir. Ocho Label: Status, Autor, Título, Editorial, Año, Edición, ISBN, Nuevo. Siete TextField: Uno para cada Label. Seis Radio Button: Uno para cada Label. Dos Separator: Uno para separar los botones Conectar, Desconectar y la etiqueta Status y el otro para separar el botón Ver Libros y el Scroll Pane del resto de los componentes. Un Scroll Pane: Nos servirá para crear dinámicamente una tabla que contendrá los libros de la base de datos. Un Button Group: en él añadiremos con código Java los seis Radio Button. Los componentes serán acomodados preferentemente como muestra la siguiente imagen: Las dimensiones de cada componente dependen de cada uno. Lo que si se recomienda es que asignen un nombre de variable diferente al que se otorga por default. De esta manera podrán identificar más fácilmente sus componentes. A continuación muestro los nombres de variables que asigné: Recomiendo utilizar los mismos nombres de variable debido a que en el código Java que se escriba los utilizaré tal y como se muestran. Para poder cambiar los nombres de variable hay que dar clic derecho en algún componente y seleccionar “Change Variable Name…”. En la ventana que se despliega escribir el nombre nuevo para la variable y dar clic en “OK”. c. Ya que tengamos todos nuestros componentes ordenados y renombrados en el JFrame principal, vamos a especificar la acción que va a realizar cada botón al ser presionado. Para esto, damos clic derecho en algún botón, seleccionamos “Events“”Action””actionPerformed”. Cada que hagamos esto se cambiará el modo. Para cambiar entre el modo diseño y el modo código hay que seleccionar “Design” o “Source”, ubicados en la parte central superior. d. Hay que agregar una acción a cada botón. Cuando se realice este procedimiento con cada botón, ir al modo “Source” para escribir el código Java necesario para que nuestra clase funcione adecuadamente. Ya en el modo “Source”, podremos ver el código Java de nuestra clase. Las líneas que estén de color gris no las podremos modificar, debido a que NetBeans restringe su modificación. e. f. g. h. i. j. En la clase “GUI” hacemos las siguientes importaciones: import java.util.List; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import uam.azc.mx.control.SQL; import uam.azc.mx.modelo.Libro; Agregamos un atributo privado de tipo “SQL” llamado “conexion”: private SQL conexion; En el constructor añadimos lo siguiente: initComponents(); this.conexion=new SQL(); this.GrupoRadioBotones.add(this.RadioBotonAnio); this.GrupoRadioBotones.add(this.RadioBotonAutor); this.GrupoRadioBotones.add(this.RadioBotonEdicion); this.GrupoRadioBotones.add(this.RadioBotonEditorial); this.GrupoRadioBotones.add(this.RadioBotonISBN); this.GrupoRadioBotones.add(this.RadioBotonTitulo); this.RadioBotonAutor.setSelected(true); this.BotonAgregar.setEnabled(false); this.BotonCambiar.setEnabled(false); this.BotonEliminar.setEnabled(false); this.BotonVerLibros.setEnabled(false); this.BotonDesconectar.setEnabled(false); En el método que se creó para realizar la acción del botón “Conectar” (private BotonConectarActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: if(!this.conexion.conectar("localhost","biblioteca","root","123456")){ JOptionPane.showMessageDialog(this,"Error al conectar con la base datos","Error",JOptionPane.ERROR_MESSAGE); return; } this.BotonAgregar.setEnabled(true); this.BotonCambiar.setEnabled(true); this.BotonConectar.setEnabled(false); this.BotonEliminar.setEnabled(true); this.BotonVerLibros.setEnabled(true); this.BotonDesconectar.setEnabled(true); this.Status.setText("Conectado"); En el método que se creó para realizar la acción del botón “Desconectar” (private BotonDesconectarActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: this.conexion.desconectar(); this.BotonAgregar.setEnabled(false); this.BotonCambiar.setEnabled(false); this.BotonConectar.setEnabled(true); this.BotonEliminar.setEnabled(false); this.BotonVerLibros.setEnabled(false); this.BotonDesconectar.setEnabled(false); this.Status.setText("Desconectado"); En el método que se creó para realizar la acción del botón “Agregar” (private BotonAgregarActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: if(this.CampoAnio.getText().isEmpty() || this.CampoAutor.getText().isEmpty() || this.CampoEdicion.getText().isEmpty() || this.CampoEditorial.getText().isEmpty() || this.CampoISBN.getText().isEmpty() || this.CampoTitulo.getText().isEmpty()){ void de void void k. l. JOptionPane.showMessageDialog(this,"Especifique todos los campos","Error",JOptionPane.ERROR_MESSAGE); return; } Libro libro=new Libro(this.CampoAutor.getText(), this.CampoTitulo.getText(), this.CampoEditorial.getText(), this.CampoISBN.getText(), Integer.parseInt(this.CampoAnio.getText()), Integer.parseInt(this.CampoEdicion.getText())); if(!this.conexion.agregaLibro(libro)){ JOptionPane.showMessageDialog(this,"Error al agregar el libro","Error",JOptionPane.ERROR_MESSAGE); return; } JOptionPane.showMessageDialog(this,"Libro agregado con éxito","OK",JOptionPane.INFORMATION_MESSAGE); En el método que se creó para realizar la acción del botón “Eliminar” (private void BotonEliminarActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: if(this.CampoISBN.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el campo ISBN","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.eliminaLibro(this.CampoISBN.getText())){ JOptionPane.showMessageDialog(this,"Error al eliminar el libro","Error",JOptionPane.ERROR_MESSAGE); return; } JOptionPane.showMessageDialog(this,"Libro eliminado con éxito","OK",JOptionPane.INFORMATION_MESSAGE); En el método que se creó para realizar la acción del botón “Cambiar” (private void BotonCambiarActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: if(this.CampoISBN.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el ISBN","Error",JOptionPane.ERROR_MESSAGE); return; } if(this.RadioBotonAnio.isSelected()){ if(this.CampoAnio.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el año","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaAnio(this.CampoISBN.getText(),Integer.parseInt(this.CampoAnio.getText()))){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } else if(this.RadioBotonAutor.isSelected()){ if(this.CampoAutor.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el autor","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaAutor(this.CampoISBN.getText(),this.CampoAutor.getText())){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } else if(this.RadioBotonEdicion.isSelected()){ if(this.CampoEdicion.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique la edición","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaEdicion(this.CampoISBN.getText(),Integer.parseInt(this.CampoEdicion.getText()))){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } else if(this.RadioBotonEditorial.isSelected()){ if(this.CampoEditorial.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique la editorial","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaEditorial(this.CampoISBN.getText(),this.CampoEditorial.getText())){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } else if(this.RadioBotonISBN.isSelected()){ if(this.CampoNuevo.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el nuevo isbn","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaISBN(this.CampoISBN.getText(),this.CampoNuevo.getText())){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } else if(this.RadioBotonTitulo.isSelected()){ if(this.CampoTitulo.getText().isEmpty()){ JOptionPane.showMessageDialog(this,"Especifique el título","Error",JOptionPane.ERROR_MESSAGE); return; } if(!this.conexion.actualizaTitulo(this.CampoISBN.getText(),this.CampoTitulo.getText())){ JOptionPane.showMessageDialog(this,"Error al actualizar","Error",JOptionPane.ERROR_MESSAGE); return; } } BotonVerLibrosActionPerformed(null); JOptionPane.showMessageDialog(this,"Libro actualizado con éxito","OK",JOptionPane.INFORMATION_MESSAGE); m. En el método que se creó para realizar la acción del botón “Ver Libros” (private void BotonVerLibrosActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: DefaultTableModel modeloTabla=new DefaultTableModel(){ @Override public boolean isCellEditable(int row,int column){ return(false); } }; modeloTabla.addColumn("Autor"); modeloTabla.addColumn("Título"); modeloTabla.addColumn("Editorial"); n. o. p. modeloTabla.addColumn("Año"); modeloTabla.addColumn("Edición"); modeloTabla.addColumn("ISBN"); List <Libro> libros; if((libros=this.conexion.verLibros())==null){ JOptionPane.showMessageDialog(this,"Error al consultar los libros","Error",JOptionPane.ERROR_MESSAGE); return; } for(Libro l : libros){ Object [] s={l.getAutor(),l.getTitulo(),l.getEditorial(),l.getAnio(),l.getEdicion(),l.getISBN()}; modeloTabla.addRow(s); } JTable tabla=new JTable(modeloTabla); this.ScrollPanel.setViewportView(tabla); Finalmente en el método que se creó para realizar la acción del botón “Salir” (private void BotonSalirActionPerformed(java.awt.event.ActionEvent evt)), escribimos lo siguiente: try{ BotonDesconectarActionPerformed(null); } catch(NullPointerException e){} System.exit(0); Ahora, necesitamos modificar el método “verLibros” de nuestra clase “SQL”. Abrimos la clase “SQL”, nos dirigimos a este método y rescribimos como sigue: public List <Libro> verLibros(){ String query="SELECT * FROM libros"; List <Libro> libs=new ArrayList <Libro> (); try{ PreparedStatement ps=this.conn.prepareStatement(query); ResultSet libros=ps.executeQuery(); while(libros.next()){ Libro libro=new Libro(libros.getString("autor"), libros.getString("titulo"), libros.getString("editorial"), libros.getString("isbn"), Integer.parseInt(libros.getString("anio")), Integer.parseInt(libros.getString("edicion"))); libs.add(libro); } } catch(SQLException e){ System.err.println("Error: " + e.getMessage()); } return(libs); } De esta forma no se mostrarán más errores en compilación y podremos ejecutar nuestra clase “GUI” presionando “Shift” + “F6”, para así verificar la función de cada componente que se ha añadido. En caso de que se hayan realizado los pasos anteriores y no se muestre el resultado esperado, me pueden contactar al correo king_datg@hotmail.com y con gusto resolveré sus dudas. Creado por: Ing. Daniel Alberto Torres González Fecha: 18 de septiembre de 2014.