2013-03-21 27 views
6

Sono nuovo di Java e sto provando a creare un progetto Web con servlet. Vorrei interrogare il mio database ma penso di non capire tutto su JPA e DAO.Novità in Java: che cos'è JPA e DAO?

ho insegnato a fare le cose in questo modo:

  • Crea classe com.package.entity.User (generato dal mio database)
  • Creare interfaccia com.package.dao.UserDao
  • Creare classe com.package.dao.jpa.JpaUserDao attuazione UserDao
  • Crea EJB com.package.service.UserService con metodi come public List<User> findAll()

Ho sentito che non è necessario creare un'interfaccia DAO con JPA, ma sono completamente perso e non capisco cosa dovrei fare o cosa sia un EJB. Voglio semplicemente trovare tutti gli utenti nel mio database e mostrare i loro nomi seguendo le buone pratiche di Java.

È già tutto OK per i miei servlet e JSP.

Cosa raccomanderesti?

+1

Vedere questa domanda simile: http://programmers.stackexchange.com/questions/97423/are-there-any-real-benifits-to-a-dao-layer – Dave

+0

Il problema è: questo è cinese per me! Non so nemmeno cosa faccia DAO, perché creo solo interfacce DAO. È un livello di astrazione come PDO per PHP? O più come un ORM come Doctrine? – mimipc

risposta

7

DAO sta per "Data Access Object". Estrae il concetto di "ottenere qualcosa da un archivio dati". Gli oggetti DAO possono essere implementati con chiamate JDBC, chiamate JPA o altro. Forse chiama qualche webservice remoto. Avere un DAO su JPA sembra ridondante e aggiunge un livello, ma penso che ne valga la pena.

Ad esempio, è possibile utilizzare un caso di "visualizzazione di utenti con gli occhi verdi".

con JPA dritto:

List<User> users = entityManager.createQuery("select u from User u where u.EyeColor = 'green'""); 

con una DAO dovreste:

List<User> users = dao.UsersWithEyeColor("green"); 

La DAO qui ha un paio di vantaggi:

  1. E 'più facile da leggere .
  2. Non espone la struttura del database al resto dell'applicazione
  3. Sarebbe molto più semplice per il test dell'unità. La classe che sta ottenendo gli utenti con gli occhi verdi ha solo bisogno di creare un dao "Mock". Questo è più facile che prendere in giro JPA.

Questi sono solo alcuni argomenti per l'utilizzo di un DAO. Per un'applicazione molto semplice e di piccole dimensioni potrebbe essere troppo sovraccarico. Ma per tutto ciò che diventerà più grande e dovrà essere mantenuto per molti anni, penso che ne valga la pena.

+1

Le tue domande restituiranno gli utenti dagli occhi verdi, non con gli occhi azzurri, come inizialmente intendi. :) – artaxerxe

+0

Grazie artaxerxe – Dave

6

DAO (Data Access Object) è fondamentalmente un modello per la programmazione, per utilizzare questo, è necessario creare una classe che creerà un oggetto che fornisce un'interfaccia astratta a un tipo di unità di persistenza (db, file system. Xml, ecc.) Perché è utile? Perché fornisce alcune operazioni di dati specifici senza esporre i dettagli del database.

Un esempio fondamentale di DAO:

import java.util.List; 


public abstract class DAOFactory { 

    public static final int MYSQL_JDBC = 1; 
    public static final int MYSQL_JPA = 2; 
    public static final int MYSQL_HIBERNATE = 3; 

    public abstract List<UserDTO> listAllUsers(); 

    public static DAOFactory getDAOFactory(int whichFactory) { 
     switch (whichFactory) { 
     case MYSQL_JDBC : return new MySqlJDBCDaoFactory(); 
     case MYSQL_JPA: return new MySqlJpaDaoFactory(); 
     case MYSQL_HIBERNATE: return new MySqlHibernateDaoFactory(); 
     default: return null; 
     } 
    } 

} 

Poi si deve creare una fabbrica specifici per ogni tipo di persistenza si riuscirà nella propria applicazione, e che fabbrica specifici devono implementare i metodi che si utilizzano per la persistenza, per esempio listAllUsers();

Ad esempio, per MySQL JPA:

public class MySqlJpaDaoFactory extends DAOFactory { 

    @Override 
    public List<UserDTO> listAllUsers() { 
     // Here I implement specific functionality to retrieve data using JPA Framework 
     //EntityManagerFactory emf = ... 
     //EntityManager em = ... 
     //List<UserDTO> list = em.get...(); 
     //return list; 
     return null; 
    } 

} 

Per MySQL JDBC quello che dovete fare altro processo:

public class MySqlJDBCDaoFactory extends DAOFactory { 

    @Override 
    public List<UserDTO> listAllUsers() { 
     //Connection = DriverManager ... 
     //PreparedStatement ps = connection.prepareStatement("select * from ..."); 
     //ResultSet = ps.executeQuery() 
     // and so on... 
     return null; 
    } 

} 

Poi si richiama la tua fabbrica in questo modo:

DAOFactory myfactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL_JDBC); 
List<UserDTO> list = myfactory.listAllUsers(); 

E se riesci a vedere, non importa se cambi la struttura del tuo database o la modalità di persistenza, non devi re-inventare il ruota, cambia semplicemente un parametro e otterrai l'implementazione per la persistenza che desideri, basata semplicemente su un parametro.

Spero che possa aiutarti a capire lo schema, non uso EJB e, se stai utilizzando DAO, non penso sia ancora necessario implementare EJB.

migliori saluti

+0

Sembra completamente completamente ingegnerizzato per il normale caso d'uso in cui si ottengono i propri dati tramite JDBC * o * tramite JPA2, ma non si modifica la metodologia di accesso nilly-willy. Dimentica le fabbriche, crea un'istanza dei tuoi DAO. –

+0

@Marcelo, posso sapere perché JDBC è ancora necessario quando si utilizza JPA? Attualmente, sto anche facendo qualcosa del genere, ma sono abbastanza confuso se dovrei mixare JDBC con JPA. Spero di sentirti. Tks. –

+1

Ciao @KarenGoh. Se hai deciso di utilizzare un framework di persistenza come JPA, allora non vedo il motivo per cui dovresti mischiare JDBC con esso. In questo particolare esempio, ho solo provato a mostrare come puoi gestire diversi tipi di "manager" di persistenza basati su un'applicazione con cui ho lavorato nel mio precedente lavoro. È iniziato con questo pattern (DAO) utilizzando JDBC nel 2004, successivamente è stato migrato a Pure Hibernate nel 2009 e poi sono migrato a JPA (+ Eclipselink) nel 2013. L'esempio è stato fatto solo per mostrare come possiamo cambiare la modalità di persistenza da un tipo all'altro in un modo semplice con questo modello. –