जावा में डेटा एक्सेस ऑब्जेक्ट (DAO)


347

मैं एक दस्तावेज के माध्यम से जा रहा था और मैं एक शब्द भर में आया था DAO। मुझे पता चला कि यह एक डेटा एक्सेस ऑब्जेक्ट है। क्या कोई मुझे समझा सकता है कि यह वास्तव में क्या है?

मुझे पता है कि यह विभिन्न प्रकार के स्रोतों से डेटा तक पहुंचने के लिए कुछ प्रकार का इंटरफ़ेस है, मेरे इस छोटे से शोध के बीच में मैंने डेटा स्रोत या डेटा स्रोत ऑब्जेक्ट नामक एक अवधारणा में टकराया, और चीजें मेरे दिमाग में गड़बड़ हो गईं।

मैं वास्तव में जानना चाहता हूं कि DAOप्रोग्राम का उपयोग के संदर्भ में क्या है। इसका उपयोग कैसे किया जाता है? बहुत मूल सामग्री से इस अवधारणा को समझाने वाले पृष्ठों के किसी भी लिंक की सराहना की जाती है।

जवाबों:


447

डेटा एक्सेस ऑब्जेक्ट मूल रूप से एक ऑब्जेक्ट या एक इंटरफ़ेस है जो एक अंतर्निहित डेटाबेस या किसी अन्य दृढ़ता भंडारण तक पहुंच प्रदान करता है।

उस परिभाषा से: http://en.wikipedia.org/wiki/Data_access_object

यहां अनुक्रम आरेख भी देखें: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

शायद एक सरल उदाहरण आपको अवधारणा को समझने में मदद कर सकता है:

मान लें कि हमारे पास एक कर्मचारी का प्रतिनिधित्व करने के लिए एक इकाई है:

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;
    }

}

कर्मचारी संस्थाओं को Employeeएक डेटाबेस में एक संबंधित तालिका में रखा जाएगा । एक कर्मचारी इकाई में हेरफेर करने के लिए आवश्यक डेटाबेस ऑपरेशन को संभालने के लिए एक सरल DAO इंटरफ़ेस निम्नानुसार होगा:

interface EmployeeDAO {

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

}

अगला हमें एसक्यूएल सर्वर से निपटने के लिए उस इंटरफ़ेस के लिए एक ठोस कार्यान्वयन प्रदान करना होगा, और दूसरा फ्लैट फ़ाइलों से निपटने के लिए, आदि।


4
हाय रमी, मुझे वास्तव में खुशी है कि तुमने मुझे एक बहुत ही सरल निर्वासन के साथ समझाने की कोशिश की, जो कि मुझे चाहिए। क्या आप कृपया समझा सकते हैं कि आप 'ठोस कार्यान्वयन' के साथ क्या मतलब रखते थे, क्या आपका मतलब यह था कि हमें इंटरफ़ेस को कक्षा में लागू करके तरीकों के लिए परिभाषा लिखनी होगी .. ??
वसंत नाग केवी

हाँ य़ह सही हैं। एक वर्ग EmployeeSQLServerDAO कहा जाता है की तरह है जो औजार एक तरह से अपने तरीकों एसक्यूएल सर्वर के लिए प्रासंगिक के लिए पूर्ण कार्यान्वयन प्रदान करके EmployeeDAO इंटरफ़ेस
रामी

4
इतना है कि सभी एक DAO है ?? यह सिर्फ एक वर्ग है जो हम डेटाबेस तक पहुंचने के लिए लिख रहे हैं। जब भी हमें डेटाबेस से एक सेवा की आवश्यकता होती है, तो हम एक डीएओ का एक ऑब्जेक्ट बनाते हैं जो इसे डेटाबेस के संचालन के लिए उपयोग करते हैं और फिर डेटाबेस से हम जो चाहते हैं उसे प्राप्त करने के बाद डीएओ से छुटकारा पा लेते हैं। क्या मैं सही हू?? और क्या मैं इस DAO अवधारणा रमी का दायरा जान सकता हूँ ??
वसंत नाग केवी

5
हां, डीएओ जैसा कि इसका नाम है, एक निश्चित इकाई / वर्ग के बारे में अंतर्निहित भंडारण को एक्सेस / अपडेट करने के लिए है। इसलिए उपरोक्त उदाहरण में हमारे पास एक कर्मचारी वर्ग / इकाई है जो हम एक SQL सर्वर DB तालिका का उपयोग जारी रखने के लिए करते हैं। कर्मचारी DAO में कर्मचारी सम्मिलित करने / हटाने / अपडेट करने / चयन करने के तरीके शामिल होंगे
Rami

2
@PhilipRego हम निश्चित रूप से एक MSSQL सर्वर कार्यान्वयन के उदाहरण के लिए कई कार्यान्वयन कर सकते हैं, और एक और एक जो CSV फ़ाइल का उपयोग इकाई परीक्षणों के साथ किया जाता है।
रामी

86

DATA ACCESS OBJECT (DAO) क्या है -

यह एक ऑब्जेक्ट / इंटरफ़ेस है , जिसका उपयोग डेटा स्टोरेज के डेटाबेस से डेटा एक्सेस करने के लिए किया जाता है ।

हम क्यों उपयोग करते हैं:

यह डेटाबेस जैसे डेटा संसाधन से डेटा की पुनर्प्राप्ति को रोकता है। अवधारणा "डेटा एक्सेस तंत्र से डेटा संसाधन के क्लाइंट इंटरफ़ेस को अलग करना " है।

सीधे डेटा तक पहुंचने में समस्या यह है कि डेटा का स्रोत बदल सकता है। उदाहरण के लिए, विचार करें कि आपका एप्लिकेशन एक ऐसे वातावरण में तैनात है, जो Oracle डेटाबेस को एक्सेस करता है। तब इसे बाद में Microsoft SQL सर्वर का उपयोग करने वाले वातावरण में परिनियोजित किया जाता है। यदि आपका एप्लिकेशन संग्रहीत कार्यविधियों और डेटाबेस-विशिष्ट कोड (जैसे संख्या अनुक्रम उत्पन्न करना) का उपयोग करता है, तो आप इसे अपने आवेदन में कैसे संभाल सकते हैं? आपके पास दो विकल्प हैं:

  • Oracle के बजाय SQL सर्वर का उपयोग करने के लिए अपने आवेदन को फिर से लिखें (या अंतर को संभालने के लिए सशर्त कोड जोड़ें), या
  • अपने एप्लिकेशन लॉजिक और डेटा एक्सेस के लिए एक परत बनाएं


इसके सभी डीएओ पैटर्न के रूप में संदर्भित , इसमें निम्नलिखित शामिल हैं:

  • डेटा एक्सेस ऑब्जेक्ट इंटरफ़ेस - यह इंटरफ़ेस मॉडल ऑब्जेक्ट (ओं) पर किए जाने वाले मानक संचालन को परिभाषित करता है
  • डेटा एक्सेस ऑब्जेक्ट कंक्रीट क्लास -इस क्लास इंटरफ़ेस के ऊपर लागू होता है। यह वर्ग एक डेटा स्रोत से डेटा प्राप्त करने के लिए ज़िम्मेदार है जो डेटाबेस / xml या किसी अन्य भंडारण तंत्र के रूप में हो सकता है।
  • मॉडल ऑब्जेक्ट या वैल्यू ऑब्जेक्ट - यह ऑब्जेक्ट सरल POJO है जिसमें DAO वर्ग का उपयोग करके प्राप्त डेटा को संग्रहीत करने के लिए / सेट विधियाँ हैं

कृपया इस उदाहरण की जांच करें, यह चीजों को अधिक स्पष्ट रूप से स्पष्ट करेगा।

उदाहरण
मुझे लगता है कि यह चीजें निश्चित विस्तार तक डीएओ की आपकी समझ को साफ कर चुकी हैं।


13

एंटरप्राइज़ एप्लिकेशन में DAO (डेटा एक्सेस ऑब्जेक्ट) एक बहुत ही प्रयुक्त डिज़ाइन पैटर्न है। यह मूल रूप से मॉड्यूल है जिसका उपयोग हर स्रोत (DBMS, XML और इतने पर) से डेटा तक पहुंचने के लिए किया जाता है। मैं आपको कुछ उदाहरणों को पढ़ने का सुझाव देता हूं, जैसे यह एक:

DAO उदाहरण

कृपया ध्यान दें कि मूल डीएओ पैटर्न को लागू करने के लिए अलग-अलग तरीके हैं , और कई रूपरेखाएं हैं जो आपके काम को सरल कर सकती हैं। उदाहरण के लिए, ORM (ऑब्जेक्ट रिलेशनल मैपिंग) चौखटे जैसे आईबैटिस या हाइबरनेट, का उपयोग जावा ऑब्जेक्ट्स में SQL प्रश्नों के परिणाम को मैप करने के लिए किया जाता है।

आशा है कि यह मदद करता है, अलविदा!


8

डेटा एक्सेस ऑब्जेक्ट पैटर्न या डीएओ पैटर्न का उपयोग निम्न स्तर के डेटा को एपीआई या संचालन को उच्च स्तर की व्यावसायिक सेवाओं से अलग करने के लिए किया जाता है। डेटा एक्सेस ऑब्जेक्ट पैटर्न में भाग लेने वाले निम्नलिखित हैं।

डेटा एक्सेस ऑब्जेक्ट इंटरफ़ेस - यह इंटरफ़ेस मॉडल ऑब्जेक्ट (ओं) पर किए जाने वाले मानक संचालन को परिभाषित करता है।

डेटा एक्सेस ऑब्जेक्ट कंक्रीट क्लास -इस क्लास इंटरफ़ेस के ऊपर लागू होता है। यह वर्ग एक डेटा स्रोत से डेटा प्राप्त करने के लिए ज़िम्मेदार है जो डेटाबेस / xml या किसी अन्य भंडारण तंत्र के रूप में हो सकता है।

मॉडल ऑब्जेक्ट या वैल्यू ऑब्जेक्ट - यह ऑब्जेक्ट सरल POJO है जिसमें DAO वर्ग का उपयोग करके पुनर्प्राप्त डेटा को संग्रहीत करने के लिए / सेट विधियाँ हैं।

नमूना कोड यहाँ ..


7

मैं सामान्य होने जा रहा हूं और जावा के लिए विशिष्ट नहीं हूं क्योंकि सभी भाषाओं में डीएओ और ओआरएम का उपयोग किया जाता है।

DAO को समझने के लिए आपको सबसे पहले ORM (ऑब्जेक्ट रिलेटेड मैपिंग) को समझना होगा। इसका मतलब है कि यदि आपके पास कॉलम "नाम" और "आयु" के साथ "व्यक्ति" नामक एक तालिका है, तो आप उस तालिका के साथ ऑब्जेक्ट-टेम्पलेट बनाएंगे:

type Person {
name
age
}

अब सभी व्यक्तियों को लाने के लिए कुछ विशिष्ट प्रश्नों को लिखने के बजाय DAO की मदद से, आप जो भी db का उपयोग कर रहे हैं (जो कि त्रुटि-प्रवण हो सकता है) के बजाय आप करते हैं:

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

आप अपने आप को DAO अमूर्त नहीं लिखते हैं, इसके बजाय यह आमतौर पर कुछ ओपनसोर्स प्रोजेक्ट का हिस्सा होता है, जो इस बात पर निर्भर करता है कि आप किस भाषा और फ्रेमवर्क का उपयोग कर रहे हैं।

अब यहाँ मुख्य प्रश्न पर। " ..जहाँ इसका उपयोग किया जाता है .. "। वैसे आमतौर पर यदि आप जटिल व्यवसाय और डोमेन विशिष्ट कोड लिख रहे हैं, तो डीएओ के बिना आपका जीवन बहुत मुश्किल होगा। बेशक, आपको दिए गए ORM और DAO का उपयोग करने की आवश्यकता नहीं है, इसके बजाय आप अपने स्वयं के अमूर्त और मूल प्रश्नों को लिख सकते हैं। मैंने अतीत में ऐसा किया है और लगभग हमेशा बाद में पछताया है।


6

मुझे लगता है कि सबसे अच्छा उदाहरण (स्पष्टीकरण के साथ) आप ओरेकल वेबसाइट पर पा सकते हैं: यहां । एक और अच्छा ट्यूटरियल यहां पाया जा सकता है


2
क्या यह सिर्फ मुझे या अधिकांश जावा ट्यूटोरियल और सूचना साइटों को सुपर पुराना है? वह ट्यूटोरियल 2008 का है! विभिन्न जावा विषयों पर कई शीर्ष खोज परिणाम और भी पुराने हैं।
bergie3000 6

2
@ bergie3000: यह पैटर्न नया नहीं है।
Rikimaru

5

बहुत अधिक स्पष्टीकरण के साथ भ्रमित मत हो। DAO: नाम से ही इसका अर्थ है ऑब्जेक्ट का उपयोग करके डेटा तक पहुंचना। DAO को अन्य Business Logic से अलग किया जाता है।


4

डेटा एक्सेस ऑब्जेक्ट डेटा स्रोत के साथ कनेक्शन को डेटा को प्राप्त करने और संग्रहीत करने के लिए प्रबंधित करता है। यह डेटा स्रोत के लिए पारदर्शी पहुंच को सक्षम करने के लिए व्यावसायिक ऑब्जेक्ट के लिए अंतर्निहित डेटा एक्सेस कार्यान्वयन को रोकता है। डेटा स्रोत कोई भी डेटाबेस हो सकता है जैसे RDBMS, XML रिपॉजिटरी या फ्लैट फाइल सिस्टम आदि।


4

स्प्रिंग जेपीए डीएओ

उदाहरण के लिए हमारे पास कुछ इकाई समूह हैं।

इस इकाई के लिए हम रिपोजिटरी GroupRepository बनाते हैं।

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

फिर हमें एक सेवा परत बनाने की आवश्यकता है जिसके साथ हम इस भंडार का उपयोग करेंगे।

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;
    }
}

और नियंत्रक में हम इस सेवा का उपयोग करते हैं।

@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();
    }    
}

यह मूल लेखकों के अनुरोध के अनुसार रिपॉजिटरी पैटर्न और डीएओ पैटर्न की व्याख्या करता प्रतीत होता है। इसके अतिरिक्त मेरा मानना ​​है कि आपका उदाहरण भ्रामक हो सकता है क्योंकि आपके इंटरफ़ेस को दृष्टिकोण जैसे संग्रह का पालन करना चाहिए, इसलिए आपके कुछ संचालन अनुकूल नहीं हैं।
जान हेसेन

2

DAO 3 स्तरीय वास्तुकला में "दृढ़ता प्रबंधक" की तरह एक कार्य है और साथ ही DAO भी पैटर्न को डिज़ाइन करता है क्योंकि आप "गैंग ऑफ़ फोर" पुस्तक से परामर्श कर सकते हैं। आपकी एप्लिकेशन सेवा परत को DAO की विधि के छिपे हुए और आंतरिक विवरण को जाने बिना DAO वर्ग की विधि को कॉल करने की आवश्यकता है।


2

Dd clases का उपयोग jdbc तर्क के पुन: उपयोग के लिए किया जाता है और Dao (Data Access Object) एक डिज़ाइन पैटर्न है। डाओ एक साधारण जावा वर्ग है जिसमें JDBC तर्क होता है।

डेटा एक्सेस लेयर अलग-अलग व्यावसायिक तर्क परत और लगातार परत में अच्छा साबित हुआ है। DAO डिजाइन पैटर्न पूरी तरह से अपने ग्राहकों से डेटा एक्सेस कार्यान्वयन को छुपाता है

जावा डेटा एक्सेस ऑब्जेक्ट (जावा डीएओ) व्यावसायिक अनुप्रयोगों में एक महत्वपूर्ण घटक है। व्यावसायिक अनुप्रयोगों को लगभग हमेशा रिलेशनल या ऑब्जेक्ट डेटाबेस से डेटा तक पहुंच की आवश्यकता होती है और जावा प्लेटफॉर्म एक्सेसिंगिस डेटा के लिए कई तकनीकों की पेशकश करता है। जावा डेटाबेस कनेक्टिविटी (JDBC) एपीआई का उपयोग करने के लिए सबसे पुरानी और सबसे परिपक्व तकनीक है, जो डेटाबेसस के खिलाफ एसक्यूएल प्रश्नों को निष्पादित करने की क्षमता प्रदान करती है और एक समय में परिणाम, एक कॉलम लाती है।


1

पूजो जावा में मॉडल वर्ग के रूप में भी विचार करता है जहां हम निजी में परिभाषित विशेष चर के लिए गेट्टर और सेटर बना सकते हैं। याद रखें कि सभी वेरिएबल्स यहां प्राइवेट मॉडिफायर के साथ घोषित किए गए हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.