Loveless, único en su especie

El blog de un programador que se mata de risa de los comentarios que le hagan

Formulario de acceso con Java y MySQL

Hola a todos, lo que vamos a hacer ahora es un formulario de login (¿si saben lo que es “login”, no?) desarrollado totalmente en Java, y para validar el acceso haremos uso de una base de datos MySql.

Para empezar, contarte que para poder realizar este ejemplo necesitas lo siguiente:

  1. Una plataforma de desarrollo en Java: sea Eclipse, sea Netbeans, pero por favor para este ejemplo usa Eclipse. Estoy seguro que los que no usan cualquiera de las dos aplicaciones anteriormente descritas para programar en Java son gays, pero tienen el pene más grande y en su caso los ovarios bien puestos aquellos y aquellas que desarrollan con Eclipse.
  2. Gestor de base de datos MySql: No importa si formó parte de la instalación de AppServ, XAMPP, LAMPP, WAMPP, etc.; preferentemente quisiera que tuvieras instalado únicamente el gestor, pero estos funcionan y son totalmente válidos, así que no me quejo.
  3. Tu cerebro.
  4. No ser reguetonero ni escuchar mierda como Moderatto, Miranda!, Tony Dize,  ADAMMO, Chino y Nacho, Erick Elera, Tommy Portugal, y todo cantante o grupo que produzca materia fecal en vez de música.

Bueno, yendo al grano, empezamos creando el proyecto en Eclipse (si ya tienes experiencia con Eclipse puedes saltarte este paso, pero si no la tienes y lo saltas morirás):

Crear proyecto Java en Eclipsebr />

Con el nombre: EjemploLogin (en realidad puede ser el nombre que ustedes quieran), luego hacemos click en “Finish” (por ahora no haremos click en el botón “Next >” porque por el momento no nos interesa).

Cuadro de diálogo Crear proyecto

Ahora bien, para poder realizar un buen trabajo necesitamos agregar un archivo .jar necesario para poder conectarnos al gesto MySql que tengamos instalado. En este caso hago uso del mysql-connector-java, el cual lo puedes descargar desde aquí.

Para agregar dicho conector primero haremos anti-click en el directorio de nuestro proyecto, y seleccionamos la opción “Build Path” y luego “Configure Build Path…”, de esta forma:

Configure Build Path...

Se nos abrirá el siguiente cuadro de diálogo:

Ventana Propiedades del proyecto

Seleccionamos la pestaña “Libraries” (por si no está seleccionada), y haremos click en el botón “Add External JARs…”, y luego exploramos hasta encontrar la ubicación del conector que acabamos de descargar, y le hacemos doble-click al archivo .jar.

Seleccionar conector MySQL

De esta manera se añaden archivos .jar al proyecto. La finalidad de esto es obvia: sin este archivo no podríamos conectar a MySql, en otras palabras, lo que acabamos de agregar es un driver de conexión.
Muy bien, empezaremos luego a crear los paquetes necesarios para una mejor organización de nuestro código, separando de esta manera las clases de conexión y manejo de datos con las de interfaz gráfica de usuario, simplemente haciendo anti-click en el directorio “src” del proyecto, seleccionamos “New” y luego hacemos click en “Package”.

Paquetes creados

Así debe quedar.

Llegados hasta ahí, iremos a la consola o interfaz gráfica que tengamos para crear nuestra base de datos en MySql. El código es el siguiente:

Código:

CREATE DATABASE bd_samplelogin;
USE bd_samplelogin;
CREATE TABLE `tm_usuario` (
`tm_idusuario` int (11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`tm_login` varchar (50),
`tm_password` varchar (38) 
);

A la tabla “tm_usuario” le añadirás los usuarios y las claves que te apetezcan.
Ahora bien, volviendo a Eclipse, agregamos al paquete isma.db una clase para conectarnos a la base de datos:

Código:

package isma.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnection {   
	static String bd = "bd_samplelogin";   
	static String login = "root";   
	static String password = "";   
	static String url = "jdbc:mysql://localhost/" + bd;   
	Connection conn = null;   
	public DbConnection() {      
		try {        
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, login, password);
		}
		catch(SQLException e){
			System.out.println(e);
		}
		catch(ClassNotFoundException e){
			System.out.println(e);
		}
	}
	public Connection getConnection(){
		return conn;
	}
	public void desconectar(){
		conn = null;
	}
}

Y agregamos otra para interactuar con la tabla “tm_usuario”:

Código:

package isma.db;
import java.sql.*;

public class DbUsuario {
	DbConnection cn;
	public DbUsuario() {
		cn = new DbConnection();
	}
	public Object[][] UsuarioAcceder(String login, String password){
		int registros = 0;
		try {
			PreparedStatement pstm = cn.getConnection().prepareStatement("SELECT count(1) as cont" +
			" FROM tm_usuario");
			ResultSet res = pstm.executeQuery();
			res.next();
			registros = res.getInt("cont");
			res.close();
		}
		catch(SQLException e){
			System.out.println(e);
		}
		Object [][] data = new Object[registros][3];
		if (login.length() != 0 && password.length() != 0){
			int usu_id;
			String usu_login = "";
			String usu_password = "";
			try {
				String strsql = "";
				strsql = "SELECT * FROM tm_usuario WHERE tm_login = '" + login + "' AND tm_password = '" + password + "'";
				PreparedStatement pstm = cn.getConnection().prepareStatement(strsql);
				ResultSet res = pstm.executeQuery();
				int i = 0;
				while(res.next()){
					usu_id = res.getInt("tm_idusuario");
					usu_login = res.getString("tm_login");
					usu_password = res.getString("tm_password");
					data[i][0] = usu_id;
					data[i][1] = usu_login;
					data[i][2] = usu_password;
					i++;
				}
				res.close();
			}
			catch(SQLException e){
				System.out.println(e);
			}
		}
		return data;
	}
}


La clase “DbUsuario” contiene (como podrán haber visto) una función llamada “UsuarioAcceder”, la cual recibirá dos parámetros: el usuario y la clave de acceso.

Si el usuario y la clave no se encuentran al momento de realizarse la consulta, o los datos ingresados son incorrectos, o simplemente no existen en la base, por lo tanto al objeto de array bidimensional “data” no se le asignará valores, y si se les asignará cuando los datos sean correctos.
No hay mucho que comentar sobre el anterior código, salvo indicar que la consulta anterior a la del acceso sirve para definir la cantidad de ítems que contendrá inicialmente la variable “data”, ya que en Java los arrays de objetos deben ser inicializados antes de ser usados.

Definamos ahora la estructura del formulario principal (es decir, hacia donde queremos acceder). Para esto agregamos una clase en el paquete isma.gui. El formulario va a tener como aditivo a este ejemplo una barra de menú:

Código:

package isma.gui;

import java.awt.event.*;
import javax.swing.*;

public class frmMain extends JFrame {
	private static final long serialVersionUID = 1L;
	private JMenuBar barramenu;
	public frmMain()
	{
		super("SISTEMA EJEMPLO LOGIN");
	}
	
	public void mostrarForm(boolean mostrar){
		if (mostrar == true){
			barramenu = new JMenuBar(); 
			JMenu menuArchivo = new JMenu("Configuración y Mantenimiento");
			menuArchivo.setMnemonic('C');
						
			JMenuItem itemAcerca = new JMenuItem("Acerca de...");
			itemAcerca.setMnemonic('A');
			menuArchivo.add(itemAcerca);
			itemAcerca.addActionListener(
					new ActionListener() {
						public void actionPerformed(ActionEvent evento)
						{
							JOptionPane.showMessageDialog(frmMain.this,
									"Ejemplo Login",
									"Acerca de", JOptionPane.INFORMATION_MESSAGE);
						}
					} 
			);
			JMenuItem itemSalir = new JMenuItem("Salir");
			itemSalir.setMnemonic('S');
			menuArchivo.add(itemSalir);
			itemSalir.addActionListener(
					new ActionListener(){
						public void actionPerformed(ActionEvent evento)
						{
							System.exit(0);
						}
					}
			);
			barramenu.add(menuArchivo);  
			setJMenuBar(barramenu);
			setSize(1022, 700);
			setLocationRelativeTo(this.getParent());
			setVisible(mostrar);
			setDefaultCloseOperation(EXIT_ON_CLOSE);
		}
	}
}


La función “mostrarForm” nos servirá para controlar cuando queremos que el formulario principal aparezca. En este caso es preciso que aparezca justo después de comprobar que los datos ingresados en el formulario de login sean correctos.

Ahora la estrella de este artículo:

Código:

package isma.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import isma.db.*;

public class frmLogin extends JFrame {
	private static final long serialVersionUID = 1L;
	private JTextField txtusuario;
	private JPasswordField txtpassword;
	private JButton btnAceptar, btnCancelar;
	private JLabel lblusuario, lblpassword;
	private Container contenedor;
	private GridLayout cuadricula1;
	public frmLogin()
	{
		super("Acceso al Sistema");
		cuadricula1 = new GridLayout(3, 3, 10, 10);
		
		lblusuario = new JLabel("Usuario:");
		lblpassword = new JLabel("Clave:");
		
		txtusuario = new JTextField(10);
		txtpassword = new JPasswordField(10);
		
		btnAceptar = new JButton("Aceptar");
		btnAceptar.setMnemonic('A');
		ImageIcon imgAceptar = new ImageIcon("img/user_go.png");
		btnAceptar.setIcon(imgAceptar);
		
		btnCancelar = new JButton("Cancelar");
		btnCancelar.setMnemonic('C');
		ImageIcon imgCancelar = new ImageIcon("img/sign_cancel.gif");
		btnCancelar.setIcon(imgCancelar);
		
		contenedor = getContentPane();
		contenedor.setLayout(cuadricula1);
		contenedor.add(lblusuario);
		contenedor.add(txtusuario);
		contenedor.add(lblpassword);
		contenedor.add(txtpassword);
		contenedor.add(btnAceptar);
		contenedor.add(btnCancelar);
		
		btnAceptar.addActionListener( 
			new ActionListener()
			{
				@SuppressWarnings("deprecation")
				public void actionPerformed(ActionEvent evento)
				{
					DbUsuario user = new DbUsuario();
					frmMain principal = new frmMain();
					
					String usuario;
					String clave;
					
					usuario = txtusuario.getText();
					clave = txtpassword.getText();
					
					try {
						Object[][] itemUsuario = user.UsuarioAcceder(usuario, clave);
						String x_iduser = itemUsuario[0][0].toString();
						String x_user = itemUsuario[0][1].toString();
						String x_pass = itemUsuario[0][2].toString();
						if ((x_user != "") && (x_pass != ""))
						{
							JOptionPane.showMessageDialog( frmLogin.this,
									"Bienvenido al sistema usuario: " + x_user + ", con id: " + x_iduser,
									"Acerca de", JOptionPane.INFORMATION_MESSAGE );
							principal.mostrarForm(true);
							principal.setLocationRelativeTo(principal.getParent());
							dispose();
						}
					}
					catch(Exception e){
						JOptionPane.showMessageDialog( frmLogin.this,
								"Usuario o contraseña incorrecto",
								"Acerca de", JOptionPane.ERROR_MESSAGE );
					}
				}
			}
		);
		
		btnCancelar.addActionListener(
			new ActionListener() {
				public void actionPerformed( ActionEvent evento )
				{
					System.exit(0);
				}
			}
		);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setSize(300, 150);
		setVisible(true);
		setLocationRelativeTo(this.getParent());
	}
}


Lo interesante de este formulario es lo siguiente:

  1. Importación del paquete “isma.db”: import isma.db.*;
  2. Los botones tienen imágenes vistosas como iconos.
  3. Las variables de usuario y contraseña que recogen los datos de la función “UsuarioAcceder” serán asignadas siempre y cuando se compruebe que la autenticación sea correcta.

Y para terminar, una clase que ejecute todo en el terminal principal:

Código:

package isma.gui;
import javax.swing.*;

public class EjemploLogin {
	public static void main( String args[] )
	{
	    JFrame.setDefaultLookAndFeelDecorated(true);
	    try {
	    	UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		}
		catch (Exception e){   
			System.out.println(e);
		}
		frmLogin aplicacion = new frmLogin();
		aplicacion.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
	} 
}

Fíjense en la siguiente línea:
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
Esto define el tema visual de la aplicación, es decir, tu aplicación en Java pasa de esto:
Feo

A esto:

Bonito XD

Sin punto de comparación.
Si quieres puedes borrarlo (ojo: todo el try), pero sinceramente te habrás dado cuenta que queda estupendo.

Ahora sólo nos queda correr nuestra aplicación, para eso tecleamos Ctrl + F11:

En ejecución

Listo

Y eso ha sido todo damas y caballeros, muy pronto más ejemplos con Java, y muchas sorpresas.

Nota: Los iconos de los botones del formulario "frmLogin" se encuentran en el archivo descargable de la parte inferior de estas líneas.


Descargar

Descargar ejemplo


Descargar

Descargar Eclipse

¿Dudas? Escríbeme a lovelessisma@gmail.com

13 Responses to Formulario de acceso con Java y MySQL

  1. Gustavo marzo 10, 2011 a las 6:27 am

    Muy agradecido por tu aporte, muy bien explicado. Muy seguramente estare haciendo unas preguntas en estos dias cuando lo implemente.

    Gracias

  2. cholemon noviembre 10, 2011 a las 9:06 am

    Gracias pana..!!! me servirá de mucho este ejemplo…te agradezco si puedes seguir subiendo + ejemplillos….saludos desde venezuela..!!!

  3. Javier Garay noviembre 22, 2011 a las 4:18 pm

    Si, al momento de crear la tabla de la base de datos experimentan problemas, deben sacar las cremillas de la sintaxis sql. Queda asi:

    CREATE TABLE tm_usuario (tm_idusuario int (11) PRIMARY KEY NOT NULL AUTO_INCREMENT, tm_login varchar (50), tm_password varchar (38));

  4. J@Ne diciembre 1, 2011 a las 11:18 am

    Muy buen aporte, me ayudo mucho, gracias!!

  5. jacobo enero 16, 2012 a las 7:05 pm

    Muchisimas gracias.
    Excelente tutorial, gracias por compartir

  6. julio rojas febrero 13, 2012 a las 11:01 pm

    excelente .. gracias …

  7. angel marzo 23, 2012 a las 11:45 pm

    Como seria con postgressql. instente con eso pero me retorna contraseña incorrecta.

  8. angel marzo 24, 2012 a las 10:38 am

    La contraseña es correcta, hace conexion cuando corro solo isma.db, pero cuando cargo el formulario de login, solo muestra contraseña incorrecta. Java: 1.7.0_03, parece que en btnaceptar me esta fallando algo pero no me salta errores.

  9. angel marzo 24, 2012 a las 10:51 am

    este me aparese,
    org.postgresql.util.PSQLException: ERROR: no existe la relación «l_usu»
    Position: 30
    porque hasta aqui llega bien.
    while(res.next()){
    usu_id = res.getInt(“l_idu”);
    usu_login = res.getString(“l_usu”);
    usu_password = res.getString(“l_pas”);

  10. angel marzo 27, 2012 a las 10:46 pm

    bueno parece que esta dando, no se como pero por el momento funciona. te quería hacer una consulta.
    tengo un Jframe en el cual dentro tengo una toolbar e intento llamar a un jinternalframe lo jala pero cuando aparece me minimiza el jframe. y lo tengo maximizado por defecto. por decirlo mejor. que puede hacer para que se conserve maximizado.

    te agradecería. gracias por la ayuda

  11. atreyu mayo 5, 2012 a las 8:16 pm

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver me sale eso y no me kiero jakra los usuarios ni contras que tengo en mi base de datos

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.