Titik masuk pagination mybatis
Ada konsep plugin (plugin) di Mybatis, yang pada dasarnya merupakan ide interseptor. Analisis spesifik dapat ditemukan dalam penelitian tentang prinsip Mybatis Interceptor di artikel lain. Atas dasar ini, artikel ini akan secara langsung menampilkan kode implementasi proyek aktual dan analisis terkait lainnya.
Implementasi Kode Khusus Paging
Pertama kita dapat mendefinisikan kelas abstrak dialek untuk mengimplementasikan pagination abstractdialect.java
kelas abstrak publik abstrak abstrak { / *** apakah batas dan offset didukung* @return* / public abstrak boolean supportLimItoffset (); / ** * apakah batas didukung * @return */ public abstrak boolean supportLimit (); / ** * Dapatkan SQL setelah menambahkan atribut paging * @param sql * @param offset * @param Limit * @return */ public abstract string getLimitString (string sql, int offset, batas int);}Selain itu, kami akan mengimplementasikan teknologi paging halaman Oracle dan database MySQL secara terpisah.
Dialek pagination mysqldialect.java-mysql
kelas publik mysqldialect memperluas abstractdialect {public boolean mendukung slimitoffset () {return true; } public boolean mendukung () {return true; } public String getLimItString (String SQL, int offset, Int Limit) {if (offset> 0) {return sql + "limit" + offset + "," + limit; } else {return sql + "limit" + limit; }}}Oracledialect.java-oracle dialek implementasi
Public Class Oracledialect memperluas 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 = stringBuilder baru (100); PAGESQL.Append ("SELECT * DARI (SELECT TEMP. *, ROWNUM ROW_ID from ("); pagesql.append (sql); pagesql.append (") temp return pagesql.tostring (); }}Implementasi pencegat plug-in mybatis yang sesuai adalah sebagai berikut: Intercept Pernyataan Handller#Persiapan (koneksi con) untuk membuat metode objek pernyataan SQL
PaginationInterceptor.java
@Intercepts ({@Signature (type = SympationHandler.class, Method = "Persiapan", args = {connection.class})}) Public Class PaginationInterceptor Public Implements Interceptor {private final static logger log = loggerFactory .getLogger (paginationInceptor.class); dialek adialect pribadi; public void setDialect (adiialect dialect) {this.dialect = dialek; } @Override Public Object Intercept (Invocation Invocation) melempar Throwable {// Langsung dapatkan objek yang dicegat, yang mengimplementasikan kelas RoutingStateMenHandler Pernyataan Handller pernyataan = (Pernyataan Tulisan) Invocation .getTarget (); BoundSQL BoundSQL = Pernyataan Handler.getBoundSQL (); // Dapatkan metaObject, terutama digunakan untuk mendapatkan objek dan atribut yang terkait dengan pernyataan MetaObject MetastatementHandler = metaObject.forObject (Pernyataan Handler, New DefaultObjectFactory (), New DefaultObjectWrapperFactory ()); Mappedstatement mappedstmt = (mappedstatement) metastatementhandler .getValue ("delegate.mappedstatement" .intern ()); // Hanya memusuhi metode querypagination () if (mappedstmt.getId (). IndexOf ("querypagination") ==-1) {return invocation.proed (); } // Rekonstruksi paging SQL String Originalsql = (String) MetastatementHandler .getValue ("delegate.boundsql.sql" .intern ()); metastatementhandler.setValue ("delegate.boundsql.sql" .intern (), dialek .getlimitString (originalsql, rowbounds.getoffset (), rowbounds.getlimit ())); metastatementhandler.setValue ("delegate.rowbounds.offset" .intern (), rowbounds.no_row_offset); metastatementhandler.setValue ("delegate.rowbounds.limit" .intern (), rowbounds.no_row_limit); log.debug ("halaman sql:" + boundsql.getsql ()); Return Invocation.Proed (); } // Intercept Object @Override Plugin Objek Publik (Target Objek) {return plugin.wrap (target, this); } @Override public void setProperties (Properties Properties) {}}Konfigurasi XML pegas yang sesuai dapat sebagai berikut, mengambil pagination oracle sebagai contoh
<!-Oracle Dialect Configuration, Digunakan untuk Oracle Pagination-> <bean id = "paginationInterceptor"> <properti name = "dialek"> <bean/> </property> </ bean>
Gunakan kode dan konfigurasi di atas untuk menyelesaikan operasi pagination dari database Oracle dan database MySQL. Dan blogger menganalisis salah satu poin
MyBatis#MetaObject-Metadata Analisis Objek
Ketika blogger menggunakan kode di atas, ia bingung oleh kelas metaObject. Ini dapat secara langsung mendapatkan semua sifat terkait dari objek yang diproksi melalui metode getValue (). Kita dapat mengikuti kode sumber untuk mempelajari lebih lanjut
MetaObject#forObject()
Semua objek proxy masuk melalui metode statis ini
Public Static MetaObject ForObject (Object Object, ObjectFactory ObjectFactory, ObjectWraptoreFactory ObjectWraptoreFactory) {if (object == null) {return SystemMetaObject.null_meta_object; } else {return metaObject baru (objek, objekFactory, objectWrapperFactory); }}Kita dapat secara langsung mengamati konstruktor, inilah misteri
Private MetaObject (Object Object, ObjectFactory ObjectFactory, ObjectWrapperFactory ObjectWraptoryFactory) {this.originalObject = objek; this.ObjectFactory = ObjectFactory; this.objectwrapperfactory = ObjectWrapperFactory; // Semua akuisisi atribut diperoleh melalui kelas ObjectWrapper. Di sini, kami terutama menilai tipe objek objek yang proxyed if (objek instance dari objekwrapper) {this.objectwrapper = (objekwrapper) objek; } else if (objectwrapperfactory.haswrapperfor (object)) {this.objectwrapper = objectwrapperfactory.getWrapperfor (ini, objek); } else if (objek instance dari peta) {this.objectwrapper = new mapWrapper (this, (peta) objek); } lain jika (objek instance collection) {this.objectwrapper = new collectionWrapper (this, (collection) objek); } else {// yang sering kita gunakan adalah beanwrapper this.objectwrapper = beanwrapper baru (ini, objek); }}Untuk memahami lebih banyak infiltrat, kami terus menindaklanjuti, dan akhirnya kami belajar bahwa itu akan memanggil fungsi konstruktor dari kelas reflektor
Private Reflector (Class <?> Clazz) {type = clazz; // Dapatkan kelas konstruktor addDefaultConstructor (clazz); // Dapatkan metode GET Set AddGetMethods (clazz); // Dapatkan metode Set Set AddSetMethods (Clazz); // Dapatkan Properti Internal Set AddFields (Clazz); readablePropertynames = getMethods.keyset (). toarray (string baru [getMethods.keyset (). size ()]); writeablePropertynames = setMethods.keyset (). toarray (string baru [setMethods.keyset (). size ()]); untuk (string propname: readablePropertynames) {caseinsensitivePropermap.put (propname.touppercase (locale.english), propname); } untuk (string propname: writeablePropertynames) {caseinsensitivePropermap.put (propname.touppercase (locale.English), propName); }} Dari sini kita dapat mengetahui bahwa menggunakan kelas proxy reflektor dan metaObject, Anda dapat melintasi semua atribut yang terkait dengan kelas proxy. Ambil kelas RoutingStatementHandler sebagai contoh. Setelah operasi di atas, Anda dapat mengakses delegasi atribut internal dan atribut internal dari configuration/objectFactory/typeHandlerRegistry/resultSetHandler/parameterHandler/mappedStatement dan atribut lainnya.
MetaObject#getValue()
Di atas menjelaskan cara proxy properti internal kelas proxy. Kami juga dapat melihat secara singkat cara menyebutnya dengan benar.
Objek publik getValue (nama string) {// PropertyTokenizer mirip dengan StringTokenizer, kecuali bahwa yang pertama ditulis sebagai pembatas propertitokenizer prop = new PropertyTokenizer (name); if (prop.hasnext ()) {metaObject metavalue = metaObjectForproperty (prop.getIndexedName ()); if (metavalue == SystemMetaObject.null_meta_object) {return null; } else {return metavalue.getValue (prop.getchildren ()); }} else {return objectwrapper.get (prop); }} Analisis spesifik tidak akan dijelaskan di sini. Cara memperoleh string SQL yang dimiliki oleh Pernyataan Tulisan dapat diperoleh dengan getValue("delegate.boundSql.sql") dan atribut di dalamnya harus berupa atribut internal (sensitif kasus).
MetaObject#setValue()
Prinsipnya sama dengan metode MetaObject#getValue()
Meringkaskan
Di atas adalah tutorial tentang penggunaan plug-in paging Spring Mybatis yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!