Catatan: Blog ini sangat berbeda dari plug-in paging saat ini, sehingga Anda disarankan untuk memeriksa kode sumber dan dokumentasi terbaru melalui alamat proyek di atas untuk dipahami.
Saya sudah khawatir tentang kueri pagination mybatis sebelumnya, dan saya telah mencari banyak artikel terkait secara online, tetapi saya tidak menggunakan yang terakhir. Tempat paged sepenuhnya ditulis tangan dengan SQL dan Count SQL, yang sangat merepotkan.
Kemudian, untuk sementara waktu, saya ingin menulis implementasi pagination dari dalam mybatis. Saya menulis implementasi untuk languagedriver. Tidak ada masalah dengan pagination otomatis, tetapi jumlah total kueri (hitungan) masih belum dapat diselesaikan pada satu waktu, dan itu tidak terselesaikan.
Baru -baru ini, saya harus menggunakan pagination lagi. Demi kenyamanan, saya harus menulis kelas pagination umum, jadi saya merujuk pada sebagian besar kode pagination mybatis di internet lagi.
Bahkan, sejak lama, seseorang membuka implementasi sumber di GitHub, mendukung MySQL, Oracle, dan SQLServer, yang mirip dengan referensi di atas dan memiliki pertimbangan yang lebih komprehensif. Tapi saya pikir terlalu banyak kelas terlalu merepotkan, jadi saya menerapkan kelas dengan hanya satu interseptor, yang sebenarnya dapat dibagi menjadi dua kelas. Salah satu kelas ditulis sebagai kelas statis oleh saya dan ditempatkan di Interceptor. Anda juga dapat mengekstrak kelas halaman untuk memfasilitasi penggunaan halaman.
Mari kita bicara tentang metode implementasi terlebih dahulu. Plugin ini hanya memiliki satu kelas: pageHelper.java
Tanda Tangan Interceptor adalah:
@Intercepts ({ @Signature (type = SympationHandler.class, Method = "Persiapan", args = {connection.class}), @Signature (type = resultSethandler.class, method = "handleresultSets", args = {pernyataan.class})})Tanda tangan di sini sangat penting untuk seluruh implementasi dan ide. Pertama, saya mencegat metode persiapan untuk mengubah pagination SQL dan melakukan kueri hitungan. Kemudian saya mencegat metode handleresultSets untuk mendapatkan hasil pemrosesan terakhir dan memasukkan hasilnya ke objek halaman.
Berikut ini adalah kode untuk memodifikasi halaman, yang merupakan modifikasi untuk data Oracle. Jika Anda menggunakan database lain, Anda dapat memodifikasi kode di sini sendiri.
/ ** * Ubah SQL asli ke pagination sql * @param sql * @param halaman * @return */ private string buildpagesql (string sql, halaman halaman) {stringbuilder pagesql = new stringBuilder (200); PAGESQL.Append ("SELECT * DARI (SELECT TEMP. *, ROWNUM ROW_ID from ("); pagesql.append (sql); pagesql.append (") temp return pagesql.tostring (); } Kemudian, dalam metode setPageParameter berikut, pernyataan Pilih Hitung perlu dimodifikasi sesuai dengan jenis database:
// Jumlah total catatan string countsql = "pilih count (0) dari (" + sql + ")";Mengapa saya tidak memberikan dukungan untuk berbagai database? Saya tidak berpikir itu perlu. Beberapa basis data tidak mendukung paging, dan semakin sederhana plugin ini, semakin mudah bagi pengembang untuk memahami dan memodifikasi. Memodifikasinya ke dalam kueri pagination yang Anda butuhkan jelas bukan masalah.
Akhirnya, kode lengkap ditambahkan (lanjutkan membaca, ada juga metode penggunaan di bawah): (klik untuk mengunduh)
paket com.mybatis.util; impor org.apache.ibatis.executor.parameter.parameterhandler; 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.iatis.plugin.*; impor org.apache.ibatis.reflection.metaObject; impor org.apache.ibatis.reflection.systemmetaObject; impor org.apache.ibatis.scripting.defaults.defaultparameterhandler; impor org.apache.log4j.logger; impor java.sql.*; impor java.util.list; impor java.util.properties; /*** mybatis-interceptor pagination universal* @author liuzh/abel533/isea* dibuat oleh liuzh pada 14-4-15. */ @Intercepts ({ @Signature (type = Sympnandler.class, Method = "Persiapan", args = {connection.class}), @Signature (type = resultSethandler.class, method = "handleresultSets", args = {pernyataan. Logger.getLogger (pageHelper.class); Public Static Final Threadlocal <page> localpage = ThreadLocal baru <page> (); / ** * Mulai halaman * @param pagenum * @param pagesze */ public static void startPage (int pagenum, int pageSize) {localpage.set (halaman baru (pagenum, pagesize)); } /*** Akhiri paging dan kembalikan hasilnya. Metode harus dipanggil, jika tidak, LocalPage akan disimpan sampai StartPage berikutnya * @return */ Public Static Page Endpage () {halaman halaman = localpage.get (); localpage.remove (); halaman kembali; } @Override Public Object Intercept (Invocation Invocation) melempar Throwable {if (localpage.get () == null) {return Invocation.proed (); } if (Invocation.getTarget () instanceof pernyataanhandler) {pernyataan Handlerer pernyataanHandler = (Pernyataan Handler) Invocation.getTarget (); MetaObject MetastatementHandler = SystemMetaObject.forObject (Pernyataan Handler); // Pisahkan rantai objek proksi (karena kelas target dapat dicegat oleh beberapa pencegat, beberapa proksi terbentuk, dan dua loop berikut // kelas target paling primitif dapat dipisahkan) sementara (metastatementhandler.hasgetter ("h")) {objek objek = metastatementhandler.getValue ("h"); MetastatementHandler = SystemMetaObject.forObject (objek); } // kelas target yang memisahkan objek proxy terakhir sementara (metastatementhandler.hasgetter ("target")) {objek objek = metastatementhandler.getValue ("target"); MetastatementHandler = SystemMetaObject.forObject (objek); } MappedStatement MappedStatement = (MappedStatement) MetastatementHandler.getValue ("Delegate.MappedStatement"); // Informasi Halaman if (localpage.get ()! = Null) {halaman halaman = localpage.get (); BoundSQL BoundSQL = (BoundSQL) MetastatementHandler.getValue ("delegate.boundsql"); // halaman parameter sebagai properti parameterObject Parameterstring sql = boundsql.getSql (); // Tulis ulang SQL String Pagesql = buildPagesQL (SQL, halaman); // Tulis ulang paging sql metastatementhandler.setValue ("delegate.boundsql.sql", pagesql); Koneksi koneksi = (koneksi) Invocation.getArgs () [0]; // Setel ulang jumlah total halaman dalam parameter paging, dll. SetPageParameter (SQL, koneksi, mappedstatement, boundSQL, halaman); // menyerahkan hak eksekusi ke Interceptor Return Invocation.proed () berikutnya; } else if if (invocation.getTarget () instanceOf resultSethandler) {Object result = Invocation.proed (); Halaman halaman = localpage.get (); halaman.setresult ((daftar) hasil); hasil pengembalian; } return null; } / ** * Hanya mencegat dua jenis * pernyataan HANDLER * HasilSethandler * @param target * @return * / @Override Plugin Objek Publik (Target Objek) {if (target instance dari Pernyataan Handler || Target instanceof hasilishandler) {return plugin.wrap (target, this); } else {return target; } } @Override public void setProperties(Properties properties) { } /** * Modify the original SQL to pagination SQL * @param sql * @param page * @return */ private String buildPageSql(String sql, Page page) { StringBuilder pageSql = new StringBuilder(200); PAGESQL.Append ("SELECT * DARI (SELECT TEMP. *, ROWNUM ROW_ID from ("); pagesql.append (sql); pagesql.append (") temp return pagesql.tostring (); } /** * Get the total number of records* @param sql * @param connection * @param mappedStatement * @param boundSql * @param page */ private void setPageParameter(String sql, Connection connection, MappedStatement mappedStatement, BoundSql boundSql, Page page) { // Total number of records String countSql = "select count(0) from (" + sql + ")"; Disiapkan countstmt = null; Hasil rs = null; coba {countstmt = connection.preparestatement (countsql); BoundSQL countbs = boundSQL baru (mappedstatement.getConfiguration (), countsql, boundsql.getParametermappings (), boundsql.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 ("abaikan pengecualian ini", e); } akhirnya {coba {rs.close (); } catch (sqlexception e) {logger.error ("abaikan pengecualian ini", e); } coba {countstmt.close (); } catch (sqlexception e) {logger.error ("abaikan pengecualian ini", e); }}} / ** * Nilai parameter pengganti * @param ps * @param mappedstatement * @param boundsql * @param parameterObject * @throws sqlexception * / private void setParameters (Paramer -Parlowled Parlowsception, Boundsql BoundSQL, objek PARAMETLEMENTENT, PARAMETLEDEPLEK) DefaultParameterHandler (MappedStatement, ParameterObject, BoundSQL); parameterHandler.setParameters (PS); } / ** * Deskripsi: Pagination * Penulis: liuzh * Pembaruan: Liuzh (2014-04-16 10:56) * / halaman kelas statis public <e> {private int pagenum; halaman int private; private int startrow; Private Int Endrow; Total panjang pribadi; halaman int pribadi; Daftar Pribadi <E> Hasil; halaman publik (int pagenum, int pageSize) {this.pagenum = pagenum; this.pagesize = halaman; this.startrow = pagenum> 0? (Pagenum - 1) * Halaman: 0; this.endrow = pagenum * halaman; } Daftar Publik <E> getResult () {hasil pengembalian; } public void setResult (Daftar <E> hasil) {this.Result = hasil; } public int getPages () {return halaman; } public void setPages (int halaman) {this.pages = halaman; } 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 panjang) {this.total = total; } @Override Public String ToString () {return "page {" + "pagenum =" + pagenum + ", pageSize =" + pageSize + ", startrow =" + startrow + ", endrow =" + endrow + ", total =" + total + ", halaman =" + halaman + '}'; }}} Untuk menggunakan interseptor ini, pertama -tama Anda harus mengkonfigurasi pencegat dalam konfigurasi mybatis:
<Plugins> <plugin interceptor = "com.mybatis.util.pagehelper"> </lugin> </lugin>
Saat mengkonfigurasi pencegat, Anda perlu memperhatikan lokasi plugin. Urutan plugin adalah sebagai berikut:
Properties?, Pengaturan?, Typealiases?, TypeHandlers?, ObjectFactory?, ObjectWrapperFactory?, Plugins?, Lingkungan?, DatabaseDProvider?, Mappers?
Akhirnya, ada kode contoh (lapisan layanan) yang memanggil metode ini:
@Override Public pageHelper.page <sysloginlog> findsysloginlog (string loginip, string nama pengguna, string login, string exitdate, string lOgerr, int pagenumber, int pageSize) lemparan bisnis {pageHelper.startpage (PagenBer, Pageze); sysloginlogmapper.findsysloginlog (loginip, nama pengguna, logindate, eksitdat, logerr); return pageHelper.endpage (); }Dari yang di atas, kita dapat melihat bahwa menggunakan plug-in ini sangat sederhana. Anda hanya perlu menggunakan metode startpage dan endpage dari pageHelper sebelum dan sesudah kueri. Hasil panggilan dari kode perantara sudah ada dalam hasil pageHelper. Jika Anda menelepon PageHelper di tempat yang mengembalikan hasilnya, hasil yang dikembalikan masih merupakan daftar, dan Anda bisa mengambil nilai pertama (saya pikir tidak ada yang akan menggunakannya seperti ini di tempat ini, tentu saja tidak ada kesalahan dengan cara ini).
Selain itu, semua kode mybatis antara startpage dan endpage akan paginated, dan pageHelper hanya akan mempertahankan hasil terakhir. Oleh karena itu, saat menggunakannya, Anda perlu memastikan bahwa hanya satu permintaan mybatis yang dieksekusi di dalamnya sekaligus. Jika ada beberapa paging, silakan gunakan StartPage dan Endpage beberapa kali.
Karena hanya implementasi Oracle yang disediakan di sini, saya berharap bahwa pembaca yang merujuk ke database lain yang diimplementasikan oleh plugin paging ini juga dapat membuka sumber kode yang sesuai.
Alamat proyek: http://xiazai.vevb.com/201612/yuanma/mybatis_pagehelper_jb51.zip
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.