في بداية المشروع ، كنت بحاجة إلى استخدام ترحيل MyBatis. قرأت الكثير من المكونات الإضافية عبر الإنترنت. في الواقع ، فإن مبادئ التنفيذ هي نفسها في الأساس ، ولكن معظمها يعطي فقط رمزًا ولديه تعليقات غير مكتملة. لذلك أشرت إلى العديد من المقالات (كل مقالة تسرق رمزًا صغيرًا ، وتقييمها ، وتقييمها شبه) ، ثم قمت بتقليدها وكتبت مكونًا إضافيًا مناسبًا لمشروعي. دون مزيد من اللغط ، لقد قمت فقط بتحميل الرمز. مقارنة بمعظم المقالات ، فإن التعليقات التوضيحية كاملة للغاية.
أهم اعتراض
حزمة com.dnkx.Interceptor ؛ استيراد java.sql.*؛ استيراد java.util.hashmap ؛ استيراد java.util.properties ؛ استيراد 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.Interceptor ؛ استيراد org.apache.ibatis.plugin.Intercepts ؛ استيراد org.apache.ibatis.plugin.invocation ؛ استيراد org.apache.ibatis.plugin.plugin ؛ استيراد org.apache.ibatis.plugin.signature ؛ استيراد org.apache.ibatis.reflection.metaObject ؛ استيراد org.apache.ibatis.reflection.SystemMetAobject ؛ استيراد com.dnkx.pojo.page ؛ /** * * اعتراض ترقيم الصفحات ، يستخدم لاعتراض العمليات التي تتطلب استعلام الترحيل ثم تراجعها. * يتم تنفيذ مبدأ ترحيل MyBatis باستخدام المعترضات: * لاستخدام JDBC للعمل على قاعدة البيانات ، يجب أن يكون لديك كائن عبارة مقابلة. قبل تنفيذ MyBatis عبارة SQL ، ستقوم بإنشاء كائن بيان يحتوي على عبارة SQL ، ويتم إنشاء عبارة SQL المقابلة* قبل البيان ، حتى نتمكن من البدء ببيان SQL المستخدم لإنشاء البيان قبل إنشاء البيان. في عبارة بيان MyBatis يتم إنشاؤها بواسطة طريقة إعداد * لكائن RoutingStateMentHandler. لذلك ، فإن إحدى الأفكار الخاصة باستخدام اعتراض لتنفيذ ترحيل MyBatis هو اعتراض طريقة إعداد واجهة HOHDFACE ، ثم تغيير عبارة SQL إلى عبارة الاستعلام المقابلة SQL في طريقة الاعتراض ، ثم استدعاء طريقة إعداد كائن * stateHandler ، أي استدعاء call.proceed (). * بالنسبة إلى ترقيم الصفحات ، فإن إحدى العمليات التي يتعين علينا القيام بها في الاعتراض هو حساب إجمالي عدد السجلات التي تلبي الشروط الحالية. هذا هو عن طريق الحصول على عبارة SQL الأصلية ، وتغييره إلى البيان الإحصائي المقابل ، ثم استبدال المعلمات في عبارة SQL باستخدام المعلمات المغلفة MyBatis ومعلمات الإعداد *. بعد ذلك ، يتم تنفيذ عبارة SQL التي تستفسر عن عدد السجلات لحساب إجمالي عدد السجلات. ** اشرح العديد من الفئات التي يمكن استخدامها في المكون الإضافي:* metaObject: فئة مقدمة من myBatis استنادًا إلى كائن يعيد قيمة الخاصية* BODEDSQL: في هذا ، يمكنك الحصول على SQL لتنفيذها في ملف XM من التعرف على التعريف. MyBatis Memory Paging. * parameterHandler: يتم استخدامه في MyBatis لاستبدال القيمة التي تظهر في SQL. * * Author li xiaogui 9 نوفمبر ، 2016 10:59:04 */ intercepts ({signature (type = ittureHandler.class ، method = "prepared" ، args = {connection.class}) ، signature (type = resultshandler.class Interceptor {// اعتراض الكلمة الرئيسية للترحيب الخاصة بسلسلة نهائية ثابتة SELECT_ID = "page" ؛ // سوف يحل الرمز الذي يتم تشغيله بواسطة المكون الإضافي محل الطريقة الأصلية وإعادة كتابة أهم اعتراض الكائنات العامة اعتراضية (استدعاء الاستدعاء) {if (invocation.getTarget () مثيل attureHandler) {// here here لدينا إعداد Query يحتوي على صفحة ، appet stay in in to to the moth statehandler = () metaObject metaObject = SystemMetaObject.foroBject (stittleHandler) ؛ medpedStatement MedpedStatement = (mappedStatement) metaObject.getValue ("depegate.mappedStatement") ؛ String selectId = mapPedStatement.getId () ؛ String methodName = selectId.SubString (selectId.lastIndexof (".")+1) .ToLowerCase () ؛ // ثم الحكم إذا تم تضمين الصفحة ، احصل على sql if (methorname.contains (select_id)) {boundsql boundsql = (boundsql) metaObject.getValue ("devate.boundsql") ؛ // pagination parameter هي خاصية لـ parameterObject string sql = boundsql.getsql () ؛ System.out.println ("GET SQL:"+SQL) ؛ HashMap <string ، Object> map = (hashmap <string ، Object>) (boundsql.getParameterObject ()) ؛ // صفحة الصفحة = (صفحة) (boundsql.getParameterObject ()) ؛ صفحة الصفحة = (صفحة) map.get ("صفحة") ؛ // rewrite sql string countsql = concatcountsql (sql) ؛ سلسلة pagesql = concatpagesql (sql ، page) ؛ // system.out.println ("rewrite count sql:"+countsql) ؛ System.out.println ("إعادة كتابة SQL:"+pagesql) ؛ اتصال الاتصال = (اتصال) invocation.getargs () [0] ؛ reparedStatement countStmt = null ؛ resultset rs = null ؛ int totalCount = 0 ؛ حاول {countStmt = connection.preparestatement (countsql) ؛ rs = countStmt.executequery () ؛ if (rs.next ()) {totalCount = rs.getInt (1) ؛ }} catch (sqlexception e) {system.out.println ("تجاهل هذا الاستثناء"+e) ؛ } أخيرًا {try {rs.close () ؛ countstmt.close () ؛ } catch (sqlexception e) {system.out.println ("تجاهل هذا الاستثناء"+e) ؛ }} metaObject.setValue ("depegate.boundsql.sql" ، pagesql) ؛ // bind Count page.setNumCount (TotalCount) ؛ }} return invocation.proceed () ؛ }. } آخر {return target ؛ }} Override public void setProperties (خصائص الخصائص) {} // Renovate SQL Public String ConcatCountSql (String SQL) {// StringBuffer SB = New StringBuffer ("" حدد عدد (*) من ") ؛ /*SQL=SQL.TOLOWERCASE () ؛ if (sql.lastindexof ("order")> sql.lastindexof ("))) {sb.append (sql.substring (sql.indexof (" from ")+4 ، sql.lastindexof (" order ")))) ؛ } آخر {sb.append (sql.substring (sql.indexof ("from")+4)) ؛ }*/ stringBuffer sb = new StringBuffer () ؛ sql = sql.toLowerCase () ؛ if (sql.lastindexof ("order")> 0) {sql = sql.substring (0 ، sql.indexof ("order")) ؛ } sb.append ("حدد العد (*) من ("+sql+") tmp") ؛ إرجاع sb.tostring () ؛ } السلسلة العامة concatpagesql (سلسلة SQL ، صفحة الصفحة) {StringBuffer SB = جديد StringBuffer () ؛ SB.Append (SQL) ؛ sb.append ("limit") .append (page.getPagebegin ()). إلحاق ("،") .append (page.getPagesize ()) ؛ إرجاع sb.tostring () ؛ }} فئة الصفحة [java] عرض copypackage com.dnkx.pojo ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ / ** * * صف ترقيم الصفحات الدراسية المساعدة * Author Li Xiaogui 9 نوفمبر ، 2016 13:55:37 */ صفحة الطبقة العامة { ) PageBegin ؛ // Start Position private int numCount ؛ // إجمالي عدد int pagetotal الخاص ؛ // إجمالي عدد السلسلة الخاصة Orderfield = "" ؛ public page () {} الصفحة العامة (int pagesize ، int pageCurrentPage) {super () ؛ this.pagesize = pagesize ؛ this.pageCurrentPage = pageCurrentPage ؛ } الصفحة العامة (خريطة <سلسلة ، سلسلة> خريطة) {if (map.get ("pagenum")! = null) {this.setPageCurrentPage (this.pageCurrentPage = integer.parseint (map.get ("pagenum"))) ؛ if (map.get ("numperpage")! = null) {this.setpagesize (integer.parseint (map.get ("numperpage"))) ؛ } if (map.get ("orderdirection")! = null) {this.setorderDirection (map.get ("orderdirection")) ؛ }} public int getPageCurrentPage () {return pageCurrentPage ؛ } public void setPageCurrentPage (int pageCurrentPage) {this.pageCurrentPage = pageCurrentPage ؛ } public int getNumCount () {return numCount ؛ } public void setNumCount (int numCount) {this.numCount = numCount ؛ } public int getPageTotal () {return (numCount ٪ pagesize> 0)؟ (numCount/pagesize+1) :( numCount/pagesize) ؛ } public void setPageTotal (int pagetotal) {this.pageTotal = pagetotal ؛ } public int getPagesize () {return pagesize ؛ } public void setPagesize (int pagesize) {this.pagesize = pagesize ؛ } public int getPagebegin () {return pagesize*(pageCurrentPage-1) ؛ } public void setPagebegin (int pageBegin) {this.pagebegin = pageBegin ؛ } السلسلة العامة getorderfield () {return orderfield ؛ } public void setorderfield (string orderfield) {this.orderfield = orderfield ؛ } السلسلة العامة getorderDirection () {return orderdirection ؛ } public void setorderDirection (string orderdirection) {this.orderDirection = OrderDirection ؛ } getPage page static getPage (int pagesize ، int pageCurrentPage) {إرجاع الصفحة الجديدة (pagesize ، pageCurrentPage) ؛ } الصفحة الثابتة العامة getPage (خريطة الخريطة) {إرجاع الصفحة الجديدة (الخريطة) ؛ }}طريقة الاتصال في وحدة التحكم
قائمة السلسلة العامة (طلب httpservletrequest) {long a = system.currentTimeMillis () ؛ HashMap <String ، Object> map = getRequestMap.getMap (request) ؛ map.put (map.get ("orderfield")+"" ، map.get ("orderdirection")) ؛ قائمة <evelope> list = perfectervice.getListPage (MAP) ؛ request.setattribute ("emlist" ، list) ؛ request.setattribute ("page" ، page) ؛ request.setAttribute ("Map" ، MAP) ؛ // الحصول على صفات الصفات ذات الصلة page.getNumCount () ؛ // إجمالي عدد الصفحات page.getPageTotal () ؛ // إجمالي عدد الصفحات الطويلة B = System.CurrentTimeMillis () ؛ System.out.println ("--------------- يستهلك الوقت:"+(BA)+"MS") ؛ إرجاع "basic/effectee_list" ؛ }أخيرًا ، قم بتكوين المكون الإضافي في الربيع
<bean id = "pageInterctor"> < /bean> <!-يتم دمج الربيع و myBatis تمامًا ، وليس هناك حاجة إلى ملف تعيين تكوين myBatis-> <bean id = "sqlsessionfactory"> <property name = "dataSource" ref = "datasource" /> <! value = "classpath: com/dnkx/mapping/*.
حسنًا ، هذه هي النهاية ، هذه المقالة هي للرجوع إليها فقط! نتطلع إلى نصيحة الله العظيم