2011-04-11 10 views
25

मेरे पास stumbled एक अच्छा SQL बिल्डर फ्रेमवर्क पर है, जिसे JOOQ कहा जाता है। बीटीडब्ल्यू, रूसी जौक्यू में संज्ञा का अर्थ है "बग" (एक कीट के रूप में), "बीटल";)जावा: JOOQ दृढ़ता फ्रेमवर्क प्रदर्शन और फ़ीड

यदि आपके पास JOOQ के बारे में कोई प्रतिक्रिया है, तो यह प्रदर्शन है और कृपया साझा करें। JOOQ के बारे में ब्लॉग के लिंक भी आपका स्वागत है।

उत्तर

32

मुझे लगता है कि मुझे यहां जवाब देना चाहिए क्योंकि मैंने साढ़े महीने पहले जूक का उपयोग शुरू किया था, इसलिए मुझे इसके साथ कुछ अनुभव है।

मैं jooq तरह उपकरण का उपयोग करने क्योंकि चाहता था:

  • ORM मेरे वर्तमान परियोजना में एक overkill (क्लस्टर के लिए वितरित गणना मंच) है, क्योंकि मैंने पढ़ा है और डाटाबेस से केवल अलग-अलग फ़ील्ड में लिखने के लिए की जरूरत है, नहीं पूरा तालिका पंक्तियां और मेरे कुछ प्रश्न जटिल हैं जो सरल और हल्के ओआरएम द्वारा निष्पादित नहीं किए जाते हैं।
  • मैं अपने प्रश्नों के लिए वाक्यविन्यास स्वत: पूर्ण करना चाहता था ताकि मुझे अपने पूरे डीबी को दिमाग में रखने की आवश्यकता न हो,
  • मैं जावा में सीधे प्रश्न लिखने में सक्षम होना चाहता था ताकि संकलक निर्माण पर मूल क्वेरी सिंटैक्स की जांच कर सके।
  • मैं चाहता था कि मेरे प्रश्न टाइप-सुरक्षित हों ताकि मैं गलती से एक प्रकार के चर को पास न कर सकूं, जहां एक और उम्मीद की जा सकती है।
  • मैं एसक्यूएल चाहता था, लेकिन मैं इसे बहुत सुविधाजनक और आसान उपयोग करने के लिए

खैर चाहता था, jooq साथ मैं यह सब प्राप्त करने में सक्षम था। मेरी मुख्य आवश्यकता जटिल जटिल प्रश्नों को संभालने के लिए जुक के लिए थी (नेस्टेड, ग्रुपिंग इत्यादि के साथ)। वह पूरा हो गया था।

मैं भी संभवतः कोड की कुछ पंक्तियों का उपयोग करके क्वेरी चलाने में सक्षम होना चाहता था और jooq fluent API के साथ इसे प्राप्त करने में सक्षम था जो jquery-like कॉल को SELECTs करने की अनुमति देता है।

jooq का उपयोग करके मेरे रास्ते पर मैंने one or two bugs की सूचना दी और मुझे कहना होगा कि वे आश्चर्यजनक रूप से तेज़ थे।

मैं भी missed some features और फिर मुझे कहना होगा कि मेरे पास पहले से ही उनमें से सभी हैं।

मुझे बहुत पसंद आया, यह है कि jooq अब इसके प्रदर्शन के बारे में कुछ बहुत ही रोचक डेटा रिपोर्ट करने के साथ-साथ इसके वास्तविक प्रश्नों को आउटपुट करने के लिए एसएलएफ 4 जे का उपयोग करता है। यह वास्तव में मुझे डिबगिंग के साथ मदद की।

जुक संग्रहीत प्रक्रियाओं, यूडीएफ और अद्यतन करने योग्य रिकॉर्ड्स के लिए जावा कलाकृतियों को भी उत्पन्न करता है, जिन्हें मैं वर्तमान में उपयोग नहीं करता हूं।

क्या महत्वपूर्ण है, jqq पारदर्शी रूप से डीबी 2, डर्बी, एच 2, एचएसक्यूएलडीबी, माईएसक्यूएल, ओरेकल, पोस्टग्रेएसक्यूएल, एसक्यूएलआईटी, एसक्यूएल सर्वर, साइबेस एसक्यूएल कहीं भी समर्थन करता है। बहुत व्यापक सूची, मुझे लगता है।

जुक में support forum in Google groups है जहां लुका दिन और रात मेरे प्रश्नों के बेवकूफों का जवाब देने के लिए तैयार है।

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

jooq के साथ मेरे प्रश्न लिखते हुए अचानक मुझे पता चला कि वे वास्तव में पोर्टेबल बन गए हैं क्योंकि मैंने कोड में किसी भी MySQL- विशिष्ट सुविधा का उपयोग कभी नहीं किया है क्योंकि jooq जितना संभव हो सके पोर्टेबल होने की कोशिश करता है। उन लोगों के लिए जो इस तरह के विशिष्टताओं के साथ नहीं रह सकते हैं, क्योंकि मुझे पता है कि एसक्यूएल एक्सटेंशन के लिए समर्थन भी चल रहा है।

मेरे दृष्टिकोण से एक पल के लिए जूक की कमी क्या है?

ठीक है, का चयन के अलावा अन्य बयान के लिए कोई धाराप्रवाह एपीआई है। यह कोड को थोड़ा जटिल बनाता है और लिखने के लिए थोड़ी अधिक जटिल अद्यतन/हटा देता है। लेकिन मुझे लगता है कि यह जल्द ही जोड़ा जाएगा। बस 1.5.9 में लागू किया गया! हा! मेरे लिए बहुत तेज़;)

और एक और बात। जुक के पास एक अच्छा मैनुअल है, लेकिन ... मुझे नहीं पता। हो सकता है कि मैं इसकी संरचना या वास्तुकला को समझ नहीं पा रहा हूं ... जब मैंने पहली बार jooq का उपयोग करना शुरू किया, तो मैंने एक पृष्ठ खोलने के बाद एक फीचर खोला। उदाहरण के लिए, अनुमान लगाने का प्रयास करें, जहां jooq manual अद्यतन और डिलीट स्टेटमेंट का वर्णन किया गया है, सामग्री को देख रहा है ... लेकिन यह वास्तव में व्यक्तिपरक है, मुझे विश्वास है। मैं यह भी समझा नहीं सकता, मेरे दृष्टिकोण से मैनुअल के साथ क्या गलत है। जब मैं, मैं एक या दो टिकट पोस्ट करेंगे कर सकते हैं;)

मैनुअल भी वास्तव में अच्छी तरह से नौगम्य के बाद से Trac कोई स्वचालित है "यहाँ, वहाँ और वापस" लिंक की तरह नहीं है।

ठीक है, मेरे लिए मास्को (रूस) Trac पन्नों में नहीं खुलता तेजी से भी मैनुअल पढ़ने के लिए थोड़ा उबाऊ है।

मैनुअल योगदानकर्ताओं के लिए jooq का एक अच्छा आर्किटेक्चर विवरण भी याद करता है। जुक डिज़ाइन-बाय-कॉन्ट्रैक्ट सिद्धांत का पालन करता है, ऐसा लगता है और जब मैं सीखना चाहता था कि आईडीई में कुछ विधि नाम पर मेरे सामान्य Ctrl-Click का उपयोग करके अंदर कुछ विशेषताओं को कैसे कार्यान्वित किया गया है, तो मैं बिना किसी कार्यान्वयन के एक सुस्त इंटरफ़ेस के अंदर समाप्त हुआ;) मैं तुरंत jooq में सुधार शुरू करने के लिए बहुत बुद्धिमान हूं, लेकिन निश्चित रूप से मैं यह समझने का आनंद लेगा कि वास्तव में जमीन से ऊपर तक आर्किटेक्चर किया गया है।

यह एक दया भी है कि हम मैनुअल jooq में योगदान नहीं कर सकता है। मुझे उम्मीद है कि यह किसी तरह की विकी में होगा।

क्या मैं भी सुधार करना चाहते हैं, the waynews are reported है। मैं वहां मैन्युअल से लिंक पसंद करूंगा या उदाहरण दूंगा कि यह या वह नई सुविधा कैसे काम करती है।

Release notes link in manual वास्तव में सिर्फ एक रूपरेखा है। मुझे लगता है, मैं कल खुद ही ऐसा करूँगा ...

जुक में वर्तमान में अपेक्षाकृत कम समुदाय भी है, लेकिन मुझे यह रिपोर्ट करने में खुशी है कि यह कोड की गुणवत्ता को प्रभावित नहीं करता है या जिस तरह से नई सुविधाएं पेश की जाती हैं।

जुक वास्तव में एक अच्छी परियोजना है। मैं अपनी भविष्य की परियोजनाओं के लिए भी इसके साथ रहूंगा। मुझे वास्तव में यह पसंद है।

+0

interresting पता करने के लिए! मुझे JOOQ भी पता नहीं था, मुझे लगता है कि मैं इसमें हस्तक्षेप नहीं कर रहा हूं (मैं संग्रहीत प्रक्रियाओं में सादे पुराने एसक्यूएल के लिए और अधिक विशिष्ट सुविधाओं का उपयोग करके एक डीबी के लिए अनुकूलित करता हूं) लेकिन ऐसा लगता है कि आपके विवरण से ओआरएम होना सही किया। यह बहुत आम है। तो JOOQ –

+1

@ निकोलस जुक में आपका स्वागत है ओआरएम नहीं है। –

+0

@FractalizeR 2 साल बाद, [ऐसा लगता है कि विकी सोचता है कि यह सभी के बाद एक ओआरएम है] (http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software) हालांकि,। – yair

0

यदि आप केवल एक SQL बिल्डर समाधान की तलाश में हैं। मेरे पास एक परियोजना है जो जावा के लिए एक ओआरएम ढांचा है लेकिन यह अभी भी समयपूर्व है और निरंतर विकास में हालांकि डेटाबेस के कई प्राचीन उपयोगों को संभालती है। https://github.com/ahmetalpbalkan/orman

इस चरण में कोई दस्तावेज़ीकरण नहीं है हालांकि यह केवल जावा श्रृंखला विधियों का उपयोग करके सुरक्षित क्वेरी बना सकता है और कई SQL संचालन को संभाल सकता है। यह क्रमशः टेबल-कॉलम में कक्षा-फ़ील्ड को मैप भी कर सकता है।

क्वेरी के लिए कोई नमूना क्वेरी इमारत आपरेशन है

SELECT COUNT(*) FROM sailors WHERE 
    rating>4 AND rating<9 GROUP BY rating HAVING AVG(age)>20; 

जावा कोड:

QueryBuilder qb = QueryBuilder.getBuilder(QueryType.SELECT); 
    System.out.println(qb 
      .from("sailors") 
      .where(
        C.and(
          C.gt("rating", 5), 
          C.lt("rating", 9))) 
      .groupBy("rating") 
      .having(
        C.gt(
          new OperationalField(QueryFieldOperation.AVG, 
        "age").toString(), 20) 
        ).getQuery()); 

(! LOL सिर्फ इतना है कि ढांचे के विकास छोड़ देना)

अधिकांश शायद उस काम नहीं करेगा आपके लिए लेकिन सिर्फ मेरी परियोजना की घोषणा करना चाहता था: पी

+0

आपका ढांचा मेरे लिए जेपीए/CriteriaQuery जैसा दिखता है। आपने अपना खुद का क्यों बनाया? जेपीए से यह अलग क्या है? –

+0

फिर jOOQ में योगदान क्यों नहीं करते? :) –

+0

मेरी परियोजना का मुख्य उद्देश्य जेपीए की तरह एनोटेशन संचालित ओआरएम बनाना है। QueryBuilder बस इसकी एक विशेषता है। यह jooq से अलग है। जैसा कि आपने कहा था कि 'jOOQ एक OR-mapper नहीं है।' लेकिन मेरा है। –

2

आप भी एक ले सकते हैं MentaBean पर देखें, हल्का ओआरएम और एसक्यूएल बिल्डर जो आपको बॉयलरप्लेट कोड के साथ बहुत मदद की पेशकश करने के लिए एसक्यूएल के रूप में संभव हो सकता है। यहाँ एक उदाहरण है:

प्रोग्रामेटिक विन्यास:

private BeanConfig getUserBeanConfig() { 

    // programmatic configuration for the bean... (no annotation or XML) 

    BeanConfig config = new BeanConfig(User.class, "Users"); 
    config.pk("id", DBTypes.AUTOINCREMENT); 
    config.field("username", DBTypes.STRING); 
    config.field("birthdate", "bd", DBTypes.DATE); // note that the database column name is different 
    config.field("status", new EnumValueType(User.Status.class)); 
    config.field("deleted", DBTypes.BOOLEANINT); 
    config.field("insertTime", "insert_time", DBTypes.TIMESTAMP).defaultToNow("insertTime"); 

    return config; 
} 

    // create table Users(id integer primary key auto_increment, 
    // username varchar(25), bd datetime, status varchar(20), 
    // deleted tinyint, insert_time timestamp) 

एक साधारण एसक्यूएल में शामिल होने क्वेरी:

Post p = new Post(1); 

StringBuilder query = new StringBuilder(256); 
query.append("select "); 
query.append(session.buildSelect(Post.class, "p")); 
query.append(", "); 
query.append(session.buildSelect(User.class, "u")); 
query.append(" from Posts p join Users u on p.user_id = u.id"); 
query.append(" where p.id = ?"); 

stmt = conn.prepareStatement(query.toString()); 
stmt.setInt(1, p.getId()); 

rset = stmt.executeQuery(); 

if (rset.next()) { 

    session.populateBean(rset, p, "p"); 

    u = new User(); 

    session.populateBean(rset, u, "u"); 

    p.setUser(u); 
}