Foros del Web » Programación para mayores de 30 ;) » Java »

Librería para aplicaciones JEE

Estas en el tema de Librería para aplicaciones JEE en el foro de Java en Foros del Web. Hola, Tengo que hacer una librería que básicamente es un CRUD a una tabla de informes. Es librería porque se quiere añadir a varios proyectos ...
  #1 (permalink)  
Antiguo 23/07/2015, 16:40
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 10 meses
Puntos: 5
Librería para aplicaciones JEE

Hola,

Tengo que hacer una librería que básicamente es un CRUD a una tabla de informes. Es librería porque se quiere añadir a varios proyectos y el algoritmo a repetir siempre es el mismo: seleccionar un archivo de una página web, guardar ese archivo en un directorio del servidor y mantener un registro de los archivos subidos en una tabla denominada informes.

La cuestión es que por temas de nomenclatura cada proyecto tiene que tener su tabla con el código delante; ejemplo: ALI_INFORMES, RUE_INFORMES, CAC_INFORMES.

El proyecto es en JEE6 y por ejemplo me encuentro el problema de las entitities que tendría que crear uno por cada tabla en vez de ser genérico. Otra opción sería hacer un DAO y poderle meter el nombre de una tabla en una variable; pero me encuentro con el problema de injectarle el EJB para que realice la consulta.

¿Alguna sugerencia?
gracias
  #2 (permalink)  
Antiguo 24/07/2015, 11:41
Avatar de GusGarsaky  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 9 meses
Puntos: 2
Respuesta: Librería para aplicaciones JEE

Es un tema interesante el que propones. Lo particular es que las tablas no serán iguales por lo que ya de por sí tienes un problema importante. Lo que yo haría es, hacer un DAO genérico en el JAR a exportar y en los proyectos crear los DAO concretos para cada tabla (que serán prácticamente clases vacías).

Sobre cómo saber los nombres de las tablas, puedes sobreescribir los métodos en los DAO concretos para pasarle los nombres de las tablas y atributos que necesita el DAO genérico. Por ejemplo:

Código Java:
Ver original
  1. @Override
  2. public T getReportById(int code, String entityName, String[] properties, String conditions) {
  3.     String querySQL = "SELECT ";
  4.  
  5.     if(properties != null || properties.isEmpty()) {
  6.         for(String property : properties) {
  7.         // si la propiedad actual es la última no agregamos coma
  8.             if(properties.indexOf(property) == properties.size() - 1) {
  9.         querySQL += "x." + property;
  10.         } else {
  11.                 querySQL += "x." + property + ",";
  12.         }
  13.     querySQL += " FROM " + entityName + " x";
  14.     }
  15.     if(conditions != null) {
  16.         querySQL += " WHERE " + conditions;
  17.     }
  18.     if (properties == null && conditions == null) {
  19.     querySQL += " x FROM " + tableName + " x";
  20.     }
  21.     // creas la consulta y obtienes el reporte
  22.     T report = em.createQuery(querySQL).getSingleResult();
  23.    
  24.     return report;
  25. }

Y en el DAO concreto:

Código Java:
Ver original
  1. @Override
  2. public Report getReportById() {
  3.     return super.getReportById(100L, "CI_REPORTE", {"fechaReporte", "tipoReporte", "otraPropiedad"}, null);
  4. }

Y obtendrías la fecha del reporte, tipo de reporte y otra columna. Es una idea, si se me ocurre algo te lo comento.
  #3 (permalink)  
Antiguo 01/08/2015, 08:16
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 10 meses
Puntos: 5
Respuesta: Librería para aplicaciones JEE

Saludos Gus, gracias por tu respuesta y perdón el retraso por responder, mucho lío en el trabajo.

La cuestión es que me pidieron una librería que fuera lo más independiente posible, ten sencilla como importarla desde maven y solo indicarle los datos de configuración que son el nombre de la tabla (que por nomenclatura varía de una aplicación a otra) y la ruta donde se guardan los informes.

Al final he hecho una clase Configuración con patron singlenton que obtiene la configuración de los parametros indicados en el web.xml (init-parameters) cuando arranca la app. Luego desde el dao obtengo el nombre de la tabla de la clase. Cuando se importa la librería lo único que hay que hacer es añadir esos parámetros al web.xml de cada aplicación y listo. No utilizo JPA, sino un DAO más clásico que obtiene la conexion de un datasource.
te pongo el código de una versión casi final, la que tenía en casa, la del trabajo le he retocado cuatro detalles.

Código PHP:
package es.jose.lib.informes.dao;

import es.jose.lib.informes.interfaces.iGenericDAO;
import es.jose.lib.informes.oraclejdbc.OracleConnUtils;
import es.jose.lib.informes.utils.ReportsConfig;
import es.jose.lib.informes.vo.ReportsVO;
import java.sql.Connection;
import java.util.List;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.ResultSet;
import java.util.ArrayList;

public class 
ReportsDAO implements iGenericDAO<ReportsVO>{
  private 
PreparedStatement searchStmtFilter;    
  private 
PreparedStatement searchStmt;
  private 
PreparedStatement removeStmt;
  private 
PreparedStatement insertStmt;
  
  public 
ReportsDAO(){
      
Connection conn OracleConnUtils.getOracleConnection();
      
ReportsConfig configReportsConfig.getInstance();
      try {
          
searchStmtFilter conn.prepareStatement("SELECT *  FROM " +config.getTableName() + " WHERE DESCRIPCIO =  ?  AND IDIOMA  = ? AND NOM_FITXER = ?");
          
searchStmt conn.prepareStatement("SELECT *  FROM "config.getTableName());
          
insertStmt conn.prepareStatement("INSERT INTO " +config.getTableName()+ "(DESCRIPCIO, IDIOMA, NOM_FITXER)VALUES(?, ?, ?)");
          
removeStmt conn.prepareStatement("DELETE FROM "config.getTableName() +" WHERE NOM_FITXER = ?");
      } catch (
SQLException ex) {
          
Logger.getLogger(ReportsDAO.class.getName()).log(Level.ALLnullex);
      }
  }
  
     @
Override
    
public List<ReportsVOsearch(ReportsVO vo) {
        List<
ReportsVOreportsList null;
      try {
          
reportsList = new ArrayList<>();         
          
ResultSet result searchStmt.executeQuery();                    
          while (
result.next()){
              
ReportsVO report = new ReportsVO();
              
report.setDescripcio(result.getString("DESCRIPCIO"));
              
report.setIdioma(result.getString("IDIOMA"));
              
report.setNomFitxer(result.getString("NOM_FITXER"));
              
reportsList.add(report);
          }
      } catch (
SQLException ex) {
          
Logger.getLogger(ReportsDAO.class.getName()).log(Level.SEVEREnullex);
      }        
      return 
reportsList;
    }
    
    public List<
ReportsVOsearchFilter(ReportsVO vo) {
        List<
ReportsVOreportsList null;
      try {
           
Connection conn OracleConnUtils.getOracleConnection();
           
searchStmt conn.prepareStatement("SELECT *  FROM RUM_REPORTS WHERE DESCRIPCIO =  ?  AND IDIOMA  = ? AND NOM_FITXER = ?");
          
reportsList = new ArrayList<>();
          
searchStmt.setString(1vo.getDescripcio());
          
searchStmt.setString(2vo.getIdioma());
          
searchStmt.setString(3vo.getNomFitxer());
          
ResultSet result searchStmt.executeQuery();                    
          while (
result.next()){
              
ReportsVO report = new ReportsVO();
              
report.setDescripcio(result.getString("DESCRIPCIO"));
              
report.setIdioma(result.getString("IDIOMA"));
              
report.setNomFitxer(result.getString("NOM_FITXER"));
              
reportsList.add(report);
          }
      } catch (
SQLException ex) {
          
Logger.getLogger(ReportsDAO.class.getName()).log(Level.SEVEREnullex);
      }        
      return 
reportsList;
    }

    @
Override
    
public void remove(ReportsVO vo) {
      try {
          
removeStmt.setString(1vo.getNomFitxer());
          
removeStmt.executeQuery();
      } catch (
SQLException ex) {
          
Logger.getLogger(ReportsDAO.class.getName()).log(Level.SEVEREnullex);
      }
    }

    @
Override
    
public void insert(ReportsVO vo) {
      try {
          
insertStmt.setString(1vo.getDescripcio());
          
insertStmt.setString(2vo.getIdioma());
          
insertStmt.setString(3vo.getNomFitxer());
          
insertStmt.executeUpdate();                    
      } catch (
SQLException ex) {
          
Logger.getLogger(ReportsDAO.class.getName()).log(Level.SEVEREnullex);
      }
    }


Etiquetas: aplicaciones, jee
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:01.