स्प्रिंग डीएओ बनाम स्प्रिंग जेडीबीसी बनाम स्प्रिंग डीएओ


103

मैं स्प्रिंग द्वारा समर्थित डेटा एक्सेस तकनीकों के माध्यम से जा रहा था, और मैंने देखा कि इसमें कई विकल्पों का उल्लेख है और मैं उनमें अंतर के बारे में निश्चित नहीं हूं:

जैसा कि मैं समझता हूं, स्प्रिंग JDBC, सादे पुराने तरीके से डेटाबेस तक पहुँचने के लिए बॉयलरप्लेट कोड को कम करने के लिए टेम्पलेट प्रदान करता है - आप अपने स्वयं के SQL क्वेरी लिखते हैं।

ORM तकनीकों के माध्यम से डेटाबेस तक पहुँचने के लिए स्प्रिंग-ओआरएम सरलीकृत टेम्पलेट प्रदान करता है, जैसे कि हाइबरनेट, माय (i) बैटिस आदि।

स्प्रिंग-डीएओ स्प्रिंग की वेबसाइट के अनुसार:

स्प्रिंग में डेटा एक्सेस ऑब्जेक्ट (DAO) का उद्देश्य JDBC, हाइबरनेट या JDO जैसी डेटा एक्सेस तकनीकों के साथ सुसंगत तरीके से काम करना आसान बनाना है।

मैं ORM बनाम JDBC के बारे में थोड़ा स्पष्ट हूं क्योंकि वे DB तक पहुंचने के विभिन्न तरीकों के उद्देश्य से हैं। लेकिन स्प्रिंग-डीएओ सिर्फ सादा भ्रामक है!

क्या कोई स्पष्ट कर सकता है कि इन तीनों में क्या अंतर हैं? किन परिदृश्यों में प्राथमिकता दी जानी चाहिए?

इसके अलावा, एक अन्य परियोजना Spring-DATAभी उपलब्ध है ( http://projects.spring.io/spring-data/ ) अब, यह स्प्रिंग द्वारा समर्थित सभी डेटा एक्सेस टेक के लिए एक मूल परियोजना का प्रकार है या क्या यह बसंत के लिए एक नया नाम है -DAO?

जवाबों:


162

यहाँ प्रत्येक उल्लिखित तकनीक का परिचय दिया गया है।

वसंत-डीएओ

स्प्रिंग-डीएओ एक सख्त अर्थ में एक स्प्रिंग मॉड्यूल नहीं है, बल्कि ऐसे कन्वेंशन हैं जो आपको डीएओ लिखने के लिए और उन्हें अच्छी तरह से लिखने के लिए निर्देशित करना चाहिए। जैसे, यह आपके डेटा तक पहुंचने के लिए न तो इंटरफेस प्रदान करता है और न ही कार्यान्वयन। DAO लिखते समय, आपको उन्हें इस तरह से एनोटेट करना चाहिए @Repositoryताकि अंतर्निहित तकनीक (JDBC, Hibernate, JPA, आदि) से जुड़े अपवाद लगातार उचित DataAccessExceptionउपवर्ग में अनुवादित हों ।

एक उदाहरण के रूप में, मान लें कि आप अब हाइबरनेट का उपयोग कर रहे हैं, और आपकी सेवा परत इस HibernateExceptionपर प्रतिक्रिया करने के लिए पकड़ती है। यदि आप जेपीए में बदल जाते हैं, तो आपके डीएओ इंटरफेस में बदलाव नहीं होना चाहिए, और सर्विस लेयर अभी भी उन ब्लॉकों के साथ संकलित होगी जो पकड़ते हैं HibernateException, लेकिन आप इन ब्लॉकों में कभी भी प्रवेश नहीं करेंगे क्योंकि आपके डीएओ अब जेपीए को फेंक रहे हैं PersistenceException@Repositoryअपने DAO पर उपयोग करके , अंतर्निहित तकनीक से जुड़े अपवादों का स्प्रिंग में अनुवाद किया जाता है DataAccessException; आपकी सेवा की परत इन अपवादों को पकड़ती है और यदि आप दृढ़ता प्रौद्योगिकी को बदलने का निर्णय लेते हैं, तो वसंत DataAccessExceptionsको अभी भी फेंक दिया जाएगा क्योंकि वसंत ने देशी अपवादों का अनुवाद किया है।

ध्यान दें कि इसका निम्न कारणों से सीमित उपयोग है:

  1. आपका आमतौर पर दृढ़ता अपवादों को नहीं पकड़ना चाहिए, क्योंकि प्रदाता ने लेन-देन को वापस ले लिया हो सकता है (सटीक अपवाद उपप्रकार के आधार पर), और इस प्रकार आपको वैकल्पिक पथ के साथ निष्पादन जारी नहीं रखना चाहिए।
  2. अपवादों का पदानुक्रम आमतौर पर आपके प्रदाता में होता है जो स्प्रिंग प्रदान करता है, और इससे एक प्रदाता से दूसरे तक कोई निश्चित मैपिंग नहीं होती है। इस पर भरोसा करना खतरनाक है। हालाँकि @Repository, आपके DAO को एनोटेट करना एक अच्छा विचार है , क्योंकि सेम को स्कैन प्रक्रिया द्वारा स्वचालित रूप से जोड़ा जाएगा। इसके अलावा, स्प्रिंग एनोटेशन में अन्य उपयोगी सुविधाओं को जोड़ सकता है।

वसंत-JDBC

स्प्रिंग-जेडडीबीसी JdbcTemplate वर्ग प्रदान करता है, जो प्लंबिंग कोड को हटाता है और आपको SQL क्वेरी और मापदंडों पर ध्यान केंद्रित करने में मदद करता है। आपको बस इसे एक से कॉन्फ़िगर करने की आवश्यकता है DataSource, और फिर आप इस तरह कोड लिख सकते हैं:

int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);

Person p = jdbcTemplate.queryForObject("select first, last from person where id=?", 
             rs -> new Person(rs.getString(1), rs.getString(2)), 
             134561351656L);

स्प्रिंग-जेडडीबीसी एक JdbcDaoSupport भी प्रदान करता है, जिससे आप अपने DAO को विकसित कर सकते हैं। यह मूल रूप से 2 गुणों को परिभाषित करता है: एक डेटा स्रोत और एक JdbcTemplate कि दोनों का उपयोग DAO विधियों को लागू करने के लिए किया जा सकता है। यह एसक्यूएल अपवादों से लेकर स्प्रिंग डेटाएक्स्टैप्शन तक एक अपवाद अनुवादक भी प्रदान करता है।

यदि आप सादे jdbc का उपयोग करने की योजना बनाते हैं, तो यह वह मॉड्यूल है जिसका आपको उपयोग करने की आवश्यकता होगी।

वसंत-ORM

स्प्रिंग-ओआरएम एक छाता मॉड्यूल है जो कई दृढ़ता प्रौद्योगिकियों को कवर करता है, अर्थात् जेपीए, जेडीओ, हाइबरनेट और आईबैटिस। इन तकनीकों में से प्रत्येक के लिए, स्प्रिंग एकीकरण कक्षाएं प्रदान करता है ताकि प्रत्येक तकनीक का उपयोग कॉन्फ़िगरेशन के स्प्रिंग सिद्धांतों का पालन किया जा सके, और आसानी से स्प्रिंग लेनदेन प्रबंधन के साथ एकीकृत किया जा सके।

प्रत्येक प्रौद्योगिकी के लिए, कॉन्फ़िगरेशन मूल रूप DataSourceसे किसी प्रकार के सेम को इंजेक्ट करने में शामिल होता है SessionFactoryयाEntityManagerFactory आदि बीन । शुद्ध JDBC के लिए, ऐसे एकीकरण वर्गों (JdbcTemplate के अलावा) की कोई आवश्यकता नहीं है, क्योंकि JDBC केवल एक DataSource पर निर्भर करता है।

यदि आप जेपीए या हाइबरनेट जैसे ओआरएम का उपयोग करने की योजना बनाते हैं, तो आपको स्प्रिंग-जेडडीबीसी की आवश्यकता नहीं होगी, लेकिन केवल यह मॉड्यूल।

वसंत-डाटा

स्प्रिंग-डेटा एक छतरी परियोजना है जो SQL और NOSQL दोनों डेटा स्रोतों को कवर करते हुए अधिक सामान्य तरीके से डेटा (DAO + एनोटेशन) तक पहुंचने के तरीके को परिभाषित करने के लिए एक सामान्य एपीआई प्रदान करता है।

प्रारंभिक विचार एक प्रौद्योगिकी प्रदान करने के लिए है ताकि डेवलपर एक DAO (खोजक विधियों) और इकाई वर्गों के लिए एक प्रौद्योगिकी-अज्ञेयवादी तरीके से इंटरफ़ेस लिखता है, और केवल कॉन्फ़िगरेशन पर आधारित है (DAO और संस्थाओं + वसंत कॉन्फ़िगरेशन पर टिप्पणियां, हो) xml- या java- आधारित), कार्यान्वयन तकनीक का फैसला करता है, चाहे वह JPA (SQL) या रेडिस, हडूप, आदि (NOSQL) हो।

यदि आप खोजक विधि नामों के लिए वसंत द्वारा परिभाषित नामकरण परंपराओं का पालन करते हैं, तो आपको सबसे सरल मामलों के लिए खोजक विधियों के अनुरूप क्वेरी स्ट्रिंग प्रदान करने की भी आवश्यकता नहीं है। अन्य स्थितियों के लिए, आपको खोज तरीकों पर एनोटेशन के अंदर क्वेरी स्ट्रिंग प्रदान करनी होगी।

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

स्प्रिंग-डेटा गैर-SQL प्रौद्योगिकियों पर केंद्रित है, लेकिन फिर भी JPA (एकमात्र SQL तकनीक) के लिए एक मॉड्यूल प्रदान करता है।

आगे क्या होगा

यह सब जानते हुए, अब आपको तय करना है कि क्या चुनना है। यहाँ अच्छी खबर यह है कि आपको तकनीक के लिए एक निश्चित अंतिम विकल्प बनाने की आवश्यकता नहीं है। यह वास्तव में है जहां स्प्रिंग पावर रहता है: एक डेवलपर के रूप में, आप कोड लिखते समय व्यवसाय पर ध्यान केंद्रित करते हैं, और यदि आप इसे अच्छी तरह से करते हैं, तो अंतर्निहित प्रौद्योगिकी को बदलना एक कार्यान्वयन या कॉन्फ़िगरेशन विस्तार है।

  1. संस्थाओं के लिए POJO वर्गों के साथ एक डेटा मॉडल को परिभाषित करें, और इकाई विशेषताओं और अन्य संस्थाओं से संबंधों का प्रतिनिधित्व करने के लिए / सेट विधियाँ प्राप्त करें। आपको निश्चित रूप से प्रौद्योगिकी के आधार पर इकाई वर्गों और क्षेत्रों को एनोटेट करने की आवश्यकता होगी, लेकिन अभी के लिए, पीओजेओ शुरू करने के लिए पर्याप्त हैं। बस अब के लिए व्यावसायिक आवश्यकताओं पर ध्यान केंद्रित।
  2. अपने DAO के लिए इंटरफेस को परिभाषित करें। 1 डीएओ ठीक 1 इकाई को कवर करता है, लेकिन आपको निश्चित रूप से उनमें से प्रत्येक के लिए डीएओ की आवश्यकता नहीं होगी, क्योंकि आपको रिश्तों को नेविगेट करके अतिरिक्त संस्थाओं को लोड करने में सक्षम होना चाहिए। सख्त नामकरण सम्मेलनों के बाद खोजक विधियों को परिभाषित करें।
  3. इसके आधार पर, कोई और आपके DAO के लिए मोक्स के साथ, सेवा स्तर पर काम करना शुरू कर सकता है।
  4. आप अपनी आवश्यकताओं के लिए सबसे उपयुक्त खोजने के लिए विभिन्न दृढ़ता तकनीकों (sql, no-sql) को सीखते हैं और उनमें से किसी एक को चुनते हैं। इसके आधार पर, आप एंटिटीज़ को एनोटेट करते हैं और DAO लागू करते हैं (या यदि आप स्प्रिंग-डेटा का उपयोग करना चुनते हैं तो स्प्रिंग उन्हें आपके लिए लागू करते हैं)।
  5. यदि व्यावसायिक आवश्यकताएं विकसित होती हैं और आपकी डेटा एक्सेस तकनीक इसका समर्थन करने के लिए पर्याप्त नहीं है (जैसे, आपने JDBC और कुछ संस्थाओं के साथ शुरुआत की थी, लेकिन अब एक अमीर डेटा मॉडल की आवश्यकता है और JPA एक बेहतर विकल्प है), तो आपको कार्यान्वयन को बदलना होगा अपने DAO में, अपनी संस्थाओं पर कुछ एनोटेशन जोड़ें और स्प्रिंग कॉन्फ़िगरेशन बदलें (EntityManagerFactory परिभाषा जोड़ें)। आपके व्यवसाय कोड के बाकी लोगों को आपके परिवर्तन से अन्य प्रभावों को नहीं देखना चाहिए।

नोट: लेनदेन प्रबंधन

वसंत लेनदेन प्रबंधन के लिए एक एपीआई प्रदान करता है। यदि आप डेटा एक्सेस के लिए वसंत का उपयोग करने की योजना बनाते हैं, तो आपको लेनदेन प्रबंधन के लिए भी वसंत का उपयोग करना चाहिए, क्योंकि वे वास्तव में अच्छी तरह से एक साथ एकीकृत होते हैं। वसंत द्वारा समर्थित प्रत्येक डेटा एक्सेस तकनीक के लिए, स्थानीय लेनदेन के लिए एक मिलान लेनदेन प्रबंधक है, या यदि आपको वितरित लेनदेन की आवश्यकता है तो आप जेटीए चुन सकते हैं। वे सभी एक ही एपीआई को लागू करते हैं, ताकि (एक बार फिर) प्रौद्योगिकी का विकल्प केवल एक विन्यास हो जो व्यापार कोड पर आगे के प्रभाव के बिना बदला जा सके।

नोट: स्प्रिंग डॉक्यूमेंटेशन

आपके द्वारा उल्लिखित स्प्रिंग प्रलेखन के लिंक पुराने हैं। यहाँ नवीनतम रिलीज़ का दस्तावेज़ीकरण है (4.1.6, सभी विषयों को शामिल करते हुए):

स्प्रिंग-डेटा स्प्रिंग फ्रेमवर्क का हिस्सा नहीं है। एक सामान्य मॉड्यूल है जिसे आपको पहले सिद्धांतों के लिए उपयोग करने के लिए पढ़ना चाहिए। प्रलेखन यहाँ पाया जा सकता है:


मैं यहाँ कुछ विवरणों में "छतरी" शब्द का उपयोग करके इस उत्तर की सराहना करता हूं (जैसे स्प्रिंग डेटा), यह पहचान कर कि उप-घटक / मॉड्यूल भीतर हैं (बजाय एक छाता अधिक डोमेन विशिष्ट होने के नाते)। और स्प्रिंग डेटा का उल्लेख करना यहां के संदर्भ में बहुत उपयोगी है, भले ही यह प्रश्न में उल्लेख नहीं किया गया था।
cellepo

नहीं है spring-jdbcयहां नहीं बताई गई अन्य उपयोगी उपकरण प्रदान करते हैं? उदाहरण के लिए, मुझे SimpleJdbcInsertएकल प्रविष्टि प्रविष्टि के साथ-साथ बल्क (उचित पैमाने तक) के लिए बहुत साफ और उपयोगी लगता है ।
नोम

3

स्प्रिंग डीएओ ( D ata A ccess O bject): एक ऐसी वस्तु है जो JDBC कार्यान्वयन ढाँचों को एक सार इंटरफ़ेस प्रदान करता है अर्थात स्प्रिंग DAO को JDBC और Hibernate, MyBatis, JPA, JDO तक पहुँच के लिए सामान्यीकृत अवधारणा है, जिसका उपयोग यह व्यक्तिगत सहायता वर्ग करता है। और यह एनोटेशन को परिभाषित करके सामान्यीकृत अपवाद पदानुक्रम प्रदान करता है@Repository । यह एनोटेशन, स्प्रिंग के डेटा एक्सेस रणनीति-अज्ञेय से SQL अपवाद अनुवाद के लिए स्प्रिंग कंटेनर को परिभाषित करता हैSQLExceptionDataAccessException पदानुक्रम ।

यानी प्लेटफ़ॉर्म विशिष्ट अपवाद कैच हैं और फिर स्प्रिंग के अनियंत्रित डेटा एक्सेस अपवादों में से एक के रूप में फिर से फेंकता है।


स्प्रिंग JDBC : सादे JDBC के लिए हम इस मॉड्यूल का उपयोग करते हैं, जो केवल DataSourceऔर उसी तरह टेम्पलेट श्रेणियों पर निर्भर करता है JdbcTemplate, NamedParameterJdbcTemplate(रैप्स JdbcTemplate) और SimpleJdbcTemplateक्रॉस कटिंग चिंताओं को कम करने के लिए।

public class EmployeeDao {  
private JdbcTemplate jdbcTemplate;  

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
    this.jdbcTemplate = jdbcTemplate;  
}  

public int saveEmployee(Employee e){  
    return jdbcTemplate.update(query);  
}  
public int updateEmployee(Employee e){  
    return jdbcTemplate.update(query);  
}  
public int deleteEmployee(Employee e){  
       return jdbcTemplate.update(query);  
}  

}  

और स्प्रिंग एक्सएमएल में:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

स्प्रिंग JDBC भी प्रदान करता है JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport, जो कर रहे हैं समर्थन (यानी सुविधाजनक का विस्तार और हमारे अपने विकसित करने के लिए) रास्ता डीएओ इस प्रकार सार इंटरफ़ेस:

public interface EmployeeDao {

    public void saveEmployee(Employee emp);
}

public class EmployeeDaoImpl extends JdbcDaoSupport implements EmployeeDao{

    @Override
    public void saveEmployee(Employee emp) {

        Object[] inputs = new Object[] {emp.getName(), emp.getSalary(), emp.getDept()};
        getJdbcTemplate().update(query, inputs);
    }
}

और वसंत एक्सएमएल में:

<bean id="employeeDAO" class="EmployeeDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>

स्प्रिंग ओआरएम: हाइबरनेट, जेपीए, मायबैटिस जैसे ओआरएम टूल्स सपोर्ट के लिए ... DataSourceनिम्न वर्ग और संबंधित DaoSupportकक्षाओं के साथ आसानी से इंजेक्शन लगाकर स्प्रिंग को एकीकृत करता है ।

  • SessionFactory हाइबरनेट के लिए
  • EntityManagerFactory जेपीए के लिए,
  • SqlSessionFactory MyBatis के लिए

1

वसंत-डाओ का परिवाद 2.0.8 (जनवरी 2008) संस्करण में बंद हो गया। वसंत-दाओ में कक्षाओं को वसंत-टीएक्स में कॉपी किया गया था। इसलिए, यदि आपको एक वर्ग की आवश्यकता है जो आपको वसंत-दाव में मिल जाए, तो इसके बजाय वसंत-टीएक्स पर निर्भरता जोड़ें । ( स्रोत ।)


0

आप जैसे इंटरफ़ेस बनाते हैं SomeObjectDaoऔर फिर इस इंटरफ़ेस के विभिन्न कार्यान्वयन बनाते हैं JdbcSomeObjectDao, जैसे HibernateSomeObjectDao। तब आपकी SomeObjectServiceकक्षा में आप SomeObjectDaoइंटरफ़ेस पर काम करेंगे , और वहाँ एक ठोस कार्यान्वयन इंजेक्ट करेंगे। तो प्रत्येक कार्यान्वयनSomeObjectDao विवरणों को छिपाएगा, चाहे आप जेडीबीसी, या ओआरएम आदि का उपयोग करें।

आमतौर पर JDBC, और ORM के अलग-अलग कार्यान्वयन विभिन्न प्रकार के अपवादों को फेंक देते हैं। स्प्रिंग का डीएओ समर्थन उन विभिन्न, तकनीकी विशिष्ट अपवादों को सामान्य स्प्रिंग डीएओ अपवादों को मैप कर सकता है। इसलिए आपको वास्तविक क्रियान्वयन से अधिक हटा दिया जाता है। इसके अलावा स्प्रिंग का DAO समर्थन अमूर्त *DataSupportवर्गों का सेट प्रदान करता है जो DAO विकास में और भी अधिक मदद करता है। तो अपने SomeObjectDaoइंटरफ़ेस को लागू करने के अलावा , आप स्प्रिंग की *DataSupportकक्षा में से एक का विस्तार कर सकते हैं ।


तो आपका मतलब है, स्प्रिंग-दाओ एब्स्ट्रैक्ट्स, हाइबरनेट / जेडीओ / जेडीबीसी के अपवादों को दूर करते हैं और अपवादों का एक मानक सेट प्रदान करते हैं? क्या इसका कोई templatesdb एक्सेस है? या क्या यह बसंत के अन्य घटकों के साथ प्रयोग किया जाने वाला एक अमूर्त है? उदाहरण के लिए ऐसा कोड लिखना संभव है जो केवल स्प्रिंग-डीएओ को डीबी तक पहुंचने के लिए उपयोग करता है (वसंत-जेडडीबीसी, वसंत-ओआरएम, हाइबरनेट या किसी अन्य ढांचे का उपयोग किए बिना)?
पैट

0

एक अतिरिक्त जानकारी के रूप में। मेरा सुझाव है कि आप स्प्रिंग डेटा JPA का उपयोग करें। एनोटेशन जैसे: @Repository, @Service का उपयोग करना। मैं आपको एक उदाहरण दिखाता हूं:

@Repository("customerEntitlementsRepository")
public interface CustomerEntitlementsRepository extends CrudRepository<BbsExerul, BbsExerulPK> {

  @Query(value = "SELECT " + "CONTRACT_NUMBER, EXECUTIVE_NUMBER, " + "GROUP_VALUE, " + "CODE, "
      + "SUBCODE, " + "CURRENCY " + "FROM BBS_EXERUL " + "WHERE CONTRACT_NUMBER =:clientId AND "
      + "EXECUTIVE_NUMBER =:representativeId", nativeQuery = true)
  Collection<CustomerEntitlementsProjection> getFieldsExerul(@Param("clientId") String clientId,
      @Param("representativeId") String representativeId);

}

जहां CustomerEntitlementsProjection वसंत प्रक्षेपण है, आप इकाई या डीटीओ पूजो के साथ जुड़ा हुआ है;

@Projection(name = "customerEntitlementsProjection", types = { BbsExerul.class })
public interface CustomerEntitlementsProjection {

  String getContractNumber();

  String getExecutiveNumber();

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