Di awal proyek, saya perlu menggunakan paging mybatis. Saya membaca banyak plug-in online. Faktanya, prinsip -prinsip implementasi pada dasarnya sama, tetapi kebanyakan dari mereka hanya memberikan kode dan memiliki anotasi yang tidak lengkap. Jadi saya merujuk ke banyak artikel (setiap artikel mencuri sedikit kode, mengevaluasi milik saya, dan semi-plagiisasinya), dan kemudian saya meniru dan menulis plug-in paging yang cocok untuk proyek saya. Tanpa basa -basi lagi, saya baru saja mengunggah kode. Dibandingkan dengan sebagian besar artikel, anotasi sangat lengkap.
Pencegat terpenting
paket com.dnkx.interceptor; impor java.sql.*; impor java.util.hashmap; impor java.util.properties; impor org.apache.ibatis.executor.resultset.resultsetHandler; impor org.apache.ibatis.executor.statement.statementhandler; impor org.apache.ibatis.mapping.boundsql; impor org.apache.ibatis.mapping.mappedStatement; impor org.apache.ibatis.plugin.interceptor; impor org.apache.ibatis.plugin.intercepts; impor org.apache.iatis.plugin.invocation; impor org.apache.ibatis.plugin.plugin; impor org.apache.iatis.plugin.signature; impor org.apache.ibatis.reflection.metaObject; impor org.apache.ibatis.reflection.systemmetaObject; impor com.dnkx.pojo.page; /** * * Pagination Interceptor, digunakan untuk mencegat operasi yang membutuhkan kueri paging dan kemudian memberi paginasikan. * Prinsip paging mybatis diimplementasikan menggunakan pencegat: * untuk menggunakan JDBC untuk beroperasi pada database, Anda harus memiliki objek pernyataan yang sesuai. Sebelum MyBatis menjalankan pernyataan SQL, itu akan menghasilkan objek pernyataan yang berisi pernyataan SQL, dan pernyataan SQL yang sesuai* dihasilkan sebelum pernyataan, sehingga kita dapat mulai dengan pernyataan SQL yang digunakan untuk menghasilkan pernyataan sebelum menghasilkan pernyataan. Dalam pernyataan MyBatis Pernyataan dihasilkan oleh * Metode Persiapan dari Objek RoutingStatementHandler. Oleh karena itu, salah satu ide untuk menggunakan interseptor untuk mengimplementasikan paging mybatis adalah untuk mencegat metode persiapan dari antarmuka Pernyataan Penajian, dan kemudian mengubah pernyataan SQL ke dalam pernyataan SQL kueri pagination yang sesuai dalam metode pencegat, dan kemudian memanggil metode persiapan objek * Pernyataan Penjara, yaitu doa panggilan. (). * Untuk pagination, salah satu operasi yang perlu kita lakukan di Interceptor adalah menghitung jumlah total catatan yang memenuhi persyaratan saat ini. Ini dengan mendapatkan pernyataan SQL asli, mengubahnya ke pernyataan statistik yang sesuai, dan kemudian mengganti parameter dalam pernyataan SQL menggunakan parameter yang dienkapsulasi MyBatis dan pengaturan * parameter. Kemudian, pernyataan SQL menanyakan jumlah catatan dieksekusi untuk menghitung jumlah total catatan. ** Jelaskan beberapa kelas yang dapat digunakan dalam plug-in:* MetaObject: Kelas yang disediakan oleh Mybatis berdasarkan objek yang mengembalikan nilai properti* BoundSQL: Dalam hal ini, Anda dapat membuat SQL dieksekusi dan parameter yang akan digunakan untuk SQL* MappedStatement saat ini: ini dapat mendapatkan nilai ID yang dikonfigurasi dalam Xml For SQL* MappedB: ini dapat mendapatkan nilai ID dalam XML FOR SQL* MappedS: paging memori. * ParameterHandler: Ini digunakan dalam mybatis untuk menggantikan nilai yang muncul di SQL. * * @Author li Xiaogui 9 November 2016 10:59:04 */ @Intercepts ({@signature (type = pernyataanhandler.class, method = "persiapan", args = {connection.class}), @Signature (type = resultSethandler.class, Method = "handleresultsets", argscept = {argeprepor. Interceptor {// mencegat kata kunci paging string final statis private select_id = "page"; // Kode yang dijalankan oleh plug-in akan menggantikan metode asli dan menulis ulang intercept terpenting @Override Public Object Intercept (Invocation Invocation) melempar Throwable {if (Invocation.getTarget () CONSETOF dari Metode lain akan mengabaikan // jadi Anda perlu mendapatkan nama metode (Metode Query (Paging Metode lain akan mengabaikan // jadi Anda perlu mendapatkan nama metode ini) (Metode kueri) (PAGING METODE LAINNYA AKAN MENGEBAIKAN // Jadi Anda perlu mendapatkan Metode Metode (Metode Query (PAGGING METODE LAINNYA AKAN MENGEBUTAGI // Jadi Anda perlu mendapatkan Metode Metode). MetaObject metaObject = SystemMetaObject.forObject (pernyataanhandler); Mappedstatement mappedstatement = (mappedstatement) metaObject.getValue ("delegate.mappedstatement"); String selectId = mappedstatement.getId (); String methodName = selectId.substring (selectId.LastIndexOf (".")+1) .tolowerCase (); // Kemudian menilai jika halaman disertakan, dapatkan SQL if (methorname.contains (select_id)) {boundsql boundsql = (boundsql) metaObject.getValue ("delegate.boundsql"); // Parameter pagination adalah properti parameterObject ParameterObject String SQL = BoundSQL.GetSQL (); System.out.println ("Dapatkan SQL:"+SQL); HashMap <String, Object> Map = (HashMap <String, Object>) (BoundSQL.GetParameterObject ()); // halaman halaman = (halaman) (boundsql.getParameterObject ()); Halaman halaman = (halaman) map.get ("halaman"); // Tulis ulang SQL String CountSQL = concatcountsql (sql); String pagesql = concatpagesql (sql, halaman); // System.out.println ("Menulis ulang Count SQL:"+CountSQL); System.out.println ("Menulis ulang SELECT SQL:"+PAGESQL); Koneksi koneksi = (koneksi) Invocation.getArgs () [0]; Disiapkan countstmt = null; Hasil rs = null; int totalCount = 0; coba {countstmt = connection.preparestatement (countsql); rs = countstmt.executeQuery (); if (rs.next ()) {totalCount = rs.getint (1); }} catch (sqlexception e) {System.out.println ("Abaikan pengecualian ini"+e); } akhirnya {coba {rs.close (); countstmt.close (); } catch (sqlexception e) {System.out.println ("Abaikan pengecualian ini"+e); }} metaObject.setValue ("delegate.boundsql.sql", pagesql); // bind count page.setNumCount (totalCount); }} return Invocation.proed (); } // mencegat Tipe Pernyataan TypeHandler, ganti metode plugin @Override Plugin Objek Publik (Target Objek) {if (target instance dari pernyataanHandler) {return plugin.wrap (target, ini); } else {return target; }} @Override public void setProperties (Properties Properties) {} // Renovasi SQL Public String ConcatCountSQL (String SQL) {// StringBuffer SB = New StringBuffer ("Pilih Count (*) dari"); /*sql=sql.tolowercase (); if (sql.LastIndexof ("order")> sql.LastIndexof (")")) {sb.append (sql.substring (sql.indexof ("from")+4, sql.lastindexof ("order")))); } else {sb.append (sql.substring (sql.indexof ("from")+4)); }*/ StringBuffer SB = StringBuffer baru (); sql = sql.tolowercase (); if (sql.LastIndexof ("order")> 0) {sql = sql.substring (0, sql.indexof ("order")); } SB.Append ("Pilih Hitung (*) dari ("+SQL+") TMP"); return sb.tostring (); } public String concatpagesql (string sql, halaman halaman) {stringBuffer sb = stringBuffer baru (); SB.Append (SQL); SB.Append ("Limit") .Append (page.getPagebegin ()). Append (",") .Append (page.getPagesize ()); return sb.tostring (); }} Halaman halaman [java] Lihat Copypackage COM.DNKX.POJO; impor java.util.hashmap; impor java.util.map; / ** * * Pagination Query Auxiliary Class * @Author Li Xiaogui 9 November 2016 13:55:37 */ halaman kelas publik { // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PageBegin; // Mulai posisi pribadi int numcount; // Jumlah total int private int pagetotal; // Jumlah total string private orderfield = ""; // Kontrol Private String OrderDirection yang ditampilkan pada halaman penyortiran = ""; halaman publik () {} halaman publik (int pageSize, int pageCurrentPage) {super (); this.pagesize = halaman; this.pagecurrentpage = pagecurrentpage; } halaman publik (peta <string, string> peta) {if (map.get ("pagenum")! = null) {this.setPageCurrentPage (this.pageCurrentPage = integer.parseint (map.get ("pagenum"))); // num halaman untuk mem -query} {{{pagenum "))));/Num dari halaman untuk mem -query} lainnya {this. if (map.get ("numperpage")! = null) {this.setPagesize (integer.parseint (map.get ("numperpage"))); // num dari entri yang ditampilkan per halaman} else {this.setpagesize (5); // atur nilai awal} if (MAP.get ("order") (5); // atur iferfield ("get") (5); } 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; } public string getOrderField () {return orderfield; } public void setOrderField (String orderfield) {this.orderfield = orderfield; } public string getOrderDirection () {return orderDirection; } public void setOrderDirection (String orderDirection) {this.orderDirection = orderDirection; } public static Page getPage (int pageSize, int pageCurrentPage) {return halaman baru (halamanzeze, pageCurrentPage); } public static page getPage (peta peta) {return halaman baru (peta); }}Metode Panggilan di Pengontrol
Daftar String Publik (permintaan httpservletRequest) {long a = system.currentTimeMillis (); HashMap<String,Object> map=GetRequestMap.getMap(request);//Encapsulate the method yourself, take the parameter of the request Page page= Page.getPage(map);//Initialize page map.put("page", page);//Put the page object into the parameter set (this map is used by mybatis, including query conditions, sorting, pagination, etc.) //Control Map.put (Map.get ("OrderField")+"", Map.get ("OrderDirection")); Daftar <eployee> list = karyawanService.getListPage (peta); request.setAttribute ("emlist", daftar); request.setAttribute ("halaman", halaman); request.setAttribute ("peta", peta); // Dapatkan halaman terkait halaman. Page.getNumCount (); // jumlah total halaman page.getPagetotal (); // jumlah total halaman panjang b = system.currentTimemillis (); System.out.println ("-------------- Memakan waktu:"+(BA)+"MS"); mengembalikan "Dasar/Employee_list"; }Akhirnya, konfigurasikan plug-in di pegas
<bean id = "PageInterector"> </ bean> <!-Spring dan mybatis terintegrasi dengan sempurna, dan tidak perlu untuk file pemetaan konfigurasi mybatis-> <bean id = "sqlsessionfactory"> <properti name = "dataSource" ref = "dataSource" /<!-name load (datasource "-DataSource" /<!-paparan otomatis "petak aute. value = "classpath: com/dnkx/pemetaan/*. xml"> </property> <name properti = "plugins"> <ref bean = "PageInterector"/> </prop Property> </ bean>
Oke, itulah akhirnya, artikel ini hanya untuk referensi! Menantikan nasihat Tuhan yang agung