سؤال

لتنفيذ كود الوصول إلى البيانات في تطبيقنا، نحتاج إلى بعض الإطارات للالتفاف حول jdbc (ORM ليس خيارنا، بسبب قابلية التوسع).

أروع إطار اعتدت العمل معه هو الربيع-Jdbc.ومع ذلك، فإن سياسة شركتي هي تجنب التبعيات الخارجية، وخاصة Spring وJ2EE وما إلى ذلك.لذلك نحن نفكر في كتابة إطار عمل jdbc سهل الاستخدام، مع وظائف مشابهة لـ Spring-jdbc:تعيين الصفوف، ومعالجة الأخطاء، ودعم ميزات Java5، ولكن بدون دعم المعاملات.

هل لدى أي شخص خبرة في كتابة إطار عمل jdbc هذا؟إذا كان لدى أي شخص خبرة في استخدام أطر عمل jdbc أخرى، فيرجى مشاركة تجربتك.

شكرا لك مقدما.

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

المحلول

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

  • لقد اعتنقنا SQL ولم نبذل أي محاولة لإخفائها.كان التعديل الوحيد هو إضافة دعم للمعلمات المسماة.تعد المعلمات مهمة لأننا لا نشجع استخدام SQL الفوري (لأسباب أمنية) ونستخدم دائمًا ReadyStatements.

  • لإدارة الاتصال، استخدمنا Apache DBCP.كان هذا مناسبًا في ذلك الوقت ولكن من غير الواضح مقدار ما هو مطلوب من خلال تطبيقات JDBC الحديثة (المستندات الخاصة بهذه الأشياء غير متوفرة).يقوم DBCP أيضًا بتجميع PreparedStatements.

  • لم نهتم بتعيين الصفوف.بدلاً من ذلك (للاستعلامات) استخدمنا شيئًا مشابهًا لـ ResultSetHandler الخاص بـ Apache dbutil، والذي يسمح لك "بتغذية" مجموعة النتائج في طريقة يمكنها بعد ذلك تفريغ المعلومات أينما تريد.يعد هذا أكثر مرونة، وفي الواقع لن يكون من الصعب تنفيذ ResultSetHandler لتعيين الصفوف.بالنسبة للإدخالات/التحديثات، أنشأنا فئة تسجيل عامة (في الأساس عبارة عن خريطة تصنيف مع بعض الأجراس والصفارات الإضافية).أكبر مشكلة في تعيين الصفوف (بالنسبة لنا) هي أنك ستتعثر بمجرد إجراء استعلام "مثير للاهتمام" لأنه قد يكون لديك حقول يتم تعيينها لفئات مختلفة؛لأنه قد يكون لديك بنية فئة هرمية ولكن مجموعة نتائج مسطحة؛أو لأن التعيين معقد ويعتمد على البيانات.

  • بنينا في تسجيل الأخطاء.لمعالجة الاستثناء:في الاستعلام، نقوم برصد الاستثناءات وتسجيلها، ولكن بالنسبة للتحديث، فإننا نقوم برصد الاستثناءات التي لم يتم التحقق منها وتسجيلها وإعادة طرحها.

  • لقد قدمنا ​​دعمًا للمعاملات باستخدام نهج المجمع.يوفر المتصل الرمز الذي ينفذ المعاملة، ونتأكد من إدارة المعاملة بشكل صحيح، مع عدم وجود فرصة لنسيان إنهاء المعاملة ومع التراجع ومعالجة الأخطاء المضمنة.

  • في وقت لاحق، أضفنا مخطط علاقة مبسطًا للغاية يسمح بتطبيق تحديث/إدراج واحد على السجل وجميع تبعياته.لتبسيط الأمور، لم نستخدم هذا في الاستعلامات، وقررنا على وجه التحديد عدم دعم ذلك بعمليات الحذف لأنه من الأكثر موثوقية استخدام عمليات الحذف المتتالية.

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

نصائح أخرى

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

وأنا واحد تفضل: Dalesbred . انها MIT مرخصة.

وهناك مثال بسيط من الحصول على كافة الصفوف لفئة مخصصة (وزارة).

List<Department> departments = db.findAll(Department.class,
    "select id, name from department");

وعندما يتم تعريف فئة مخصصة على النحو التالي:

public final class Department {
    private final int id;
    private final String name;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

تنويه: انها من قبل الشركة التي أعمل ل

.

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

وأن يقال، ما كنت حقا بحاجة لتكرار هو مفهوم JdbcTemplate وانها الاسترجاعات (PreparedStatementCreator، PreparedStatementCallback)، وكذلك RowMapper / RowCallbackHandler. فإنه لا ينبغي أن overcomplicated أن أكتب شيئا مثل هذا (ولا سيما بالنظر لم يكن لديك للقيام إدارة المعاملات).

وHowver، كما قلت، لماذا الكتابة عنها عندما يمكنك الحصول عليه مجانا وتعديل التعليمات البرمجية المصدر النحو الذي تراه مناسبا؟

JdbcSession من <أ href ل = "http://jdbc.jcabi.com/" يختلط = "نوفولو"> jcabi-جدبك. انها بسيطة كما ينبغي أن يكون JDBC، على سبيل المثال:

String name = new JdbcSession(source)
  .sql("SELECT name FROM foo WHERE id = ?")
  .set(123)
  .select(new SingleOutcome<String>(String.class));

وهذا كل شيء.

وmJDBC: https://mjdbc.github.io/

وأنا استخدامها لسنوات، وجدت أنه من المفيد جدا.

وهو مستوحى من مكتبة JDBI ولكن لا يوجد لديه تبعيات، ويضيف دعم المعاملات، توفر عدادات الأداء ويسمح للتبديل إلى أدنى مستوى ممكن SQL في جاوة (القديمة عادي JDBC API) بسهولة في حالة إذا كنت حقا في حاجة إليها.

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