Lector Dactilar desde Java (y Parte II, Guardar-Leer en BD)

Seguimos con el lector de huellas dactilares. En el post anterior vimos como leer las huellas directamente desde el lector. Ahora vamos a tomar dichas huellas (template) y guardarlo y leerlo desde una base de datos (en mi caso Oracle).

En el post anterior, una vez que teníamos las 4 huellas, bajo el case TEMPLATE_STATUS_READY habilitábamos el botón para guardar. Entonces, agregamos un listener con lo siguiente:

private void btnGuardarActionPerformed(ActionEvent e) {
    try{
        PersonaDAO personaDAO = new PersonaDAO(new Persona(Integer.parseInt(this.txt_rut.getText())));
        if(personaDAO.updateHuella(template.serialize())){
            JOptionPane.showMessageDialog(null,"Huella Guardada Correctamente");
            btnGuardar.setEnabled(false);
            btnVerificar.setEnabled(true);
            btnVerificar.grabFocus();
            Reclutador.clear();
            lblHuella.setIcon(null);
            start();
            txtMensajes.setText("");
        }
    }catch(Exception ex){
        JOptionPane.showMessageDialog(null, "Exception => "+ex.getMessage(), "Error al Enrolar", JOptionPane.ERROR_MESSAGE);
    }
}

Por parte,

  1. Creo un objeto del tipo PersonaDAO con una “Persona” dentro, inicializada con el rut de dicha persona.
  2. Llamo a la función updateHuella y envío template.serialize() , que es un array de bytes (byte [] ).
  3. Ésta función me devuelve un si o no, dependiendo de si ingresamos o no (😯 ).
    1.  Si vamos bien, limpiamos el Reclutador (DPFPEnrollment), quitamos la huella como imagen, iniciamos el lector para escuchar, y borramos los mensajes del txtArea.
    2. Si algo sale mal, no hacemos nada, o caemos al catch. En ese caso mostramos un mensaje con el error correspondiente.

La clase PersonaDAO tiene lo siguiente:

public class PersonaDAO {

    private HandlerOracle HO;
    private Persona Persona;
    private String mensaje;

    public PersonaDAO(Persona persona){
        HO = new HandlerOracle();
        this.Persona = persona;
    }

    public byte[] getHuella() throws Exception {
        StringBuilder SQL = new StringBuilder("select template_huella from ali_personal where rut = ?");
        byte[] bytes = this.HO.SelectBytesEspecial(SQL.toString(), Persona.getRut());
        if(bytes!= null){
            if(bytes.length == 0){
                this.mensaje = "PersonalDAO.getHuella: Error al consultar huella. "+this.HO.mensaje;
                System.out.println(this.mensaje);
            }else{
                return bytes;
            }
        }else{
            this.mensaje = "PersonalDAO.getHuella: Error al consultar huella. "+this.HO.mensaje;
            System.out.println(this.mensaje);
        }
        return new byte[0];
    }

    public boolean updateHuella(byte [] huella){
        try{
            StringBuilder SQL = new StringBuilder("update ali_personal set template_huella = ? where rut = ?");
            if(this.HO.InsertEspecialBinaryArray(SQL.toString(), huella, Persona.getRut())){
                return true;
            }else{
                mensaje = "Controller.PersonaDAO.updateHuella() => Error al enrrolar. "+ this.HO.mensaje;
                System.out.println(mensaje);
            }
        }catch(Exception e){
            mensaje = "Controller.PersonaDAO.updateHuella() => Error al enrrolar. "+ e.getMessage();
            System.out.println(mensaje);
        }
        return false;
    }
}

Se explica por si misma.

  • HandlerOracle es una clase especial que tengo para conectarme a la BD (Oracle). El tipo de dato de template_huella es BLOB.
  • Al leer la huella, en getHuella(), llamo a this.HO.SelectBytesEspecial y envío la sentencia SQL y el rut (identificador)  de la persona.
  • Para guardarla, en updateHuella(), llamo a this.HO.InsertEspecialBinaryArray y lo mismo, SQL e identificador.

El truco es mandar la template como un arreglo de bytes (template.serialize()) y guardarlo tal cual en la BD.

Entonces, veamos primero this.HO.InsertEspecialBinaryArray():

public Boolean InsertEspecialBinaryArray(String sql, byte [] huella, Integer rut){
    try {
        if(this.conexion.isClosed()){ this.conexion = this.Conectar(); }
        PreparedStatement pstmt = conexion.prepareStatement(sql);
        pstmt.setBytes(1, huella);
        pstmt.setInt(2, rut);
        pstmt.executeUpdate();
        pstmt.close();
        conexion.close();
        return true;
    }catch (SQLException sqex) {
        System.out.println("Error en Insert -> :"+HandlerOracle.class.getName() + " " + Level.SEVERE + " " + sqex.toString());
        mensaje = "Error en Insert: " +
                HandlerOracle.class.getName() + " " + Level.SEVERE + " " + sqex.toString();
        this.error = sqex.getErrorCode();
    }catch (Exception sqex) {
        System.out.println("Error en Insert -> :"+HandlerOracle.class.getName() + " " + Level.SEVERE + " " + sqex.toString());
        mensaje = "Error en Insert: " +
                HandlerOracle.class.getName() + " " + Level.SEVERE + " " + sqex.toString();
    }
    return false;
} 

Como ven, el arreglo que enviamos lo guardamos con un setBytes y quedamos ok.

Ahora la función this.HO.SelectBytesEspecial:

public byte[] SelectBytesEspecial(String sql, Integer rut) throws Exception {
    if(this.conexion.isClosed()){ this.Conectar(); }
    PreparedStatement pstmt = conexion.prepareStatement(sql);
    pstmt.setInt(1, rut);
    ResultSet rs = pstmt.executeQuery();
    if(rs.next()){
        return rs.getBytes("TEMPLATE_HUELLA");
    }else{
        this.mensaje = "No existe un registro de huella para rut: "+rut;
        System.out.println(this.mensaje);
        return new byte[0];
    }
}

Listo. Es así de sencillo. Esta última función la usamos desde el botón para verificar a la persona, que llamamos del botón verificar:

private void btnVerificarActionPerformed(ActionEvent e) {
    try{
        PersonaDAO personaDAO = new PersonaDAO(new Persona(Integer.parseInt(this.txt_rut.getText())));
        byte[] huella = personaDAO.getHuella();
        DPFPTemplate referenceTemplate = DPFPGlobal.getTemplateFactory().createTemplate(huella);
        setTemplate(referenceTemplate);
        DPFPVerificationResult result = Verificador.verify(featureSetVerificacion, getTemplate());
        if (result.isVerified())
            JOptionPane.showMessageDialog(null, "Las huella capturada coinciden con la de "+txt_rut.getText(),"Verificacion de Huella", JOptionPane.INFORMATION_MESSAGE);
        else
            JOptionPane.showMessageDialog(null, "La huella capturada no corresponde la huella con la de "+txt_rut.getText(),
                    "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
    }catch(Exception ex){
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, ex.toString(), "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
    }
}

Y como ven, creamos la plantilla desde el array de bytes y las mismas funciones del lector se encargan de comparar.

Eso es todo, el cielo es el límite.

Dibujo

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Aplicación, Java, Oracle, Tutoriales. Guarda el enlace permanente.

19 respuestas a Lector Dactilar desde Java (y Parte II, Guardar-Leer en BD)

  1. Antonino Franco dijo:

    Hola, podrias compartir tu proyeco con fines didacticos y educativos, saludos. Exelente Aporte.

  2. jhonatan dijo:

    HOLA ESTA EXELENTE.. PUEDES PASARME LA APLICACION O CODIGO. .

  3. rada dijo:

    habra manera de que proporciones el proyecto?

  4. Juan Ramos dijo:

    Por favor, puedes compartir el proyecto completo para estudiarlo?

  5. Mizael dijo:

    Que tal amigo, estoy por empezar un proyecto utilizando un lector de huellas DigitalPersona, me parece muy interesante tu blog igual que otros que también hablan de ésto, pero mi pregunta es donde encuentro la documentación de la api de DigitalPersona para java? me gustaría darle una leida no se si me podrias orientar donde encontrarla? si tu la tienes te agradecería si me la pudieras mandar porfavor! Gracias

  6. Aldo dijo:

    estoy haciendo algo parecido , y lo tengo listo, pero ahora no quiero ingresar el rut solo la huella para que me traiga la persona de la BD osea ocupar la huella en un where ej: “select * from persona where huella = ”huelladactilar”

  7. Damian dijo:

    Muy bueno!!! Esta muy bien explicado!! Muchas Gracias!!! Ahora te molesto, en swing lo he logrado hacer andar, pero en applet no, tengo problemas para iniciar los metodos ya que al ponerlos en componentInits no arranca el applet, y ya despues modificando la ubicacion de los metodos el unico q me genera problemas que hace que el applet se cuelgue es el de DibujarImagen, tiene alguna idea de por que podria ser o ayudarme!! gracias

  8. Anónimo dijo:

    hola buenas tardes de casualidad no tienes codigo para guardar la huella en lugar de oracle en mysql por favor

  9. heidi dijo:

    hola buenas tardes de casulidad tendras codigo para una bd en mysql

  10. Anónimo dijo:

    disculpa amigo oye si quiero capturar y guardar huellas de distintos dedos no me deja donde se modificaria eso

  11. haider dijo:

    como seria para dibujar la imagen de la huella pero leida de la base de datos por si se requiere buscar por cedula y ponga la huella ???

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s