15 de febrero de 2013

ACME con JAVA-MySQL sin GUI NetBeans

Este ejemplo se trabaja sobre el NetBeans IDE 7.2.1 y sobre la base de datos: empleado, tabla: registro en MySQL, al referirme a que no tendrá GUI es que no se diseñara una interfaz gráfica o JFrame Form, sino que los registros a ingresar, a modificar, a eliminar o seleccionar estarán en el Main de la aplicación debidamente definidos por el programador y se mostraran en consola tanto los datos de la tabla registro después de realizar las acciones sobre ella asi como mensajes que verifiquen que nuestra acción se ha realizado correctamente o incorrectamente.

Conexión Java-MySQL
Lo primero sera crear una nueva aplicacion en Java utilizando NetBeans tal como se muestra:


y de nombre le especificamos ACME_noGUI y luego presionamos Finish para empezar a trabajar


Lo primero a realizar sera importar la libreria de MySQL, si tienes alguna duda de como conectar Java con MySQl  mediante el conector mira esta entrada:
http://pabletoreto.blogspot.com/2013/01/conectar-java-con-mysql.html
esta otra forma utilizando la clase MysqlDataSource puede parecerte igualmente interesante:
http://pabletoreto.blogspot.com/2013/02/otra-forma-de-conectarse-una-base-de.html


Nos conectaremos a MySQL a la base de datos empleado y a la tabla registro que tiene los siguientes campos que utilizaremos:


Librerías y variables necesarias.
Lo del orden es relativo, pero al menos a mi me pareció mas ordenado el declarar todas las variables que iba a utilizar con su respectivo valor, no están dentro de un constructor porque las declare estáticas  esto porque se utilizan dentro de métodos estáticos, porque? porque todas las invocaciones a los métodos se realizan desde el Main de la aplicación el cual es Static, aquí esta el código en que se importa la librería necesaria y se declaran las variables que se utilizaran en la aplicación.

package acme_nogui;
import java.sql.*;

public class ACME_noGUI {

    static String url="jdbc:mysql://localhost/empleado";
    static String user="root";
    static String pass="root";
    static Connection cnn;
    static String mostrar="select * from registro";
    static String agregar="insert into registro(nombres, cargo, departamento, jefe)"
            + "values(?,?,?,?)";
    static String modificar="update registro set nombres=?, cargo=?, departamento=?, jefe=?"
                + "where codigo=?";
    static String eliminar="delete from registro where codigo=?";

Conexión a la base de datos.
El método para conectarse a la base de datos se llama Connectar y aquí utilizamos Class.forName que nos sirve para asegurarnos que el Driver se inicializa y se registra, luego solo pediremos una conexión a la clase DriverManager mediante su método getConnection al cual le pasamos tres parametros: url, user y pass, todo nuestro código va dentro de un Try-Catch, también se incluye el método estático Desconnectar.

public static void Connectar(){
        try{
    Class.forName("com.mysql.jdbc.Driver");
    cnn=DriverManager.getConnection(url, user, pass);
          }catch(ClassNotFoundException cnfex){
          System.out.println("Connectar:" +cnfex.getMessage());
          }catch(SQLException sqlex){
           System.out.println("Connectar:" +sqlex.getMessage());   
          }catch(Exception ex){
           System.out.println("Connectar:" +ex.getMessage());
          }}
    
    public static void Desconnectar(){
        try{
        cnn.close();
        }catch(SQLException sqlex){
        System.out.println("Desconnectar:" +sqlex.getMessage());
        }catch(Exception ex){
        System.out.println("Desconnectar:" +ex.getMessage());
        }}

Mostrando todos los datos dela tabla registros.
Para mostrar todos los datos de la tabla registro se utiliza el método MostrarDatos() que simplemente realiza una consulta select sobre la tabla, utilizamos Statement para realizar la consulta y ResultSet para mostrar los datos en consola, todo dentro de un Try-Catch e invocando los metodos Connectar y Desconnectar.

public static void MostrarDatos(){
    try{
        Connectar();
        Statement smt=cnn.createStatement();
        ResultSet rs=smt.executeQuery(mostrar);
        while(rs.next()){
        System.out.println("Codigo:        \t\t" +rs.getInt(1));
        System.out.println("Empleado:      \t\t" +rs.getString(2));
        System.out.println("Cargo:         \t\t" +rs.getString(3));
        System.out.println("Departamento:  \t\t" +rs.getString(4));
        System.out.println("Jefe:          \t\t" +rs.getString(5));
        }
        rs.close();
        smt.close();
    }catch(SQLException sqlex){
    System.out.println(sqlex.getMessage());
    }catch(Exception ex){
    System.out.println(ex.getMessage());    
    }finally{
    Desconnectar();
    }}

Ingresando datos a la tabla registros.
El método para ingresar datos a la tabla registro se llama AgregarDatos() y se utiliza un PreparedStatement para organizar mejor la consulta y un entero que nos indica si se ha realizado una acción sobre la base de datos, en caso de ser 1 se presenta un mensaje que indica que se ha realizado la acción de insertar datos sobre la tabla registros y se invoca al método MostarDatos() para que podamos ver en consola todos los datos de la tabla registro después de haber ingresado un nuevo empleado, cerrando durante el código el PreparedStatement y cerrando la conexión al invocar al método Desconnectar().

public static void AgregarDatos(String nombres, String cargo,
            String departamento, String jefe){
    int Resagregar;
  try{
            Connectar();
            PreparedStatement psmt=cnn.prepareStatement(agregar);
            psmt.setString(1, nombres);
            psmt.setString(2, cargo);
            psmt.setString(3, departamento);
            psmt.setString(4, jefe);
            Resagregar= psmt.executeUpdate();
            if(Resagregar==1){
            System.out.println("Datos Agregados Correctamente !!!");
            MostrarDatos();
            }else{
            System.out.println("Datos no se agregaron");
            }
            psmt.close();
        }catch(SQLException sqlex){
            System.out.println("AgregarDatos:" +sqlex.getMessage());
        }catch(Exception ex){
            System.out.println("AgregarDatos:" +ex.getMessage());
        }finally{
           Desconnectar();  
        }}

Modificando datos de la tabla registros.
El método El método para ingresar datos a la tabla registro se llama ModificarDatos() y se utiliza un PreparedStatement para organizar mejor la consulta y un entero que nos indica si se ha realizado una acción sobre la base de datos, en caso de ser 1 se presenta un mensaje que indica que se ha realizado la acción de modificar datos sobre la tabla registros y se invoca al método MostarDatos() para que podamos ver en consola todos los datos de la tabla registro después de haber modificado un empleado segun su codigo, cerrando durante el código el PreparedStatement y cerrando la conexión al invocar al método Desconnectar().

public static void ModificarDatos(int codigo, String nombres, String cargo,
            String departamento, String jefe){
    int Resmodificar;
  try{
            Connectar();
            PreparedStatement psmt=cnn.prepareStatement(modificar);
            psmt.setString(1, nombres);
            psmt.setString(2, cargo);
            psmt.setString(3, departamento);
            psmt.setString(4, jefe);
            psmt.setInt(5, codigo);
            Resmodificar= psmt.executeUpdate();
            if(Resmodificar==1){
            System.out.println("Datos Modificados Correctamente !!!");
            MostrarDatos();
            }else{
            System.out.println("Datos no se modificaron");
            }
            psmt.close();
        }catch(SQLException sqlex){
            System.out.println("ModificarDatos:" +sqlex.getMessage());
        }catch(Exception ex){
            System.out.println("ModificarDatos:" +ex.getMessage());
        }finally{
           Desconnectar();  
        }}

Eliminando datos de la tabla registros.
El método para eliminar los datos de un empleado especificado segun su codigo de la tabla registro se llama EliminarDatos() y se utiliza un PreparedStatement para organizar mejor la consulta y un entero que nos indica si se ha realizado una acción sobre la base de datos, en caso de ser 1 se presenta un mensaje que indica que se ha realizado la acción de eliminar datos sobre la tabla registros y se invoca al método MostarDatos() para que podamos ver en consola todos los datos de la tabla registro después de haber eliminado el empleado, cerrando durante el código el PreparedStatement y cerrando la conexión al invocar al método Desconnectar().

public static void EliminarDatos(int Codigo){
    int Reseliminar;
    try{
        Connectar();
        PreparedStatement psmt= cnn.prepareStatement(eliminar);
        psmt.setInt(1, Codigo);
        Reseliminar=psmt.executeUpdate();
        if(Reseliminar==1){
        System.out.println("Datos Eliminados Correctamente !!!");
        MostrarDatos();    
        }else{
        System.out.println("Datos no se eliminaron");
        }
        psmt.close();
        }catch(SQLException sqlex){
        System.out.println("EliminarDatos:" +sqlex.getMessage());
        }catch(Exception ex){
        System.out.println("EliminarDatos:" +ex.getMessage());
        }finally{
        Desconnectar();
      }}

Main de la aplicación Java.
El main solamente dictara a que método se invocara, ya sea Agregar un nuevo empleado mandandole al método estático AgregarDatos los parámetros necesarios, también puede modificar los datos de un empleado mandando como parámetro el código del empleado a modificar y los valores que desea modificar, también se pueden eliminar datos de un empleado invocando al método estático EliminarDatos o simplemente mostrar todos los datos de la tabla registro al llamar al método MostrarDatos().

Algo a tener en cuenta es que al realizar una llamada a un método estático en especifico, se deben comentariar los restantes invocaciones a métodos, para tener una idea mas clara de como trabaja la aplicación y que recuerden que el código del empleado es un entero autonumerico, así que al mandar el parámetro código al método ModificarDatos() o EliminarDatos() deben saber exactamente el codigo del empleado sobre el que quieren actuar.

public static void main(String[] args) {
       AgregarDatos("JavaEmployee","Programador","Informatica","El mismo");
       //ModificarDatos(9,"Java","Tecnico Programador","Informatica","Juan");
       //EliminarDatos(9);
       //MostrarDatos();
    }
}

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.





























Clase MysqlDataSource


Si la conexión va a ser siempre con una base de datos  MySQL, tenemos una forma más sencilla de establecer la conexión, usando la clase MysqlDataSource. Esta clase viene dentro del driver MySQL-JDBC que nos hemos bajado y al ser específica de MySQL, no debemos proporcionarle cosas como el driver, además de que gestiona mejor la conexión con  MySQL que una clase genérica.
El código va así:


package javApplication;
import java.sql.*;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class Conexion {
 static String user="root";
 static String pass="root";
static String url="jdbc:mysql://127.0.0.1/Empleado";
 
public static Connection conectar(){
Connection link=null;
    try{
     
    MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setDatabaseName("empleado");
dataSource.setServerName("localhost");
link = dataSource.getConnection();
return link;
    }catch(Exception ex){
        System.out.println(ex.getMessage());
    }}}