نقطة دخول MyBatis ترقيم ترقيم الصفحات
هناك مفهوم للمكونات الإضافية (الإضافات) في MyBatis ، والتي هي في الأساس فكرة اعتراضية. يمكن العثور على التحليل المحدد في البحث عن مبدأ اعتراض MyBatis في مقال آخر. على هذا الأساس ، ستعرض هذه المقالة مباشرة رمز التنفيذ للمشروع الفعلي والتحليلات الأخرى ذات الصلة.
ترحيل تنفيذ رمز محدد
أولاً ، يمكننا تحديد الفئة المجردة لهيجات لتنفيذ ترقيم الصفحات.
فئة التجريدية العامة الملخصي { / *** ما إذا كان الحد والإزاحة مدعوم* @return* / Public Abstract Boolean SupportLimitOffset () ؛ / ** * ما إذا كان الحد مدعوم * return */ Public Abstract Boolean SupportLimit () ؛ / ** * احصل على SQL بعد إضافة سمات الترحيل * param sql * param إزاحة * param limit * return */ public string getLimitString (String SQL ، int strims ، int) ؛}علاوة على ذلك ، سنقوم بتنفيذ تقنية ترحيل الصفحة في قاعدة بيانات Oracle و MySQL بشكل منفصل.
mysqldialect.java-mysql لهجة ترقيم الصفحات
الطبقة العامة mySqLdialect تمتد ملخص {public boolean supportslimitoffset () {return true ؛ } boolean supportslimit () {return true ؛ } السلسلة العامة getLimitString (سلسلة SQL ، int الإزاحة ، حد int) {if (Offset> 0) {return sql + "limit" + offset + "،" + limit ؛ } آخر {return sql + "limit" + limit ؛ }}}oracledialect.java-oracle تنفيذ لهجة
الطبقة العامة oracledialect يمتد adialect {Override public boolean supportlimitoffset () {return false ؛ } Override Public Boolean SupportLimit () {return false ؛ } Override public string getLimitString (String SQL ، int start ، int limit) {if (start <0) {start = 0 ؛ } if (limit <0) {limit = 10 ؛ } StringBuilder pagesql = new StringBuilder (100) ؛ pagesql.append ("SELECT * FROM (SELECT TEMP. * ، ROWNUM ROW_ID FROM (") ؛ pagesql.append (sql) ؛ pagesql.append (") temp where rownum <=") .Append (start+limit) ؛ إرجاع pagesql.toString () ؛ }}تطبيق MyBatis Plug-in Interceptor المقابل هو كما يلي: Intercept stitptshandler#إعداد (Connection Con) لإنشاء طريقة كائن عبارة SQL
ترقيم الصفحات
intercepts ({signature (type = stittleHandler.class ، method = "prepared" ، args = {connection.class})}) paginiTinterce paginition paginistor pinceptor {private final static log = loggerfactory .getLogger (paginationInterceptor.class) ؛ لهجة adialect الخاصة. public void setDialect (لهجة adialect) {this.dialect = لهجة ؛ } Override اعتراض الكائن العام (استدعاء الاستدعاء) يلقي رمي {// الحصول مباشرة على الكائن المعترض ، والذي ينفذ routingStateMentHandler itsithHandler = (stittleHandler) الاحتجاج .getTarget () ؛ BODEDSQL BODEDSQL = stitpleHandler.getBoundSQL () ؛ // احصل على metaObject ، يستخدم بشكل أساسي للحصول على الكائن والسمات المرتبطة بـ metaObject MetaObject MetaObjecting = metaObject.ForObject (stitplehandler ، new DefaultObjectFactory () ، defaultObjectWrapperFactory ()) ؛ medpedStatement mappedStMt = (mappedStatement) metastatementHandler .getValue ("depegate.mappedStatement" .Intern ()) ؛ // فقط paginate the QueryPagination () method if (medpedStMt.getId (). indexof ("QueryPagination") ==-1) {return invocation.proceed () ؛ }. metastatementHandler.setValue ("devate.boundsql.sql" .Intern () ، لهجة .getLimitSstring (OriginalsQl ، RowBoundSoffset () ، RowboundS.getLimit ())) ؛ metastatementHandler.setValue ("depegate.rowbounds.offset" .Intern () ، rowbounds.no_row_offset) ؛ metastatementHandler.setValue ("depegate.rowbounds.limit" .Intern () ، rowbounds.no_row_limit) ؛ log.debug ("page sql:" + boundsql.getsql ()) ؛ إرجاع invocation.proceed () ؛ }. } Override public void setProperties (خصائص الخصائص) {}}يمكن أن يكون تكوين XML المقابل في الربيع كما يلي ، مع مرور ترقيم Oracle كمثال
<!-تكوين لهجة Oracle ، يستخدم لترقيم Oracle-> <bean id = "paginationInterceptor"> <property name = "dialect"
استخدم الكود أعلاه والتكوين لإكمال عملية ترقيم الصفحات لقاعدة بيانات Oracle وقاعدة بيانات MySQL. ويقوم المدون بتحليل إحدى النقاط
MyBatis#MetaObject-metadata تحليل كائن
عندما استخدم المدون الكود أعلاه ، كان في حيرة من خلال فئة MetaObject. يمكن أن تحصل مباشرة على جميع الخصائص المرتبطة بالكائن الذي يجري الوكيل من خلال طريقة getValue (). يمكننا اتباع رمز المصدر لمعرفة المزيد
MetaObject#forObject()
جميع كائنات الوكيل تدخل من خلال هذه الطريقة الثابتة
public metaObject foroBject (كائن كائن ، ObjectFactory ، ObjectWrapperFactory ObjectWrapperFactory) {if (object == null) {return systemmetaobject.null_meta_object ؛ } else {return new metaObject (object ، objectFactory ، ObjectWrapperFactory) ؛ }}يمكننا مراقبة المُنشئ مباشرة ، وإليك اللغز
metaObject الخاص (كائن كائن ، ObjectFactory ، ObjectWrapperFactory ObjectWrapperFactory) {this.originalObject = Object ؛ this.objectFactory = ObjectFactory ؛ this.objectWrapperFactory = ObjectWrapperFactory ؛ // يتم الحصول على جميع عمليات الاستحواذ على السمات من خلال فئة ObjectWrapper. هنا ، نحكم بشكل أساسي على نوع الكائن الكائن الذي يتم وكيله إذا (Object outivewhwrapper) {this.ObjectWrapper = (ObjectWrapper) ؛ } آخر إذا (objectWrapperFactory.hasWrapperfor (Object)) {this.ObjectWrapper = ObjectWrapperFactory.getWrapperfor (this ، Object) ؛ } آخر إذا (Object eastyof map) {this.objectWrapper = new MapWrapper (this ، (map) object) ؛ } آخر إذا (outust extryof collection) {this.objectWrapper = new CollectionWrapper (this ، (collection) object) ؛ } آخر {// ما نستخدمه كثيرًا هو BeanWrapper this.objectWrapper = new BeanWrapper (هذا ، الكائن) ؛ }}لفهم المزيد من التسلل ، نستمر في المتابعة ، وأخيراً علمنا أنه سيطلق على وظيفة المنشئ لفئة العاكس
عاكس خاص (فئة <؟> clazz) {type = clazz ؛ // احصل على فئة المنشئ AddDefaultConstructor (clazz) ؛ // الحصول على طريقة الحصول على مجموعة addgetMethods (clazz) ؛ // احصل على طريقة SET SET ADDSetMethods (clazz) ؛ // احصل على مجموعة الممتلكات الداخلية AddFields (Clazz) ؛ readablePropertyNames = getMethods.KeySet (). critablePropertyNames = setMethods.KeySet (). لـ (string propname: readablePropertyNames) {caseIntivitivePropertyMap.put (propname.touppercase (locale.english) ، propname) ؛ } لـ (string propname: dritablePropertyNames) {caseinsitivePropertyMap.put (propname.touppercase (locale.english) ، propname) ؛ }} من هذا ، يمكننا أن نعرف أنه باستخدام فئة Proxy العاكس و metaObject ، يمكنك اجتياز جميع السمات المرتبطة بفئة الوكيل. خذ فئة RoutingStatementHandler كمثال. بعد العملية أعلاه ، يمكنك الوصول إلى مندوب السمة الداخلية والسمات الداخلية configuration/objectFactory/typeHandlerRegistry/resultSetHandler/parameterHandler/mappedStatement والسمات الأخرى.
MetaObject#getValue()
ما سبق يشرح كيفية تكييف الخصائص الداخلية لفئة الوكيل. يمكننا أيضًا إلقاء نظرة موجزة على كيفية تسميتها بشكل صحيح.
الكائن العام getValue (اسم السلسلة) {// propertyTokenizer يشبه StringTokenizer ، باستثناء أن الأول مكتوب على أنه PropertyTokenizer Proper = new propertyTokenizer (name) ؛ if (prop.hasnext ()) {metaObject metavalue = metaObjectForProperty (prop.getIndExedName ()) ؛ if (metavalue == systemmetaobject.null_meta_object) {return null ؛ } آخر {return metavalue.getValue (prop.getChildren ()) ؛ }} آخر {return ObjectWrapper.get (prop) ؛ }} لن يتم شرح التحليل المحدد هنا. يمكن الحصول على سلسلة SQL المملوكة لـ SQL بواسطة itshandler بواسطة getValue("delegate.boundSql.sql") ويجب أن تكون السمات الموجودة فيه سمات داخلية (حساسة للحالة).
MetaObject#setValue()
المبدأ هو نفس طريقة MetaObject#getValue()
لخص
ما سبق هو البرنامج التعليمي حول استخدام مكون الإضافات الربيع MyBatis Paging المقدمة لك من قبل المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!