Data Access Object

Z FI WIKI
(Přesměrováno z DAO)
Přejít na: navigace, hledání
This page is also available in English: Data Access Object (English)

Popis

Predstavme si situáciu, kde Vaša úspešná spoločnosť získa kontrakt na vývoj aplikácie pre dvoch rôznych klientov. Špecifikácia je pre obidve spoločnosti skoro identická, okrem niekoľkých malých rozdielov. Ako vždy, aj v tomto príbehu prichádza zápletka. Obaja klienti majú v úmysle používať relačnú databázu, ale každý z nich si vyberie inú implementáciu. Táto situácia bude vyžadovať, aby vo Vašej aplikácii bola vrstva perzistencie dát bola implementovaná najmenej dvomi rôznymi spôsobmi. Prirodzene môže nastať, že počet potrebných implementácii sa v priebehu času zvýši s narastajúcim počtom klientov. Vaša najlepšia možná voľba ako vyriešiť tento problém s prenositeľnosťou v Jave EE je použitie jedného zo základných návrhových vzorov pre Javu EE - vzor Data Access Object.

Data Access Object(ďalej len DAO) abstrahuje a zapúzdruje všetok prístup ku zdrojom dát(DataSource). DAO spravuje spojenie so zdrojom dát, aby mohol získavať a ukladať dáta [preklad z alur2003]. Inými slovami, DAO jednoducho zavádza rozhranie medzi zdroj dát a konzumentmi dát, čím izoluje logiku správy dát do jednej vrstvy a segreguje vrstvu perzistencie dát od vrstvy aplikačnej logiky.

Výhody použitia vzoru DAO

Použitie návrhového vzoru DAO prináša okrem iných tieto výhody [alur2003]:

  • Zavádza transparentnosť
  • Prináša jednoduchšiu migráciu a prenositeľnosť
  • Redukuje komplexitu kódu v biznis objektoch
  • Centralizuje všetok prístup k dátam do jednej vrstvy
  • Pridáva vrstvu do hierarchie

Prirodzeným požiadavkom na použitie návrhového vzoru DAO je vrstevnatý design aplikácie(zaručí napr. použitie Springu alebo EJB).

Príklad DAO triedy

Toto je príklad triedy navrhnutej podľa vzoru Data Access Object. Reprezentuje DAO súpisky športového tímu. Na výber zoznamov dát z relačnej databázy je použitý jazyk JPQL.

 
 
/**
 * This is an example of Data Access Object
 *
 * @author Andrej Makovicky
 */
@Repository
public class RosterDAOImpl implements RosterDAO {
    
    @PersistenceContext 
    private EntityManager em;
    
    
    @Override
    @Transactional
    public void addRoster(Roster roster) {
        
        if (roster == null) {
            throw new IllegalArgumentException("Roster is null.");
        } 
        
        if (roster.getId() != null) {
            throw new IllegalArgumentException("Roster has already ID.");
        }
        
        if (roster.getTeam() == null) {
            throw new IllegalArgumentException("Roster has not got assigned team.");
        }
        
        if (roster.getCategory() == null) {
            throw new IllegalArgumentException("Roster has not got assigned category.");
        }
        
        em.persist(roster);
    }
 
    @Override
    @Transactional
    public void removeRoster(Roster roster) {
        
        if (roster == null) {
            throw new IllegalArgumentException("Roster is null.");
        } 
        
        if (roster.getId() == null) {
            throw new IllegalArgumentException("Roster has no ID.");
        }
        
        em.remove(em.merge(roster));
        
    }
 
    @Override
    @Transactional
    public void updateRoster(Roster roster) {
        if (roster == null) {
            throw new IllegalArgumentException("Roster is null.");
        }
        
        if (roster.getId() == null) {
            throw new IllegalArgumentException("ID of roster is null.");
        }
        
        if (roster.getTeam() == null) {
            throw new IllegalArgumentException("Roster has no assigned team.");
        }
        
        if (roster.getCategory() == null) {
            throw new IllegalArgumentException("Roster has no assigned category");
        }
        em.merge(roster);
    }
    
    @Override
    @Transactional
    public List<Roster> findAllRosters() {
        Query query = em.createQuery("SELECT r FROM Roster r");
        List<Roster> list = query.getResultList();
        return list;
    }
    
    @Override
    @Transactional
    public List<Roster> findAllRostersForTeam(Team team) {
        Query query = em.createQuery("SELECT r FROM Roster r WHERE team = :team");
        query.setParameter("team", team);
        List<Roster> list = query.getResultList();
        return list;
    }
    
    @Override
    @Transactional
    public Roster findById(Long id) {
        
        if (id == null) {
            throw new IllegalArgumentException("Id is null.");
        }
        Roster roster = em.find(Roster.class, id);
        return roster;
    }
    
}
 

Pre extenzívny zoznam príkladov a hlbšie porozumenie tejto problematiky orporúčam buď výbornú knihu zaoberajúcu sa Java EE návrhovými vzormi [alur2003] alebo onilne dokumentáciu na adrese : http://www.oracle.com/technetwork/java/dataaccessobject-138824.html .

Zdroje a odkazy