Una vez implementada la capa de persistencia procedemos al siguiente paso.
Vamos a implementar la capa de negocio; para empezar, dentro del directorio controllers construiremos la EntityManagerFactory, el fichero DAO para acceso a capa de persistencia y el interface correspondiente:
6 - Creación del fichero DAO y de EntityManagerFactory
Primero vamos a construir la EntityManagerFactory. Una entityManagerFactory es un objeto que tiene como misión crear una "factoría" de sesiones, es decir que fabrica objetos session. Un objeto session es un objeto utilizado para cada operación de base de datos, y tiene un periodo de vida más bien limitado, de usar y tirar ;-)La clase se llamará ConnectionFactory. En JPA, este objeto es bastante "pesado", por lo que es conveniente crear solo uno por sesión de usuario. A partir del entityManagerFactory se crearán los objetos session, que en JPA se llaman entityManager.
public class ConnectionFactory {
private static EntityManagerFactory emf;
static {
emf=Persistence.createEntityManagerFactory("ejemploJSF");
}
public static EntityManagerFactory getEmf() {
if (emf==null) {
emf=Persistence.createEntityManagerFactory("ejemploJSF");
}
return emf;
}
}
En createEntityManagerFactory le suministramos el nombre que suministramos en Persistence-unit, cuando creamos el objeto Persistence.xml. Esto relaciona, por tanto, a la EntityManagerFactory con la Persistence-unit y la base de datos que éste administra. Es conveniente poner nombre a la Persistence-unit, aunque solo tengamos una.
El acceso al objeto estático será a través de getEmf(). Cada vez que accedamos a este objeto, nos habilitará la posibilidad de crear un nuevo objeto session simplemente instanciándolo.
El siguiente paso va a consistir en la creación del fichero interface que va a implementar el DAO. Llamaremos al interface UsuariosInterface:
public interface UsuariosInterface {
public Usuarios identifyUser (String login, String password);
public boolean createUser(Usuarios usuario);
public Usuarios getUser (long idUser);
public boolean changeUser(Usuarios usuario);
public boolean deleteUser(long idToDelete);
}
Este fichero tiene la finalidad de controlar que el modelo DAO y sus posible modificaciones mantengan la coherencia con el diseño y la arquitectura del proyecto, y que los cambios realizados en la capa de persistencia no afecten, o afecten mínimamente al resto de capas de la aplicación.
Una vez construido el interface, procederemos a implementar el DAO, con todos los métodos del interface desarrollados. El fichero se llamará UsuariosDAO:
public class UsuariosDAO implements UsuariosInterface {
public UsuariosDAO() {
}
/**
* Este metodo sirve para identificar a un usuario determinado.
* @param login - login del usuario a recuperar la informacion.
* @param password - password del usuario a recuperar la informacion.
* @return Devuelve como parametros objeto Usuario con los datos del usuario o null
* si el usuario no existe o si hay errores.
*/
@Override
public Usuarios identifyUser (String login, String password) {
EntityManager em=ConnectionFactory.getEmf().createEntityManager();
em.getTransaction().begin();
String sql="SELECT u FROM Usuarios u WHERE login LIKE '"+login+"' AND password LIKE '"+password+"'";
Query q=em.createQuery(sql);
Usuarios user=null;
try {
user=(Usuarios)q.getSingleResult();
} catch (NoResultException nr) {
return null;
} catch (NonUniqueResultException nu) {
// devuelve el primer usuario
user=(Usuarios)q.getResultList().get(0);
} catch (Exception ex) {
return null;
} finally {
em.close();
}
return user;
}
/**
* Este metodo crea un usuario nuevo, grabando los datos correspondientes en el fichero de usuarios.
* @param usuario - Objeto Usuarios, conteniendo el usuario a grabar.
* @return boolean con el resultado de la operación.
*/
@Override
public boolean createUser(Usuarios usuario) {
EntityManager em=ConnectionFactory.getEmf().createEntityManager();
em.getTransaction().begin();
try {
em.persist(usuario);
em.getTransaction().commit();
} catch (Exception ex) {
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
return true;
}
/**
* Este metodo sirve para recuperar los datos relativos a un usuario determinado.
* @param idUser - Id del usuario a recuperar la informacion.
* @return Devuelve como parametros objeto Usuario con los datos del usuario o null si errores.
*/
@Override
public Usuarios getUser (long idUser) {
EntityManager em=ConnectionFactory.getEmf().createEntityManager();
em.getTransaction().begin();
Usuarios user=null;
try {
user=em.find(Usuarios.class, idUser);
} catch (IllegalArgumentException il) {
return null;
} finally {
em.close();
}
return user;
}
/**
* Este método modifica los datos del usuario grabados en ddbb, sustituyéndolos
* por los datos del objeto suministrado.
* @param usuario - Objeto Usuarios, correspondiente a los nuevos datos a grabar.
* @return boolean con el resultado de la operación.
*/
@Override
public boolean changeUser(Usuarios usuario) {
EntityManager em=ConnectionFactory.getEmf().createEntityManager();
em.getTransaction().begin();
try {
Usuarios us=em.merge(usuario);
em.persist(us);
em.getTransaction().commit();
} catch (Exception ex) {
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
return true;
}
/**
* Este método elimina del fichero de usuarios al usuario con el id del parámetro suministrado
* @param usuario - long, con el id del usuario a eliminar
* @return boolean con el resultado de la operación.
*/
@Override
public boolean deleteUser(long idToDelete) {
EntityManager em=ConnectionFactory.getEmf().createEntityManager();
em.getTransaction().begin();
String sql="DELETE FROM Usuarios u WHERE id='"+idToDelete+"'";
Query q=em.createQuery(sql);
try {
q.executeUpdate();
em.getTransaction().commit();
} catch (Exception ex) {
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
return true;
}
} // ***** END OF CLASS
Teniendo el fichero DAO, la capa de negocio podrá interactuar eficientemente con la capa de persistencia abstrayéndose de los cambios que se realicen en esta última, lo cual minimiza la posibilidad de errores y el trabajo correspondiente a la adaptación a los cambios.
Anterior tema Siguiente tema
No hay comentarios:
Publicar un comentario