Java Programming - الربيع و JDBCTEMPLATE - استخدام الاستعلام، QueryForlist أو QueryForropet؟

StackOverflow https://stackoverflow.com/questions/1660756

سؤال

يستخدم مشروع Java (JDK6) الخريف و JDBCTEMPLATE. لجميع وصول قاعدة البيانات الخاصة به. لقد قمت مؤخرا بالترقية من الربيع 2.5 إلى الربيع 3 (RC1). المشروع لا يستخدم orm مثل بيات شتوى ولا EJB.

إذا كنت بحاجة إلى قراءة مجموعة من السجلات، وقم ببعض المعالجة الداخلية معهم، يبدو أن هناك عدة طرق (مثقلة): الاستعلام، QueryForlist و QueryForrowSet

ما يجب أن يكون المعايير لاستخدام واحد بدلا من الآخر؟ هل هناك أي اختلافات أداء؟ أفضل الممارسات؟

هل يمكنك أن تنصح ببعض المراجع الخارجية لمزيد من البحث في هذا الموضوع؟

هل كانت مفيدة؟

المحلول

أجد أن الطريقة القياسية للوصول إلى القائمة هي عبر query() الأساليب بدلا من أي من النهج الأخرى. الفرق الرئيسي بين query والطرق الأخرى هي أنه يجب عليك تنفيذ أحد واجهات رد الاتصال (إما RowMapper, RowCallbackHandler, ، أو ResultSetExtractor) للتعامل مع مجموعة النتائج الخاصة بك.

أ RowMapper من المرجح أن تجد نفسك باستخدام معظم الوقت. يتم استخدامه عندما يتوافق كل صف من مجموعة النتائج مع كائن واحد في قائمتك. يجب عليك فقط تنفيذ طريقة واحدة mapRow حيث تقوم بتعبئة نوع الكائن الذي يذهب في صفك وإعادته. الربيع لديه أيضا BeanPropertyRowMapper والتي يمكن أن تملأ الكائنات في قائمة عبر مطابقة أسماء خاصية الفول إلى أسماء الأعمدة (NB هذه الفئة مخصصة للراحة وليس الأداء).

أ RowCallbackHandler هو أكثر فائدة عندما تحتاج إلى نتائجك لتكون أكثر من مجرد قائمة بسيطة. سيكون عليك إدارة كائن الإرجاع بنفسك أنك تستخدم هذا النهج. أجد نفسي عادة استخدام هذا عندما أحتاج إلى بنية خريطة كوعي عودتي (أي لبيانات مجمعة لجدول شجرة أو إذا قمت بإنشاء ذاكرة التخزين المؤقت مخصصة بناء على المفتاح الأساسي).

أ ResultSetExtractor يستخدم عندما تريد التحكم في تكرار النتائج. أنت تصدر طريقة واحدة extractData ستكون هذه هي قيمة الإرجاع للاتصال query. وبعد أجد نفسي فقط استخدام هذا إذا كان لدي لبناء بعض بنية بيانات مخصصة أكثر تعقيدا للبناء باستخدام أي من واجهات الاتصال الأخرى.

ال queryForList() الأساليب ذات قيمة لا تضطر إلى تنفيذ طرق رد الاتصال هذه. هناك طريقتان تستخدمان QueryForlist. الأول هو إذا كنت تسليم عمود واحد فقط من قاعدة البيانات (على سبيل المثال قائمة السلاسل)، يمكنك استخدام إصدارات الأسلوب التي تأخذ فئة كوسيطة لتزويدك تلقائيا بقائمة الكائنات فقط من هذه الفئات وبعد

عند استدعاء التطبيقات الأخرى queryForList() ستحصل على قائمة مرة أخرى مع كل إدخال يجري خريطة لكل عمود. في حين أن هذا لطيف في أنك تم حفظ حساب كتابة طرق رد الاتصال، فإن التعامل مع بنية البيانات هذا غير عملي للغاية. ستجد نفسك تفعل الكثير من الصب منذ قيم الخريطة من النوع Object.

أنا فعلا لم أر قط queryForRowSet الأساليب المستخدمة في البرية. سيؤدي ذلك إلى تحميل النتيجة بأكملها للاستعلام في CachedRowSet كائن متوهج بواسطة sqlrowset الربيع. أرى الجانب السلبي الكبير في استخدام هذا الكائن في ذلك إذا كنت تمر SqlRowSet حولها إلى طبقات طلبك الأخرى، فأنت توصل تلك الطبقات إلى تطبيق الوصول إلى بياناتك.

يجب ألا ترى أي فروق ذات أداء ضخمة بين أي من هذه المكالمات إلا كما ذكرت مع BeanPropertyRowMapper. وبعد إذا كنت تعمل مع بعض التلاعب المعقدة مجموعة نتيجة كبيرة، فقد تكون قادرا على الحصول على بعض مكاسب الأداء من كتابة الأمثل ResultSetExtractor لحالتك الخاصة.

إذا كنت ترغب في معرفة المزيد سأشاور وثائق الربيع JDBC. و ال جافادوك للفصول التي ذكرتها. وبعد يمكنك أيضا إلقاء نظرة على بعض الكتب في إطار الربيع. على الرغم من أنها مؤرخة بعض الشيء تطوير جافا مع الإطار الربيعي لديه قسم جيد جدا للعمل مع إطار JDBC. الأهم من ذلك كله، أود أن أقول فقط محاولة كتابة بعض الكود مع كل طريقة ومعرفة ما يعمل بشكل أفضل بالنسبة لك.

نصائح أخرى

نظرا لأنك في الأراضي الجنراء الرائعة، فإن ما قد ترغب حقا في القيام به هو استخدامه SimpleJdbcTemplate واستخدامها query() طرق ل Lists من الأشياء و queryForObject() للأشياء الفردية. التفكير لهذا ببساطة هو أنه من الأسهل استخدامها من تلك الموجودة في JdbcTemplate.

إضافة واحدة صغيرة إلى الإجابات الممتازة أعلاه: طرق إضافية مثل QueryForint، QueryForlong، QueryFormap، QueryForObject، إلخ. قد تبدو مثل خيارات جيدة في بعض الأحيان إذا كنت تقوم بتشغيل استعلام بسيط ونتوقع صف واحد.

ومع ذلك، إذا تمكنت من الحصول على 0 أو 1 صفوف مرة أخرى، فإن طريقة QueryForlist أسهل بشكل عام، وإلا فستضطر إلى التقاط غير صحيحة ResultSizeActaaccessExcepecce. تعلمت هذا بصعوبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top