تعد مشكلة الترحيل مشكلة شائعة جدًا سيواجهها جميع المطورين تقريبًا، ولن أناقش هنا كيفية إجراء الترحيل على وجه التحديد، ولكنني سأشرح مبدأ الترحيل في وضع الويب. الأول هو الاستعلام للحصول على مجموعة النتائج (كما هو موضح في النتائج التي تم الحصول عليها من الاستعلام عن قاعدة البيانات). إذا كان هناك العديد من النتائج، فلن نعرض عمومًا جميع البيانات مرة واحدة، ثم سنستخدم الترحيل لعرض بيانات معينة (مثل). مثل 20 مادة). نظرًا لطبيعة HTTP عديمة الحالة، يتم التعامل مع كل إرسال على أنه طلب جديد. حتى إذا تم تغيير الصفحة، فإن النتيجة الأخيرة ليس لها أي تأثير على النتيجة التالية.
فيما يلي ثلاث طرق لتنفيذ الترحيل، ولا أعرف إذا كان هناك أي طرق أخرى!
1. الحصول على كافة بيانات نتائج الاستعلام في كل مرة، ومن ثم عرض السجلات المحددة حسب رقم الصفحة.
2. احصل على صفحة واحدة فقط من البيانات بناءً على الصفحة، ثم اعرض هذه الصفحة. هنا تحتاج إلى إنشاء عبارة SQL.
3. يعتبر أخذ عدد معين من صفحات البيانات بمثابة حل وسط بين الاثنين السابقين.
وما يجب ملاحظته هنا أيضًا هو ما إذا كانت البيانات قد تم وضعها في الطلب أو الجلسة، والتي سيتم مناقشتها واحدة تلو الأخرى هنا.
1. بشكل عام لن يتم وضعه في الجلسة لأنه سيشغل مساحة كبيرة من الذاكرة، لذلك يجب وضعه في الطلب.
المزايا: التنفيذ بسيط نسبيًا وسرعة الاستعلام سريعة نسبيًا.
العيوب: يستهلك مساحة أكبر من الذاكرة وينقل الكثير من البيانات عبر الشبكة.
تعد هذه الطريقة أكثر ملاءمة للاستعلامات التي تحتوي على كميات صغيرة نسبيًا من البيانات. يقوم بعض الأشخاص هنا بوضع البيانات في الجلسة بحيث لا تكون هناك حاجة لإعادة الاستعلام عند تغيير الصفحات، ومع ذلك، فإن هذا أمر سيء للغاية ويوصى بشدة بعدم استخدامه بهذه الطريقة.
2. بالتأكيد لن يتم وضعها في الجلسة، لأنه لا معنى لوضعها في الجلسة.
المزايا: يستهلك ذاكرة أقل.
العيوب: إنه أكثر إزعاجًا، يجب عليك أولاً الحصول على العدد الإجمالي لنتائج الاستعلام، لأنك تحتاج إلى معرفة عدد السجلات الموجودة لمعرفة عدد الصفحات الموجودة. بالإضافة إلى ذلك، من الضروري إنشاء بيان استعلام ترحيل الصفحات، والذي يختلف باختلاف قواعد البيانات.
3. يجب وضع هذا الموقف في الجلسة، وإلا فلماذا أقوم بإحضار عدة صفحات؟ هذا التنفيذ هو لتقليل عدد استعلامات قاعدة البيانات، على سبيل المثال، إذا قمت بحفظ السجلات من 1 إلى 10، فعند تغيير الصفحات، إذا كان بين 1 و 10 يمكن الحصول عليها مباشرة من الجلسة. إذا قمت بالتغيير إلى الصفحة 11، فيمكنني إعادة تعيين ذاكرة التخزين المؤقت إلى 11
20 صفحة من البيانات (أو من 5 إلى 15 صفحة من البيانات)، وفي هذه الحالة، يلزم إجراء عملية استعلام قاعدة بيانات واحدة فقط لإجراء 10 تغييرات.
المزايا: يستهلك ذاكرة قليلة نسبيًا ويحسن متوسط سرعة الاستعلام.
العيوب: يعد التنفيذ أكثر تعقيدًا، وقد توجد بيانات قذرة، وتحتاج إلى تحديد مجموعة ذاكرة التخزين المؤقت بنفسك. إذا كانت كمية البيانات التي تم الاستعلام عنها كبيرة نسبيًا، فيمكنك التفكير في استخدام هذه الطريقة.
يحصل التصميم التالي على صفحة واحدة فقط من البيانات في كل مرة، ويجب إعادة تعيين العدد الإجمالي للاستعلامات في كل مرة. كيفية تنفيذ ذلك بنفسك؟ هذا تطبيق شائع نسبيًا.
تصميم الواجهة هنا:
package Treeroot.util;import java.util.List;/*** يتم استخدام هذه الواجهة لتنفيذ وظيفة الترحيل، لاحظ أنه لا يتم توفير وظيفة تعديل هنا. * @author Treerot* @version 1.0* @since 2004-9-30*/public Interface Pageable{ /** * الحصول على نتائج البيانات* @return */ public List getResult(); * @return */ public int getCount(); /** * احصل على عدد السجلات لكل صفحة* @return */ public int getPageSize(); int getCurrentPage(); /** * احصل على العدد الإجمالي للصفحات* @return */ public int getPages() /** * العدد الافتراضي للسجلات المعروضة في كل صفحة*/ public Final static int DEFAULT_PAGESIZE=20;} هذه الواجهة بسيطة للغاية وتتضمن قائمة النتائج وبعض المعلومات الضرورية للترحيل. لاحظ بعض النقاط هنا:
1. يمثل تنفيذ هذه الواجهة صفحة معينة من البيانات في استعلام معين، وليس لها علاقة بالاستعلام الأخير.
2. يجب أن يكون تنفيذ هذه الواجهة للقراءة فقط، مما يعني أنه لا يمكن تعديلها.
3. طريقة getPages () زائدة عن الحاجة، ولكن هذه الطريقة لا تزال متوفرة هنا.
ويرد أدناه تنفيذ مجردة:
package Treeroot.util;import java.util.List;/*** @author Treerot* @version 1.0* @since 2004-9-30*/public Abstract class AbstractPage Implements Pageable{ Private int currentPage; عدد الصفحات المحمية؛ نتيجة القائمة المحمية /** * تحديد الصفحة الحالية* @param currentPage * @throws PageException */ public AbstractPage(int currentPage){ this(currentPage,Pageable.DEFAULT_PAGESIZE); } /** * تحديد الصفحة الحالية وحجم الصفحة* @param currentPage * @param pageSize * @throws PageException */ public AbstractPage(int currentPage,int pageSize) { this.currentPage=currentPage this.pageSize=pageSize } checkPage المحمي باطلة (int currentPage) يطرح PageException { if((currentPage<1)||(currentPage>this.getPages())) طرح PageException("الصفحة خارج النطاق: إجمالي عدد الصفحات هو"+this.getPages()+"، الصفحة الحالية هي " +currentPage); } /** * يتم تجاوز هذه الطريقة بواسطة الفئة الفرعية للتهيئة، أي لحساب قيمة العد والنتيجة، ويتم استدعاؤها في مُنشئ الفئة الفرعية. */ مجردة محمية باطل init () يطرح PageException؛ public List getResult() { return result; } public int getCount() { return count } public int getPageSize() { return pageSize } public int getCurrentPage() { return currentPage; } public int getPages() { if(pages==0) this.pages=(count+pageSize-1)/pageSize return الصفحات }}تنفذ هذه الفئة المجردة جميع الأساليب في الواجهة، ولكنها تحدد طريقة مجردة init()، والتي يجب تنفيذها في الفئات الفرعية. تبدو الواجهة المذكورة أعلاه والفئات المجردة بسيطة نسبيًا، وقد تشعر أنها لا تفعل شيئًا في الواقع، ولكنها لا تفعل شيئًا من حيث التنفيذ، ولكنها يمكن أن تقدم مساعدة كبيرة في التطوير. يمكننا أن نرث هذه الفئة المجردة وفقًا لاحتياجاتنا الخاصة، ويمكن الحصول على البيانات بطرق مختلفة، مثل مباشرة من خلال القائمة، أو من خلال JDBC، والإسبات، وما إلى ذلك، ولكننا جميعًا بحاجة إلى تغليف النتائج في قائمة. من خلال السبات يبدو مناسبًا بشكل خاص.
PageException هو استثناء مخصص
package Treeroot.util /*** @author Treeroot* @version 1.0* @since 2004-9-30*/public class PageException Extends Exception{ public PageException(){ super(); } public PageException(String message){ super( رسالة)؛ }}