مقدمة
عندما تشارك الجداول في تطوير الويب ، مثل DataTable ، ستنشأ الحاجة إلى الترحيل. عادةً ما نقسم طرق الترحيل إلى نوعين: الترحيل الأمامي والترحيل الخلفي.
ترقيم الصفحات الأمامية
يتم طلب جميع السجلات (AJAX) في جدول البيانات في وقت واحد ، ثم يتم تخزينها مؤقتًا على الواجهة الأمامية وحساب العدد والترحيل. بشكل عام ، ستوفر المكونات الأمامية (مثل DataTable) إجراءات الترحيل.
الميزات هي: بسيطة ، مناسبة للغاية لمنصات الويب الصغيرة ؛ ستنشأ مشاكل الأداء عندما تكون كمية البيانات كبيرة ، وسوف يكون وقت الاستعلام ونقل الشبكة طويلًا.
ترقيم الصفحات الخلفية
حدد رقم الصفحة (Pagenum) وحجم كل صفحة (Pagesize) في طلب AJAX. تتميز الواجهة الخلفية ببيانات الصفحة وإرجاعها ، والواجهة الأمامية هي المسؤولة فقط عن التقديم.
الميزات هي: أكثر تعقيدًا ؛ عنق الزجاجة الأداء في أداء الاستعلام عن MySQL ، والذي يمكن بالطبع تحسينه وحله. بشكل عام ، يستخدم تطوير الويب هذه الطريقة.
نحن نتحدث عن ترقيم الصفحات الخلفية.
دعم MySQL لترقيم الصفحات
ببساطة ، يدعم MySQL ترقيم الصفحات من خلال جملة الحد. يرجى الاطلاع على المثال أدناه.
استخدام الكلمة الرئيسية الحد هو
الحد [الإزاحة ،] الصفوف
الإزاحة هي الإزاحة بالنسبة للصف الأول (الصف الأول هو 0) ، والصفوف هي عدد الصفوف.
# كل صفحة لديها 10 سجلات ، تأخذ الصفحة الأولى ، وإرجاع السجلات العشرة الأولى SELECT * من الحد الأقصى للوحدة 0،10 ؛# كل صفحة تحتوي على 10 سجلات ، خذ الصفحة الثانية ، وأرجع السجل الحادي عشر ، إلى السجل العشرين ، حدد * من Tablea Limit 10،10 ؛
ما أريد أن أذكره هنا هو أنه عندما يتعامل MySQL مع ترقيم الصفحات:
الحد من 1000،10 - تصفية 1010 قطعة من البيانات ، ثم تجاهل 1000 قطعة ، واحتفظ بها 10 قطع. عندما يكون الإزاحة كبيرة ، سينخفض الأداء.
الحد من 100000،10 - سيتم تصفية 10W+10 قطع من البيانات ، ثم تجاهل أول 10 واط. إذا وجدت مشاكل في الأداء في ترقيم الصفحات ، فيمكنك ضبطها وفقًا لهذه الفكرة.
mybatis paging paginhelper helper
عند استخدام Java Spring Development ، تعد MyBatis أداة قوية لعمليات قاعدة البيانات. ومع ذلك ، عند التعامل مع الترحيل ، ليس لدى MyBatis أي طرق خاصة. بشكل عام ، تحتاج إلى كتابة جملة الحد بنفسك لتنفيذها ، وهو مكلف نسبيًا. لحسن الحظ ، هناك مكون إضافي للصفحات.
1. تبعية بوم
لن أذكر تكوين MyBatis. تبعيات Helper هي كما يلي. إذا كنت بحاجة إلى إصدار جديد ، يمكنك الاختيار على Maven
<Rependency> <roupeD> com.github.pageHelper </rougiD> <intifactid> pagehelper </stifactid> <sophy> 4.1.4 </version> </sependency>
2. تكوين mybatis من helper
افتح ملف تكوين MyBatis ، عادةً ضمن مسار المورد. اسمي MyBatis-config.xml.
<؟ تمكين أو تعطيل ذاكرة التخزين المؤقت. -> <setting name = "cacheenabled" value = "true"/> <!-تمكين أو تعطيل التحميل كسول على مستوى العالم. عند تعطيلها ، يتم تحميل جميع الكائنات المرتبطة على الفور. -> <setting name = "lazyloadingEnabled" value = "true"/> <!-عند تمكينه ، سيقوم كائن مع خاصية تحميل كسول بتحميل أي خاصية تمامًا عند استدعاءها. خلاف ذلك ، سيتم تحميل كل خاصية حسب الحاجة. -> <setting name = "aggressivelazyloading" value = "true"/> <!-سواء للسماح لـ SQL واحد بإرجاع مجموعات بيانات متعددة (اعتمادًا على توافق السائق) الافتراضي: TRUE-> <STETTER NAME = "MultiplerSultSetSenabled" value = "true"/> <! name = "useColumnLabel" value = "true"/> <!- اسمح JDBC بإنشاء مفاتيح أساسية. مطلوب دعم محرك الأقراص. إذا تم تعيين هذا الإعداد ، فسيؤدي هذا الإعداد إلى إجبار المفتاح الأساسي الذي تم إنشاؤه على ذلك ، فإن بعض محركات الأقراص غير متوافقة ولكن لا يزال من الممكن تنفيذها. الافتراضي: false-> <setting name = "usegeneratedkeys" value = "true"/> <!-حدد كيف يقوم MyBatis بتخطيط أعمدة قاعدة البيانات تلقائيًا من جدول البيانات لا شيء: لا تحجب الجزئي: جزء كامل: all-> <setting name = execution may execution extruction ؛ extructions extrement ؛ execution may reuse extrement ؛ execution may extension ؛ عبارات وتحديثات الدُفعات)-> <Setting Name = "DefaultExecutortype" value = "Simple"/> <!-تحويل الحقول باستخدام تسميات الإبل. -> <Setting Name = "mapundersCoretOcamElcase" value = "true"/> <!-إعداد نطاق نطاق ذاكرة التخزين المؤقت المحلي: سيكون هناك بيان لمشاركة البيانات: نطاق البيانات (لن يكون هذا مشاركة البيانات) defalut: session-> <setting name = "localcachescope" value = "session"/> <! اكتب عند إدراج قيمة خالية -> <setting name = "jdbctypefornull" value = "null"/> </settings> <plugins> <plugin interceptor = "com.github.pageHelper.pageHelper"> <property name = "dialect" value = "mysql"/> name = "rowboundswithcount" value = "false"/> <property name = "pagesizezero" value = "true"/> <property name = "alcature" value = "false"/> <property name = "supportMethodSarguments
ما تحتاج إلى الانتباه إليه هنا هو التكوين المتعلق بـ Pagehelper.
إذا لم تقم بتحميل ملف تكوين MyBatis ، فأنت تستخدم التكوين الافتراضي MyBatis. كيفية تحميل ملف تكوين MyBatis؟
انتقل إلى تكوين DatasRouce الخاص بك.
عند تكوين SQLSessionFactory ، حدد ملف التكوين الأساسي MyBatis ومسار Mapper ، فإن الكود كما يلي
bean (name = "moonlightsqlsessionfactory") primary public sqlsessionfactory moonlightsqlsessionfactory (Qalifier ("moonlightdata) dataSource dataSource) يرمي استثناء Bean.setDataSource (DataSource) ؛ Bean.setMapperLocations (New PathmatchingResourceTornResolver (). getResources ("classpath: mybatis-mapper/*. Bean.setConfigLocation (classPathResource جديد ("MyBatis-config.xml")) ؛ return Bean.getObject () ؛ }يوضح:
مسار تخزين mapper.xml الذي تم تكوينه هنا في مجلد Resource/MyBatis-Mapper
ملف mybatis-config.xml الذي تم تكوينه هنا ضمن الموارد/
3. ترقيم الصفحات
قم بإعداد mapper.xml ، فقط اكتب واحدة للاختبار ، ما عليك سوى استخدام واحدة من المشروع.
هذا الاستعلام هنا هو استفسار متعدد الوصلات. ما يتعين علينا القيام به هو تراجع السجلات التي تطابقها شروط متعددة.
<؟ Namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geofencelist" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <dructructor> <edarg column = "id" jdbctype = "integer" /> <arg column = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "type" javatype = "java.lang.integer" jdbctype = "integer" /> jdbctype = "varchar" /> <arg column = "geo" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "createTime" javatype = "java.lang.tring javatype = "java.lang.string" jdbctype = "varchar"/> </structructor> </srome regup> <sql id = "base_column"> id ، name ، type ، `group` ، geo ، createTime ، updateTime </sql> <select id =" queryofence parametertype = "com.kangaroo.studio.moonlight.dao.model.geofencequeryparam" resultMap = "Geofencelist"> حدد <تضمين refid = "base_column"/> من geofence حيث 1 = 1 <test = "type! concat ('٪' ، #{name} ، '٪') </if> <if test = "group! = null"> و `group` يعجبني concat ('٪' ، #{group} ، '٪') </frate> <entert =" entertim </If> </rection> </pkypper>اكتب الطرق المقابلة في واجهة mapper.java
قائمة <Geofence> QueryGeoFence (GeofenceQueryParam GeofenceQueryParam) ؛
أولاً ، أضف رمز الصفحة ثم اشرحه لاحقًا
requestmapping (value = "/fence/query" ، method = requestMethod.post) reponsebody public Queryfence ( @rquestbody geofencequeryparam geofencequeryparam) {try {Integer pagenum = geofencequeryparam.getpagenum ()! = null؟ integer pagesize = geofencequeryparam.getPagesize ()! = null؟ geofencequeryparam.getPagesize (): 10 ؛ pagehelper.startPage (pagenum ، pagesize) ؛ قائمة <Geofence> list = moonlightmapper.querygeofence (GeoFenceQueryParam) ؛ إرجاع استجابة جديدة (resultcode.sccess ، "Query Geofence Success" ، List) ؛ } catch (استثناء e) {logger.error ("فشل الاستعلام الجغرافي" ، e) ؛ إرجاع استجابة جديدة (resultcode.exception ، "فشل الاستعلام الجيولوجي" ، فارغة) ؛ }}يوضح:
1. ميزة Heelper هي أن ترقيم الصفحات و mapper.xml منفصلة تمامًا. تتمثل طريقة التنفيذ في تعزيز عملية تنفيذ MyBatis في شكل مكون إضافي ، وإضافة إجمالي عدد الاستعلامات والحد. ينتمي إلى الصفحة المادية.
2. هناك مشكلة أمنية تحتاج إلى الانتباه إليها ، وإلا فقد تؤدي إلى اضطراب الترحيل. لقد قمت بلصق مباشرة مقطع من هذه المدونة هنا.
4. متى سيؤدي ذلك إلى ترحيل غير آمن؟
تستخدم طريقة Helper معلمة ترابط ثابت ، وترتبط معلمات الترحيل والمواضيع.
طالما يمكنك التأكد من أن طريقة Heelper تسمى على الفور تليها طريقة الاستعلام MyBatis ، فهذا آمن. نظرًا لأن Helper يقوم تلقائيًا بمسح الكائن المخزن ThreadLocal في المقتطف أخيرًا.
في حالة حدوث استثناء قبل إدخال المنفذ ، لن يكون مؤشر الترابط متاحًا ، وهو خطأ بشري (مثل عدم التطابق بين طريقة الواجهة و XML ، مما سيؤدي إلى عدم العثور على المعتاد). لن يتسبب هذا الموقف في استخدام المعلمة threadlocal بشكل غير صحيح بسبب عدم توفر مؤشر الترابط.
ولكن إذا كتبت الكود التالي ، فهو استخدام غير آمن:
pageHelper.StartPage (1 ، 10) ؛ قائمة <Country> list ؛ if (param1! = null) {list = countrymapper.selectif (param1) ؛} else {list = new ArrayList <Towner> () ؛}في هذه الحالة ، نظرًا لأن Param1 لديه NULL ، فإن Helper ستنتج معلمة ترحيل ، ولكنها لا يتم استهلاكها ، وستبقى هذه المعلمة على هذا الموضوع. عند استخدام هذا الموضوع مرة أخرى ، قد يتسبب ذلك في طرق لا ينبغي أن تستهلكها لاستهلاك معلمات الترحيل ، مما يؤدي إلى ترحيل لا يمكن تفسيره.
يجب كتابة الرمز أعلاه على النحو التالي:
قائمة <Tearric> list ؛ if (param1! = null) {pagehelper.startPage (1 ، 10) ؛ list = countrymapper.selectif (param1) ؛} else {list = new ArrayList <Towner> () ؛}طريقة الكتابة هذه يمكن أن تضمن السلامة.
إذا لم تكن مرتاحًا مع هذا ، فيمكنك تنظيف معلمات الترحيل المخزنة يدويًا في Threadlocal ، والتي يمكن استخدامها مثل هذا:
قائمة <Tearric> list ؛ if (param1! = null) {pagehelper.startPage (1 ، 10) ؛ حاول {list = countrymapper.selectall () ؛ } أخيرًا {pagehelper.clearpage () ؛ }} آخر {list = new ArrayList <Towner> () ؛}ليس من الجيد أن تكتب مثل هذا ، وليس من الضروري.
لخص
ما ورد أعلاه هو التكوين والاستخدام البسيط للمكون من Pagin Pagin Pagin Paginper الذي قدمه لك المحرر (الموصى به). آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!