8 de febrero de 2013

ACME con JAVA-MySQL con GUI NetBeans

Creando la Java Application
En este ejemplo haremos un buscador de datos de un empleado, también ingresaremos nuevos datos, modificaremos datos existentes y eliminaremos datos de un empleado desde una base de datos en MySQL utilizando NetBeans 7.2.1, para conectarnos a la base de datos MySQL utilizaremos el connector MySQL, en caso no sepan como, les dejo este link de una entrada de este blog en que se explica como conectarse
http://pabletoreto.blogspot.com/2013/01/conectar-java-con-mysql.html

Lo primero sera crear nuestro proyecto, en mi caso hice un nuevo paquete y le nombre acme y agregue un formulario(JFrame Form) que igualmente se llame acme, pero ustedes pueden de una agregar el formulario en el paquete que por defecto se agrega al crear el formulario(aunque NetBeans advierta que no es lo mas conveniente, pero para este ejemplo da igual), a mi me quedo así:

Diseñando el JFrame Form
Ahora vamos con el diseño del formulario que se va utilizar, en cada JTextField utilizado va el nombre asignado


Importar librerias y declarar variables necesarias
Como ven hay siete botones y manejaremos eventos para cada uno de ellos, para empezar importaremos las librerías necesarias y definiremos las variables a utilizar y en el constructor les daremos valores, ahorita verán una llamada al método deshabilitar, lo explico mas abajo y mi base de datos se llama empleado y estoy trabajando en mi maquina, así que hago una llamada a Localhost, recuerden que si no saben como conectarse a MySQL vayan al link: http://pabletoreto.blogspot.com/2013/01/conectar-java-con-mysql.html

package acme;
import java.sql.*;
import javax.swing.table.*;

public class ACME extends javax.swing.JFrame {

    String url;
    String user;
    String pass;
    Connection cnn;
    DefaultTableModel modelo;
    
    public ACME() {
        
        initComponents();
        deshabilitar();
        user="root";
        pass="root";
        url="jdbc:mysql://localhost/empleado";
        cnn=null;
    }

Ahora vienen los métodos habilitar y deshabilitar, son de lo mas común  lo que hacen es que al aparecer el formulario por primera vez, solo tiene opción de escribir en el JText Field: txtCodigo para buscar un empleado en especifico según su código de empleado y al encontrarlo se habilitaran todos los demas JText Field, al principio están habilitados los botones

void deshabilitar(){
        txtEmpleado.setEnabled(false);
        txtDepartamento.setEnabled(false);
        txtCargo.setEnabled(false);
        txtJefe.setEnabled(false);
    }
    
    void habilitar(){
        txtEmpleado.setEnabled(true);
        txtDepartamento.setEnabled(true);
        txtCargo.setEnabled(true);
        txtJefe.setEnabled(true);
    }

Botones New y Close
Ahora vamos con el evento del botón New y del botón Close que lo que hará al dar click sobre New es habilitar todos los JTextFields y el botón Cerrar el es que cierra el formulario:

private void BNewActionPerformed(java.awt.event.ActionEvent evt) {                                     
        habilitar();
    }


private void BotonCloseActionPerformed(java.awt.event.ActionEvent evt) {
        this.dispose();
    }

Metodos para la conexion y desconexion hacia la base de datos en MySQL
Ahora vamos con la parte mas importante de todas, el método Conectar que nos permite conectarnos con la base de datos, este es el método que lo hace, al igual mas abajo esta el método Desconectar que simplemente cierra la conexión

private void Conectar(){
          try{
              Class.forName("com.mysql.jdbc.Driver").newInstance();
              cnn=DriverManager.getConnection(url,user, pass);
              }catch(Exception ex){
          setTitle(ex.getMessage());
          }
      }
      
      private void Desconectar(){
          try{
              cnn.close();
          }catch(SQLException sqlex){
          setTitle(sqlex.getMessage());
          }
      }

Busqueda de datos segun codigo de empleado
Listo, vamos ahora con la búsqueda de datos de un empleado según un código especifico, lo que se debe hacer es escribir el código en el txtcodigo y la búsqueda se realizara al dar click sobre el botón Buscar Empleado, utilizaremos PreparedStatement y en caso de encontrar información de empleado según el código que se pida, esta se mostrara en los JtextFields correspondientes, aquí esta el código en JAVA todo dentro de un Try-Catch

private void BotonOkActionPerformed(java.awt.event.ActionEvent evt) {                                        
     Conectar();
        try{
        PreparedStatement psmt=cnn.prepareStatement("select * from registro where codigo=?");
        psmt.setString(1, txtCodigo.getText());
        ResultSet rs= psmt.executeQuery();
        if(rs.next()){
        habilitar();
        txtEmpleado.setText(rs.getString(2));
        txtCargo.setText(rs.getString(3));
        txtDepartamento.setText(rs.getString(4));
        txtJefe.setText(rs.getString(5));        
        }else{
        this.setTitle("No se encontraron registros !!!");
        deshabilitar();
        }}catch(Exception ex){
    setTitle(ex.getMessage());
    }finally{
    Desconectar();}
    }

Ingresar nuevos datos de empleado
Listo, vamos ahora a agregar los datos de un nuevo empleado, lo que se hará es tomar la información de los JTextFields y preparar la consulta utilizando Preparedstatement para luego ingresar esos datos en la base de datos, aquí esta el código en JAVA todo dentro de un Try-Catch

private void BAgregarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Conectar();
        int resultado;
        try{
            cnn=DriverManager.getConnection(url, user, pass);
            PreparedStatement psmt= cnn.prepareStatement("insert into registro(nombres, cargo, departamento, jefe)"
                    + "values(?,?,?,?)");
            psmt.setString(1, txtEmpleado.getText());
            psmt.setString(2, txtCargo.getText());
            psmt.setString(3, txtDepartamento.getText());
            psmt.setString(4, txtJefe.getText());
        resultado=psmt.executeUpdate();
        if(resultado==1){setTitle("Registro ingresado exitosamente !!!");}
        else{setTitle("Registro no fue ingresado");}
        }catch(SQLException sqlex){setTitle(sqlex.getMessage());}
        catch(Exception ex){setTitle(ex.getMessage());}
        finally{
        Desconectar();
        }
    }

Actualizar los datos de empleado segun codigo
Ahora vamos a actualizar la información de un empleado según su código  de nuevo tomaremos los datos desde los JTextfield y se preparara la consulta con un PreparedStatement para luego solo modificar los datos, aquí esta el código en JAVA todo dentro de un Try-Catch

private void BModificarActionPerformed(java.awt.event.ActionEvent evt) {                                           
Conectar();
int resultado;
try{
    cnn=DriverManager.getConnection(url, user, pass);
    PreparedStatement psmt=cnn.prepareStatement("update registro set nombres=?, cargo=?, departamento=?, jefe=? where codigo=?");
    psmt.setString(1, txtEmpleado.getText());
    psmt.setString(2, txtCargo.getText());
    psmt.setString(3, txtDepartamento.getText());
    psmt.setString(4, txtJefe.getText());
    psmt.setString(5, txtCodigo.getText());
    resultado=psmt.executeUpdate();
if(resultado==1){setTitle("Registro actualizado exitosamente !!!");}
else{setTitle("Registro no fue actualizado");}
}catch(SQLException sqlex){setTitle(sqlex.getMessage());}
catch(Exception ex){setTitle(ex.getMessage());}
finally{Desconectar();}
    }

Eliminar los datos de empleado segun codigo
Toca eliminar datos de un empleado según sea el código correspondiente, aquí esta el código en JAVA, todo dentro de un Try-Catch

private void BEliminarActionPerformed(java.awt.event.ActionEvent evt) {                                          
Conectar();
int resultado;
try{
cnn=DriverManager.getConnection(url, user, pass);
PreparedStatement psmt=cnn.prepareStatement("delete from registro"
        + " where codigo=?");
psmt.setString(1, txtCodigo.getText());
resultado=psmt.executeUpdate();
if(resultado==1){setTitle("Registro eliminado exitosamente !!!");}
else{setTitle("Registro no fue eliminado");}
}catch(SQLException sqlex){setTitle(sqlex.getMessage());}
catch(Exception ex){setTitle(ex.getMessage());}
finally{Desconectar();}
    }

Presentar los datos de los empleados en JTable
También como puede verse en el formulario creado hay una JTable, esa la llenaremos al dar click sobre el botón Cargar Tabla y utilizaremos ResultSet y ResultSetMetaData, la tabla no tiene nada al principio, es decir, quitenle las columnas y filas que trae por defecto y déjenla "limpia", el código JAVA se muestra a continuación:

private void BcargarTablaActionPerformed(java.awt.event.ActionEvent evt) {                                             
        Conectar();
            modelo= new DefaultTableModel();  
        try{
            Statement smt=cnn.createStatement();
            ResultSet rs= smt.executeQuery("select * from registro");
            ResultSetMetaData md=rs.getMetaData();
            int columnas= md.getColumnCount();
            for (int i = 1; i <= columnas; i++) {
            modelo.addColumn(md.getColumnLabel(i));}
            while(rs.next()){
            Object[] fila = new Object[columnas];
            for (int i = 0; i < columnas; i++) {fila[i]=rs.getObject(i+1);}
            modelo.addRow(fila);
            fila=null;
            }
            tablita.setModel(modelo);
        }catch(SQLException sqlex){
        setTitle(sqlex.getMessage());
        }finally{
        Desconectar();
        }
    }

Main y variables del JFrame Form
El main del formulario y la declaracion de variables me queda asi

public static void main(String args[]) {
       
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ACME.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ACME.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ACME.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ACME.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
    private javax.swing.JButton BAgregar;
    private javax.swing.JButton BEliminar;
    private javax.swing.JButton BModificar;
    private javax.swing.JButton BNew;
    private javax.swing.JButton BcargarTabla;
    private javax.swing.JButton BotonClose;
    private javax.swing.JButton BotonOk;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTable jTable1;
    private javax.swing.JTable jTable2;
    private javax.swing.JTable tablita;
    private javax.swing.JTextField txtCargo;
    private javax.swing.JTextField txtCodigo;
    private javax.swing.JTextField txtDepartamento;
    private javax.swing.JTextField txtEmpleado;
    private javax.swing.JTextField txtJefe;
    // End of variables declaration                   
}


Eso es todo el código, ustedes lo van uniendo en su aplicación según lo necesiten.