Java'da veri erişim nesnesi (DAO)


347

Bir belgeden geçiyordum ve denilen bir terimle karşılaştım DAO. Bunun bir Veri Erişim Nesnesi olduğunu öğrendim. Birisi bana bunun gerçekte ne olduğunu açıklayabilir mi?

Farklı kaynak türlerinden verilere erişmek için bir çeşit arayüz olduğunu biliyorum, bu küçük araştırmamın ortasında veri kaynağı veya veri kaynağı nesnesi olarak adlandırılan bir kavramla karşılaştım ve işler aklımda dağıldı.

Gerçekten a'nın DAOkullanıldığı yere göre programlı olarak ne olduğunu bilmek istiyorum . Nasıl kullanılır? Bu kavramı çok temel şeylerden açıklayan sayfalara yapılan bağlantılar da takdir edilmektedir.

Yanıtlar:


447

Veri Erişim Nesnesi temelde temeldeki bir veritabanına veya diğer kalıcı depolama alanlarına erişim sağlayan bir nesne veya arabirimdir.

Bu tanım: http://en.wikipedia.org/wiki/Data_access_object

Sekans diyagramını da buradan kontrol edin: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

Belki basit bir örnek konsepti anlamanıza yardımcı olabilir:

Diyelim ki bir çalışanı temsil edecek bir kuruluşumuz var:

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Çalışan varlıklar, Employeebir veritabanında karşılık gelen bir tablo halinde kalıcı olacaktır . Bir çalışan varlığını manipüle etmek için gerekli veritabanı işlemini gerçekleştirmek için basit bir DAO arayüzü şöyle olacaktır:

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

Daha sonra, bu arayüzün SQL sunucusuyla uğraşması için başka bir uygulama ve düz dosyalarla, vb.


4
merhaba rami, bana gerçekten çok basit bir exaple ile açıklamaya çalıştığım için mutluyum, bu da ihtiyacım olan şey. Eğer 'somut uygulama' ile demek istediğiniz wat açıklayabilir misiniz bir sonraki sınıfa arabirim uygulayarak yöntemler için tanım yazmak zorunda mıydı .. ??
Vasanth Nag KV

Evet bu doğru. Çalışanlar için SQL Server ile ilgili bir şekilde tam uygulama sağlayarak EmployeeDAO arabirimini uygulayan EmployeeSQLServerDAO adlı bir sınıf gibi
Rami

4
Yani hepsi bir DAO öyle mi ?? sadece veritabanına erişmek için yazdığımız bir sınıftır. veritabanından bir hizmete ihtiyaç duyduğumuzda, bir DAO'nun bir nesnesini veritabanı işlemleri için kullanırız ve sonra veritabanından istediğimizi aldığımızda DAO'dan kurtuluruz. Haklı mıyım ?? ve bu DAO konsept rami Kapsamı biliyor olabilir?
Vasanth Nag KV

5
Evet, DAO adından da anlaşılacağı gibi, belirli bir varlık / sınıfla ilgili temel depolamaya erişmek / bunları güncellemek içindir. Bu nedenle yukarıdaki örnekte, kalıcı olarak bir SQL Server DB tablosu kullandığımız bir çalışan sınıfı / varlığı var. Çalışan DAO, çalışanları eklemek / silmek / güncellemek / seçmek için yöntemler içerecektir
Rami

2
@PhilipRego, örneğin bir MSSQL sunucu uygulaması ve birim testlerinde kullanılacak bir CSV dosyası kullanan başka bir uygulama gibi birden fazla uygulamaya sahip olabiliriz.
Rami

86

VERİ ERİŞİM NESNESİ (DAO) -

Veri depolama veritabanından verilere erişmek için kullanılan bir nesne / arabirimdir .

NEDEN DAO'YU KULLANIRIZ:

veritabanı gibi bir veri kaynağından veri alınmasını özetler. Kavram, bir veri kaynağının istemci arayüzünü veri erişim mekanizmasından ayırmaktır.

Verilere doğrudan erişme sorunu, verinin kaynağının değişebilmesidir. Örneğin, uygulamanızın Oracle veritabanına erişen bir ortamda konuşlandırıldığını düşünün. Daha sonra Microsoft SQL Server kullanan bir ortama dağıtılır. Uygulamanız saklı yordamlar ve veritabanına özgü kod kullanıyorsa (sayı dizisi oluşturma gibi), bunu uygulamanızda nasıl ele alırsınız? İki seçeneğiniz var:

  • Oracle yerine SQL Server'ı kullanmak için uygulamanızı yeniden yazın (veya farklılıkları işlemek için koşullu kod ekleyin) veya
  • Uygulama mantığınız ile veri erişimi arasında bir katman oluşturun


Tüm DAO Desen olarak adlandırılır , Aşağıdakilerden oluşur:

  • Veri Erişim Nesnesi Arayüzü - Bu arayüz , bir model nesnesinde / nesnelerinde yapılacak standart işlemleri tanımlar .
  • Veri Erişimi Nesne somut sınıfı -Bu sınıf, arabirimin üzerinde uygular. Bu sınıf, veritabanı / xml veya başka bir depolama mekanizması olabilecek bir veri kaynağından veri almaktan sorumludur .
  • Model Nesnesi veya Değer Nesnesi - Bu nesne, DAO sınıfı kullanılarak alınan verileri depolamak için get / set yöntemleri içeren basit POJO'dur .

Lütfen bu örneği kontrol edin, Bu işleri daha net bir şekilde temizleyecektir.

Örnek
Bu şeylerin DAO anlayışınızı belli bir dereceye kadar temizlemesi gerektiğini varsayıyorum.


13

DAO (Veri Erişim Nesnesi) kurumsal uygulamalarda çok kullanılan bir tasarım modelidir. Temelde her kaynaktan (DBMS, XML vb.) Verilere erişmek için kullanılan modüldür. Bunun gibi bazı örnekleri okumanızı öneririm:

DAO Örneği

Orijinal DAO Desenini uygulamanın farklı yolları olduğunu lütfen unutmayın ve çalışmanızı basitleştirebilecek birçok çerçeve olduğunu . Örneğin, iBatis veya Hibernate gibi ORM (Nesne İlişkisel Eşleme) çerçeveleri, SQL sorgularının sonucunu java nesnelerine eşlemek için kullanılır.

Umarım yardımcı olur, güle güle!


8

Veri Erişimi Nesne Modeli veya DAO şablonu, düşük düzeyli veri erişim API'sına veya işlemlerine üst düzey iş hizmetlerinden ayırmak için kullanılır. Aşağıda Veri Erişim Nesnesi Kalıbı katılımcıları bulunmaktadır.

Veri Erişim Nesnesi Arayüzü - Bu arayüz, bir model nesnesinde / nesnelerinde yapılacak standart işlemleri tanımlar.

Veri Erişimi Nesne somut sınıfı -Bu sınıf, arabirimin üzerinde uygular. Bu sınıf, veritabanı / xml veya başka bir depolama mekanizması olabilecek bir veri kaynağından veri almaktan sorumludur.

Model Nesnesi veya Değer Nesnesi - Bu nesne, DAO sınıfı kullanılarak alınan verileri depolamak için get / set yöntemleri içeren basit POJO'dur.

Örnek kod burada ..


7

Genel olacağım ve DAO ve ORM tüm dillerde kullanıldığından Java'ya özgü olmayacağım.

DAO'yu anlamak için önce ORM'yi (Nesne İlişkisel Eşleme) anlamalısınız. Bu, "name" ve "age" sütunlarına sahip "person" adlı bir tablonuz varsa, o tablo için nesne şablonu oluşturacağınız anlamına gelir:

type Person {
name
age
}

Şimdi, DAO'nun yardımıyla, bazı kişileri sormak yerine, tüm kişileri getirmek için, ne tür db kullandığınızı (hataya eğilimli olabilir) yerine:

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

DAO soyutlamasını kendiniz yazmazsınız, bunun yerine hangi dili ve çerçeveyi kullandığınıza bağlı olarak genellikle bazı açık kaynaklı projelerin bir parçasıdır.

Şimdi asıl soruya bakalım. " .. kullanıldığı yerde .. ". Genellikle karmaşık iş ve alana özgü kod yazıyorsanız, DAO olmadan hayatınız çok zor olacaktır. Tabii ki sağlanan ORM ve DAO kullanmanıza gerek yoktur, bunun yerine kendi soyutlama ve yerel sorgularınızı yazabilirsiniz. Bunu geçmişte yaptım ve neredeyse her zaman daha sonra pişman oldum.


6

Oracle web sitesinde bulabileceğiniz en iyi örnek (açıklamalar ile birlikte): burada . Başka bir iyi tuturial burada bulunabilir .


2
Sadece ben mi yoksa çoğu Java öğreticisi ve bilgi sitesi süper eski mi? Bu eğitim 2008'den beri! Çeşitli Java konularında en iyi arama sonuçlarının çoğu daha da eskidir.
bergie3000

2
@ bergie3000: bu model yeni değil.
Rik Rikimaru

5

Çok fazla açıklama ile karıştırmayın. DAO: Adın kendisinden, Object kullanarak Verilere Erişim anlamına gelir. DAO, diğer İş Mantığından ayrılır.


4

Veri Erişim Nesnesi, veri elde etmek ve depolamak için veri kaynağı ile bağlantıyı yönetir. Bir veri kaynağı, RDBMS, XML deposu veya düz dosya sistemi vb. Gibi herhangi bir veritabanı olabilir.


4

Bahar JPA DAO

Örneğin, bazı varlık gruplarımız var.

Bu varlık için GroupRepository deposunu oluşturuyoruz.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

O zaman bu depoyu kullanacağımız bir hizmet katmanı oluşturmamız gerekiyor.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

Ve denetleyicide bu hizmeti kullanıyoruz.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}

Bu, orijinal yazarların isteğine göre DAO modelini değil Havuz modelini açıklıyor gibi görünüyor. Ayrıca, arabiriminizin Koleksiyon benzeri bir yaklaşımı izlemesi gerektiği için örneğinizin yanıltıcı olabileceğine inanıyorum, bu nedenle bazı işlemleriniz uygun değil.
Jan Haesen

2

DAO, 3 katmanlı mimaride "Kalıcılık Yöneticisi" gibi bir eylemdir ve DAO da "Gang of Four" kitabına başvurabileceğiniz gibi desen tasarlar. Uygulama hizmeti katmanınızın DAO yönteminin gizli ve dahili ayrıntılarını bilmeden DAO sınıfı yöntemini çağırması yeterlidir.


2

Dao sınıfları jdbc mantığını yeniden kullanmak için kullanılır & Dao (Veri Erişim Nesnesi) bir tasarım modelidir. dao, JDBC mantığını içeren basit bir java sınıfıdır.

Veri Erişim Katmanı, ayrı iş mantığı katmanında ve kalıcı katmanda iyi kanıtlanmıştır. DAO tasarım modeli, müşterilerinden veri erişimi uygulamasını tamamen gizler

Java Veri Erişim Nesnesi (Java DAO), iş uygulamalarında önemli bir bileşendir. İş uygulamaları neredeyse her zaman ilişkisel veya nesne veritabanlarından verilere erişmeye ihtiyaç duyar ve Java platformu bu verilere erişmek için birçok teknik sunar. En eski ve en olgun teknik, bir veritabanına karşı SQL sorguları yürütme ve ardından sonuçları birer birer sütun alma yeteneği sağlayan Java Veritabanı Bağlantısı (JDBC) API'sini kullanmaktır.


1

Pojo ayrıca Java'da, özel olarak tanımlanan belirli bir değişken için alıcı ve ayarlayıcı oluşturabileceğimiz Model sınıfı olarak düşünür. Tüm değişkenlerin burada özel değiştirici ile bildirildiğini unutmayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.