ملاحظة: تختلف هذه المدونة تمامًا عن المكون الإضافي الحالي لـ Paging ، لذلك يوصى بالتحقق من أحدث رمز مصدر ووثائق من خلال عنوان المشروع أعلاه لفهمه.
لقد شعرت بالقلق من استعلام ترقيم صفحات MyBatis من قبل ، وقد بحثت عن العديد من المقالات ذات الصلة عبر الإنترنت ، لكنني لم أستخدم آخر مقالات. يكتب المكان المليء بالكامل بخط اليد مع SQL و Count SQL ، وهو أمر مزعج للغاية.
في وقت لاحق ، لفترة من الوقت ، أردت أن أكتب تنفيذ ترقيم الصفحات من داخل MyBatis. كتبت تنفيذًا لـ LanguagedRiver. لا توجد مشكلة في ترقيم الترقيم التلقائي ، ولكن لا يزال لا يمكن حل العدد الإجمالي للاستعلامات (العد) في وقت واحد ، وقد تركت دون حل.
في الآونة الأخيرة ، لا بد لي من استخدام ترقيم الصفحات مرة أخرى. من أجل الراحة ، لا بد لي من كتابة فصل تراجع عام ، لذلك أشير إلى معظم رموز تراجع MyBatis على الإنترنت مرة أخرى.
في الواقع ، منذ فترة طويلة ، فتح شخص ما تنفيذ المصدر على Github ، ودعم MySQL ، و Oracle ، و SQLServer ، والذي يشبه المرجع أعلاه وله اعتبار أكثر شمولاً. لكنني أعتقد أن العديد من الفصول الدراسية مزعجة للغاية ، لذلك قمت بتطبيق فصل مع اعتراض واحد فقط ، والذي يمكن تقسيمه بالفعل إلى فئتين. تمت كتابة أحد الفصول الدراسية كطبقة ثابتة من قبلي ووضعها في المعترض. يمكنك أيضًا استخراج فئة الصفحة لتسهيل استخدام الصفحة.
دعنا نتحدث عن طريقة التنفيذ أولاً. يحتوي هذا المكون الإضافي على فئة واحدة فقط: pagehelper.java
توقيع التقاطع هو:
intercepts ({ @signature (type = ittuplehandler.class ، method = "prepared" ، args = {connection.class}) ، signature (type = resultsethandler.class ، method = "HandlerSultSets" ، args = {state.class})})التوقيع هنا أمر بالغ الأهمية للتنفيذ والفكرة بأكملها. أولاً ، أقوم باعتراض طريقة التحضير لتغيير ترقيم الصفحات SQL و DO COUNT QUERY. ثم أقوم باعتراض طريقة المعالجات للحصول على نتيجة المعالجة الأخيرة ووضع النتيجة في كائن الصفحة.
ما يلي هو الرمز لتعديل الصفحة ، وهو تعديل لبيانات Oracle. إذا كنت تستخدم قواعد بيانات أخرى ، فيمكنك تعديل الكود هنا بنفسك.
/ ** * تعديل SQL الأصلي إلى pagination SQL * param sql * param page * regurn */ private String BuildPagesQl (سلسلة SQL ، الصفحة) {StringBuilder pagesql = new StringBuilder (200) ؛ pagesql.append ("SELECT * FROM (SELECT TEMP. * ، ROWNUM ROW_ID FROM (") ؛ pagesql.append (sql) ؛ pagesql.append (") temp where rownum <=") .append (page.getendrow ()) ؛ pagesql.append (") where row_id>"). إرجاع pagesql.toString () ؛ } بعد ذلك ، في طريقة SetPageParameter التالية ، يجب تعديل عبارة CONSE SELECT وفقًا لنوع قاعدة البيانات:
// إجمالي عدد السجلات COUNTSQL = "SELECT COUNT (0) من (" + SQL + ")" ؛لماذا لا أقدم الدعم لمختلف قواعد البيانات؟ لا أعتقد أنه ضروري. لا تدعم بعض قواعد البيانات الترحيل ، وكلما كان هذا المكون الإضافي أكثر بساطة ، كلما كان من الأسهل أن يفهم المطورون وتعديلهم. تعديله في استعلام الصفحات الذي تحتاجه ليس بالتأكيد مشكلة.
أخيرًا ، تتم إضافة الرمز الكامل (تابع القراءة ، هناك أيضًا طريقة الاستخدام أدناه): (انقر للتنزيل)
حزمة com.mybatis.util ؛ استيراد org.apache.ibatis.executor.parameter.parameterHandler ؛ استيراد org.apache.ibatis.executor.ResultSet.ResultSethandler ؛ استيراد org.apache.ibatis.executor.statement.statementHandler ؛ استيراد org.apache.ibatis.mapping.boundsql ؛ استيراد org.apache.ibatis.mapping.mappedStatement ؛ استيراد org.apache.ibatis.plugin.*؛ استيراد org.apache.ibatis.reflection.metaObject ؛ استيراد org.apache.ibatis.reflection.SystemMetAobject ؛ استيراد org.apache.ibatis.scripting.defaults.defaultParameterHandler ؛ استيراد org.apache.log4j.logger ؛ استيراد java.sql.*؛ استيراد java.util.list ؛ استيراد java.util.properties ؛ /*** MyBatis-اعتراض ترقيم الصفحات العالمي* Author liuzh/abel533/isea* تم إنشاؤه بواسطة liuzh في 14-4-15. */ intercepts ({ @signature (type = stittionHandler.class ، method = "prepared" ، args = {connection.class}) ، signature (type = resultsethandler.class ، method = "handlerSultSets" ، args = {state.class}) public pagiper pagehelper {private private static logger = logger.getLogger (pagehelper.class) ؛ Public Static Final ThreadLocal <Page> localpage = new threadlocal <age> () ؛ / ** * ابدأ الترحيل * param pagenum * paramize */ public static void startPage (int pagenum ، int pagesize) {localpage.set (صفحة جديدة (pagenum ، pagesize)) ؛ } /*** إنهاء الترحيل وإرجاع النتيجة. يجب استدعاء الطريقة ، وإلا سيتم حفظ صفحة Local -Page حتى صفحة البداية التالية * @Return */ public static page page () {page page = localpage.get () ؛ localpage.remove () ؛ صفحة العودة ؛ } Override اعتراض الكائن العام (استدعاء الاستدعاء) يلقي رمي {if (localPage.get () == null) {return invocation.proceed () ؛ } if (invocation.getTarget () مثيل ittureHandler) {stittleHandler itshandler = (ittureHandler) invocation.getTarget () ؛ metaObject MetastatementHandler = SystemMetaObject.foroBject (stittleHandler) ؛ // افصل سلسلة كائن الوكيل (لأنه قد يتم اعتراض الفئة المستهدفة بواسطة اعتراضات متعددة ، يتم تشكيل وكيل متعدد ، ويمكن فصل الحلقتين التاليتين // فئة الهدف الأكثر بدائية) بينما (metastateMentHandler.hasgetter ("H")) {Object = metastatementhandhandlerler.getvalue ("H") ؛ metastatementHandler = SystemMetaObject.foroBject (Object) ؛ } // الفئة الهدف التي تفصل كائن الوكيل الأخير بينما (metastatementHandler.hasgetter ("Target")) {Object = metastatementHandler.getValue ("Target") ؛ metastatementHandler = SystemMetaObject.foroBject (Object) ؛ } mappedStatement MedpedStatement = (mappedStatement) metastateMentHandler.getValue ("depegate.mappedStatement") ؛ // معلومات الصفحة if (localPage.get ()! = null) {page page = localPage.get () ؛ BODEDSQL BODEDSQL = (BONDSQL) MELTARTATEMTHERD.GETVALUE ("devate.boundsql") ؛ // page parameter كخاصية من parameterObject parametring sql = boundsql.getsql () ؛ // rewrite sql string pagesql = buildpagesql (sql ، page) ؛ // إعادة كتابة الترحيل sql metastatementhandler.setValue ("depegate.boundsql.sql" ، pagesql) ؛ اتصال الاتصال = (اتصال) invocation.getargs () [0] ؛ // إعادة تعيين العدد الإجمالي للصفحات في معلمات الترحيل ، إلخ // تسليم حقوق التنفيذ إلى Instroping invocation.proceed () ؛ } if if (invocation.getTarget () estructionof resultsethandler) {object result = invocation.proceed () ؛ صفحة الصفحة = localPage.get () ؛ page.setResult ((قائمة) نتيجة) ؛ نتيجة العودة } إرجاع فارغ ؛ } / ** * فقط اعتراض هذين النوعين من * stateHandler * ResultSethandler * @Param Target * regurn * / Override Public Object Plugin (Object Target) {if (target stateHandler || target extaleof resultshandler) {return plugin.wrap (target ، this) ؛ } آخر {return target ؛ }} Override public void setProperties (خصائص الخصائص) {} / ** * تعديل SQL الأصلي إلى pagination sql * param sql * @param page * regurn * / private string buildpagesql (String SQL ، page page) {StringBuilder pageql = pagesql.append ("SELECT * FROM (SELECT TEMP. * ، ROWNUM ROW_ID FROM (") ؛ pagesql.append (sql) ؛ pagesql.append (") temp where rownum <=") .append (page.getendrow ()) ؛ pagesql.append (") where row_id>"). إرجاع pagesql.toString () ؛ } / ** * احصل على العدد الإجمالي للسجلات * param sql * param connection * param medpedStatement * param boundsql * param page * / private void setPageParameter (String sql ، connection connection ، mappedstatement medpedstatement ، boundsql boundsql ، page page) ")" ؛ reparedStatement countStmt = null ؛ resultset rs = null ؛ حاول {countStmt = connection.preparestatement (countsql) ؛ countbs boundsql = new BONDSQL (MEPTSTATEMTEMTEMTEMNED.GETCONFIGURATION () ، COUNTSQL ، BONDSQL.GetParamEterMappings () ، BONDSQL.GetParameterObject ()) ؛ setParameters (CountStmt ، MapPedStatement ، countbs ، boundsql.getParameterObject ()) ؛ rs = countStmt.executequery () ؛ int totalCount = 0 ؛ if (rs.next ()) {totalCount = rs.getInt (1) ؛ } page.SetTotal (TotalCount) ؛ int totalpage = totalCount / page.getPagesize () + ((TotalCount ٪ page.getPagesize () == 0)؟ 0: 1) ؛ page.setpages (TotalPage) ؛ } catch (sqlexception e) {logger.error ("تجاهل هذا الاستثناء" ، e) ؛ } أخيرًا {try {rs.close () ؛ } catch (sqlexception e) {logger.error ("تجاهل هذا الاستثناء" ، e) ؛ } حاول {countStmt.Close () ؛ } catch (sqlexception e) {logger.error ("تجاهل هذا الاستثناء" ، e) ؛ }}} / ** * قيمة المعلمة البديلة * param ps * param medpedStatement * param boundsql * param parameterObject DefaultParameterHandler (MapPedStatement ، parameterObject ، BoundSQL) ؛ parameterHandler.setParameters (PS) ؛ } / ** * الوصف: تراجع * المؤلف: liuzh * تحديث: liuzh (2014-04-16 10:56) * / public static class page <e> {private int pagenum ؛ pagesize pagesize ؛ int int startrow ؛ خاص int endrow ؛ إجمالي خاص طويل ؛ صفحات int الخاصة ؛ قائمة خاصة <e> النتيجة ؛ الصفحة العامة (int pagenum ، int pagesize) {this.pagenum = pagenum ؛ this.pagesize = pagesize ؛ this.startrow = pagenum> 0؟ (Pagenum - 1) * pagesize: 0 ؛ this.endrow = pagenum * pagesize ؛ } القائمة العامة <e> getResult () {return return ؛ } public void setResult (list <e> result) {this.result = result ؛ } public int getPages () {return pages ؛ } public void setPages (int pages) {this.pages = pages ؛ } public int getendrow () {return endRow ؛ } public void setendRow (int endrow) {this.endRow = endRow ؛ } public int getPagenum () {return pagenum ؛ } public void setPagenum (int pagenum) {this.pagenum = pagenum ؛ } public int getPagesize () {return pagesize ؛ } public void setPagesize (int pagesize) {this.pagesize = pagesize ؛ } public int getStarTrow () {return startrow ؛ } public void setStarTrow (int startrow) {this.startrow = startrow ؛ } public long getTotal () {return total ؛ } public void settotal (total total) {this.total = total ؛ } Override public string toString () {return "page {" + "pagenum =" + pagenum + "، pagesizeize =" + pagesize + "، startrow =" + startrow + "، endRow =" + endrow + "، total =" + total + "، pages =" + pages + '}' ؛ }}} لاستخدام هذا التقاطع ، تحتاج أولاً إلى تكوين التقاطع في تكوين MyBatis:
<uccedins> <plugin interceptor = "com.mybatis.util.pageHelper"> </sultwin> </sugionins>
عند تكوين اعتراض ، تحتاج إلى الانتباه إلى موقع الإضافات. ترتيب الإضافات كما يلي:
الخصائص؟ ، الإعدادات؟ ، typealiases؟ ، typehandlers؟ ، objectFactory؟
أخيرًا ، هناك رمز المثال (طبقة الخدمة) يدعو هذه الطريقة:
Override public pagehelper.page <SysLoginLog> FindSysLoginLog (تسجيل الدخول إلى سلسلة ، اسم المستخدم ، Logindate ، exitdate سلسلة ، سلسلة logerr ، int pagenumber ، int pagesize) رمي الأعمال التجارية sysloginlogmapper.findsysloginlog (loginip ، اسم المستخدم ، logindate ، exitdate ، logerr) ؛ إرجاع pagehelper.endpage () ؛ }
مما سبق ، يمكننا أن نرى أن استخدام هذا المكون الإضافي بسيط للغاية. تحتاج فقط إلى استخدام أساليب STARTPAGE و SENDPAGE لـ PAGE HELPER قبل وبعد الاستعلام. توجد نتيجة استدعاء الكود الوسيط بالفعل في نتيجة Heelper. إذا قمت باستدعاء Pagehelper في مكان يعيد النتيجة ، فإن النتيجة التي تم إرجاعها لا تزال قائمة ، ويمكنك فقط أخذ القيمة الأولى (أعتقد أن لا أحد سيستخدمها مثل هذا في هذا المكان ، بالطبع لا يوجد خطأ بهذه الطريقة).
بالإضافة إلى ذلك ، سيتم ربط جميع رموز MyBatis بين STARTPAGE و PAGEDAGE ، وسيحتفظ HELPER فقط بالنتيجة الأخيرة. لذلك ، عند استخدامه ، تحتاج إلى التأكد من تنفيذ استعلام MyBatis واحد فقط فيه في وقت واحد. إذا كان هناك العديد من الترحيل ، فيرجى استخدام صفحة البدء والحفرة الداخلية عدة مرات.
نظرًا لأن تطبيقات Oracle فقط يتم توفيرها هنا ، آمل أن يمكن للقراء الذين يشيرون إلى قواعد البيانات الأخرى التي ينفذها هذا البرنامج المساعد Parting فتح رمز المقابلة.
عنوان المشروع: http://xiazai.vevb.com/201612/yuanma/mybatis_pagehelper_jb51.zip
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.