ago 17 2009
Conectar aplicación Java a una BD

En mis últimas vacaciones estuve experimentando mucho con Java y sus múltiples facetas (o al menos las que debería conocer ya) a las que se aplica en la informática, desde las simples aplicaciones por Consola, los GUI’s y las aplicaciones Web con Servlets y JSP’s. Sin embargo llegue un punto que me me costó aprenderlo bien por la semántica de su uso, y es la interacción que tiene Java con las bases de Datos, mediante el Paquete Java.SQL pero al final comprendí que es muy fácil y muy útil, sobre todo si quieres que tu aplicación (sea Web o Desktop) maneje inmensas cantidades de datos que no se soportan en un fichero de texto, o que simplemente quieres que sean mejor administrados por un manejador de BD (cualquiera), pero bueno, eso ya se tendría que ver en la planificación del proyecto.
Ahora (saliendo del floro) enseñaré como es que una aplicación Java En Desktop puede conectarse a una Base de Datos Que Tengo en MySQL (para mí, el mejor manejador de BD por su simplicidad) en una simple aplicación con NetBeans donde sólo usaré una base de datos con una Tabla y 5 Datos de ejemplo que sólo se pueden mostrar (si te quieres expandir, puedes hacer que los modifique o elimine, pero prácticamente es el mismo proceso).
Para esto usaremos el afamado NetBeans, en su versión 6.7 y MySQL (el que uso yo es el que viene incorporado en WampServer):
En Netbeans primero creamos la aplicación y lo colocamos tal como muestran las imágenes y le damos a “Finish”:
Luego vemos que se creo una aplicación limpia sin frames ni nada… y por las moscas, lo que haremos será agregar el Driver MySQL a las librerías (sino nos dará una Exception de que no existe la clase, pero no se moleste en entender esto, ya luego se darán cuenta):

Eligen el Driver MySQL JDBC, que en este caso ya viene en NetBeans, en caso no encuentres algún driver puedes darle a “Create” y crear un driver basado en algún archivo Jar que te dé el fabricante del Manejador de BD como conector a Java.

Ahora sí, una vez terminado estas importaciones de Rutina creamos un Frame (o si quieres lo haces vía código) vía clic derecho en el Paquete, New, JFrame Form y luego para diseñar, NetBeans es bueno… Yo me hice uno así (Clic para ver grande):
Ahora bien, en la imagen anterior indiqué los nombres de las variables (que pueden colocar si le hacen clic derecho al control y luego “Change Variable Name”) ya que usaremos sus eventos o llamadas de valores (los set y getTexts) y bueno, es más eficiente…
Ahora vamos con el código… primero le hacemos un clic derecho al Botón “btnMostrar” y elegimos Events >> Action >> actionPerformed que vendría a ser el evento que ocurre al darle clic a ese botón. y se abrirá el editor de código con esta vista:
private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) {
//
}
*****************************************************************
Recomendación:
Yo acostumbré a borrar el main del Frame, para llamarlo desde el Main.java de la aplicación, me parece más práctico… simplemente anda al código de tu Frame y quita estas líneas de código:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ventana().setVisible(true);
}
});
*****************************************************************
Nos encargaremos de operar sólo en ese método actionPerformed sin olvidar importar el paquete java.sql:
import java.sql.*;
y ahora si… empecemos a trabajar en ese evento… primero que nada, agreguen un Try-Catch al evento de esta forma:
private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) {
try {
} catch (Exception e) {
txtResultado.setText("Hubo un error En La Conexión, Reintente otra vez");
txtDatos.setText("No hay datos que mostrar");
}
}
Lo que pasara en una excepción será que los controles txtResultado y txtDatos mostrarán esos mensajes.
**********************************************************
Dejemos un momento el código en Netbeans para ir creando nuestra base de datos en MySQL (Obvien este paso si ya tienen preparada una base de datos simple):
Abrimos consola y colocamos las siguientes sentencias:
mysql> create database producto_netbeans; mysql> create table producto_basico( >nombre VARCHAR(20), marca VARCHAR(20));
Así habremos creado una sencilla Base De Datos producto_netbeans con una tabla Producto_basico con dos atributos: Nombre y Marca.
Ahora insertamos los datos:
INSERT INTO 'producto_basico' ('nombre' ,
'marca')
VALUES ('jabon ', 'bolivar'), ('detergente', 'ace'), ('arroz','costeño'), ('azucar', 'laredo'), ('gaseosa','coca cola');
Y ya tenemos una base de datos de donde tomar los datos para nuestra aplicación.
**********************************************************
Regresando a nuestro proyecto en NetBeans, ahora insertamos el driver y creamos una nueva instancia a partir de ella así:
private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception e) {
txtResultado.setText("Hubo un error En La Conexión, Reintente otra vez");
txtDatos.setText("No hay datos que mostrar");
}
}
Luego crearemos un objeto Conexion, donde haremos que se le pasen los parámetros ingresados en la GUI, tales como el usuario y el password, para que se conecte a partir de eso, de esta manera:
private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection c = DriverManager.getConnection("jdbc:mysql://" + txtURL.getText() + ":" + txtPort.getText(), txtUsuario.getText(), txtPassword.getText());
txtResultado.setText("Acaba de ingresar correctamente a MySQL con el usuario "+txtUsuario.getText()); //Esto lo colocamos para que muestre en pantalla que hemos ingresado bien...
} catch (Exception e) {
txtResultado.setText("Hubo un error En La Conexión, Reintente otra vez");
txtDatos.setText("No hay datos que mostrar");
}
}
Ahora viene un poco la parte final y confusa, así que lo explicare todo de un sólo paso, lo que se hace ahora si queremos mostrar los datos en el otro TextArea, es crear un Statement en Base a la variable Connection c, y luego un ResultSet r, que será igual al Statement con un parametro String pasado, que vendría a ser prácticamente la sentencia SQL a ejecutar mediante el método executeQuery, que sirve para SELECT’s. Ahora bien, una vez creado eso, para mostrar la variable debemos crear un While con condición de que mientras r.next() sea verdadero, se sigan mostrando elementos del resulset, r.next() verifica que haya un siguiente registro… en el ejemplo yo almacené todo en un String, para luego mostrar los dos Strings juntos en el text txtDatos, de la siguiente manera:
private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection c = DriverManager.getConnection("jdbc:mysql://" + txtURL.getText() + ":" + txtPort.getText(), txtUsuario.getText(), txtPassword.getText());
txtResultado.setText("Acaba de ingresar correctamente a MySQL con el usuario "+txtUsuario.getText());
Statement s = c.createStatement(); //crea el Statement
ResultSet r = s.executeQuery("Select * from producto_netbeans.producto_basico"); //crea el Resultset y de paso añade la sentencia SQL
String mensajeNombre = "", mensajeMarca = ""; //las variables donde almacenare resultados
while(r.next()) //si es falso se detiene
{
mensajeNombre = mensajeNombre +r.getString(1)+"\n"; //r.getString(x) es la columna contenida en el SELECT
mensajeMarca = mensajeMarca + r.getString(2)+"\n";
}
txtDatos.setText("Los Nombres contenidos son:\n "+mensajeNombre+ "\nY Las Marcas son:\n"+mensajeMarca); //finalmente se muestra todo....
} catch (Exception e) {
txtResultado.setText("Hubo un error En La Conexión, Reintente otra vez");
txtDatos.setText("No hay datos que mostrar");
}
}
Bueno, eso fue algo básico y más o menos lo quise explicar, si hay alguna duda sólo pregunten… de paso que ahí adjunto los archivos de proyecto (si lo abren desde el proyecto no olviden reimportar la librería del Driver como al comienzo) y el JAR ejecutable en la carpeta DIST de dicho Proyecto, espero les Sirva!… Saludos





sep 13, 2009 @ 22:10:30
hola!! esta muy bien tu ejemplo ke pusiste , pero una duda quisiera saber cual es la URL es la ruta de mi mysql que voy a poner en la caja de texto?? gracias y saludos!!
sep 14, 2009 @ 17:06:24
Bueno Erika, eso depende de como tengas instalado tu MYSQL, yo en ese ejemplo lo tenía instalado desde WAMPSERVER, lo que hacía que mi ruta MYSQL fuera asi:
“http://localhost:3306/”
Osea, en el txtURL se debería colocar http://localhost y en txtPort 3306
Supongo que será la misma… pero si no funciona debe ser porque al momento de instalarlo (sea cual sea el programa que instaló el Servidor MYSQL) lo fijó en otro puerto.
Saludos!
sep 15, 2009 @ 14:41:55
ok…gracias!!! mi mysql que instale lo tengo en C:archivos de programa…etc etc pero mi conexion la hago con jdbc y mi url es jdbc:mysql://localhost:3306 y en la caja de texto del programa solo pongo localhost, pero la verdad ya hasta probe de todas formas y no me da y otra pregunta como hacerle para que en lugar de que me muestre una sola bd , me muestre todas las que tengo en mi manejador help… gracias!!!!!!!!!!
sep 15, 2009 @ 17:49:22
Hola de nuevo Erika, bueno mira, yo cometí un error en la respuesta anterior… simplemente se coloca localhost sin el “http://”, puesto que como está en el código, toma esa cadena (la de la caja de texto) para armar la url completa con puerto y todo como se ve en esta linea de código:
Connection c = DriverManager.getConnection(“jdbc:mysql://”+txtURL.getText() +“:”+ txtPort.getText(),txtUsuario.getText(), txtPassword.getText());
Donde al armar la URL completa, quedaría más o menos así:
http://localhost:3306,El usuario, El password.
Cosa que tu en el GUI sólo ingresaste lo que está de azul… con lo que sólamente bastaría colocar localhost y 3306 o el puerto que se haya fijado…
Si es que por alguna razón no te sale… quizás pueda deberse a que no importaste la librería MySQL (en caso te hayas descargado el proyecto de aca o estes creando uno nuevo en NetBeans)… porque si más no recuerdo, las librerías se deben re-importar… de todas maneras, chequea mas o menos por donde está la 3era imagen, ahí dice como importar la librería de conexión a MySQL.
Para verificar puedes capturarlo en una Exception genérica (con Try-Catch) para ver a que se debe, si sale: “Class Not Found”, es debido a que no hay librería de conexion.
Ahora con respecto a tu otra pregunta, el procedimiento es simple, todo es cosa de jugar con los elementos que ahi se ponen, es decir, en vez de colocar esa sentencia en el ResultSet r, colocale otra adecuandola a tus bases de datos, y luego más abajo juega con las variables dentro del While , otra cosa podría ser el declarar mas controles para que desde el GUI se pueda ingresar el nombre de la base de datos y poder mostrarla… algo asi:
BaseDeDatos = txtBD.getText();
ResultSet r = s.executeQuery(“Select * from “+BaseDeDatos);
Donde txtBD es el control en el GUI, como una caja de texto por ejemplo, y BaseDeDatos la variable (String) que se saca a partir de lo que ingreso el usuario, suponiendo claro que el usuario elija el nombre de la base de datos… luego en el while vas jugando con tus variables hasta que salga adecuadamente… finalmente lo muestras fuera del While (en el control de abajo si es que quieres seguir como en el ejemplo), sin olvidar ir almacenando los resultados del While en una variable String (como cuando almacenas contadores en este estilo: c= c+1;)
Uff… me alargue mucho jejeje… pero espero me hayas entendido =P, y si no, puedes seguir preguntando… Personalmente coloqué el ejemplo lo mas básico que se pudo, pero no es algo que deba seguirse al pie de la letra, puedes variarlo o acomodarlo a tu gusto, las posibilidades son infinitas para una conexión entre Java y MySQL…
Saludos!!
sep 16, 2009 @ 18:09:11
hola!! soy yo otra vez ,Muchas gracias!!!… ya hice eso y mi aplicacion corrio ya me muestra todas las bases de datos que tengo en mysql, la explicacion que me diste fue de gran ayuda!! GRACIAS!!! pero ahora a mi aplicacion pondre otro apartado , en el cual funcionara asi: ya que me muestre todas mis bases de datos en un combo tengo que seleccionar una bd y ya que la seleccione pues me debe de mostrar todas sus tablas y mi PREGUNTA que si existe un componente o funcion que me permita arrastras tablas de mi base de datos y al momento de arrastrar la tabla seleccionar los campos que quiero para formar una consulta…..gracias!!!!!!!!!!!!!! y saludos!!
sep 19, 2009 @ 20:47:03
Mmmm…. bueno… primero que nada déjame decirte te felicito por haber logrado que haya corrido tu aplicación… es bueno aprender estas cosas… serviran en un futuro… ahora que, el componente que me detallas… pues como que ya es algo mucho más avanzado… que yo sepa de primera mano no existe tal componente… (o al menos no lo conozco) pero quizás si se logre con JavaFX … o sin irnos muy lejos, alguna librería de 3era generación… pero como te digo, eso último que pides ya es muy complejo y cosa de diseño y por el estilo… aunque no imposible eh!…pero bueno… espero te haya servido este post…
Saludos!!!
sep 24, 2009 @ 17:16:53
OK GRACIAS POR LA AYUDA ME SIRVIO MUCHISIMO!!! Y ESPERO QUE MI APLICACION QUEDE COMPLETA…. GRACIAS POR TODO!! CUIDATE Y SALUDITOS
mar 26, 2010 @ 23:28:03
hola buenas tardes, disculpa tengo unas cuantas preguntas respecto a esto, ya lo hice pero no corre, por fis podrias responderme a mi correo?? te lo agradeceria mucho
mar 27, 2010 @ 00:04:00
@Dania, pregunta por aqui nomas, will respondera con gusto! =D, si no responde me avisas pa descontarle el sueldo u_U
dic 30, 2010 @ 14:58:39
Muy buen tutorial, aunque un poco tarde las felicitaciones. Sigan asi chicos y recuerden … El conocimiento siempre debe ser open source para mejorar nuestra calidad de vida.
feb 11, 2011 @ 00:18:04
amigazoo muy wenoo … asi se aprende mucho .
Por otro lado ,las 5 primeras imagenes no aparecen :S probe en chrome y explorer… pero na… derrpnt puedes arreglarlo…o nose xq no puedo verlas….todo muy bueno… sigamos aprendiendo
feb 11, 2011 @ 22:24:47
Pafian, muchas gracias por hacernos saber del error, en efecto estaban con las imagenes mal linkeadas, las disculpas del caso y gracias de nuevo , un saludo