Kata pengantar
Ketika tabel terlibat dalam pengembangan web, seperti DataTable, kebutuhan akan paging akan muncul. Biasanya kami membagi metode paging menjadi dua jenis: paging front-end dan paging back-end.
Pagination front-end
Semua catatan (AJAX) dalam tabel data diminta pada satu waktu, dan kemudian di -cache di ujung depan dan menghitung jumlah dan logika paging. Secara umum, komponen front-end (seperti DataTable) akan memberikan tindakan paging.
Fitur adalah: sederhana, sangat cocok untuk platform web skala kecil; Masalah kinerja akan muncul ketika jumlah data besar, dan waktu untuk kueri dan transmisi jaringan akan lama.
Backend Pagination
Tentukan nomor halaman (pagenum) dan ukuran setiap halaman (halaman) dalam permintaan AJAX. Backend meminta data halaman dan mengembalikannya, dan frontend hanya bertanggung jawab untuk rendering.
Fitur adalah: lebih kompleks; Hottleneck kinerja berada dalam kinerja kueri MySQL, yang tentu saja dapat dioptimalkan dan diselesaikan. Secara umum, pengembangan web menggunakan metode ini.
Kami berbicara tentang pagination backend.
Dukungan mysql untuk pagination
Sederhananya, MySQL mendukung pagination melalui klausa batas. Silakan lihat contoh di bawah ini.
Penggunaan kata kunci batas adalah
Batasi [offset,] baris
Offset adalah offset relatif terhadap baris pertama (baris pertama adalah 0), dan baris adalah jumlah baris.
# Setiap halaman memiliki 10 catatan, ambil halaman pertama, dan kembalikan 10 catatan pertama pilih * dari batas table 0,10;# Setiap halaman memiliki 10 catatan, ambil halaman kedua, dan kembalikan catatan ke -11, ke catatan ke -20, pilih * dari batas tablea 10,10;
Yang ingin saya sebutkan di sini adalah bahwa ketika mysql menangani pagination:
Batasi 1000,10 - Saring 1010 lembar data, lalu buang 1000 buah pertama, dan simpan 10 buah. Ketika offset besar, kinerja akan berkurang.
Batasi 100000,10 - Akan memfilter 10W+10 lembar data, dan kemudian buang potongan 10W pertama. Jika Anda menemukan masalah kinerja dalam pagination, Anda dapat menyesuaikannya sesuai dengan ide ini.
Mybatis Paging Plugin PageHelper
Saat menggunakan Java Spring Development, MyBatis adalah alat yang ampuh untuk operasi basis data. Namun, ketika berhadapan dengan paging, Mybatis tidak memiliki metode khusus. Secara umum, Anda perlu menulis klausa batas sendiri untuk mengimplementasikannya, yang relatif mahal. Untungnya, ada plugin PageHelper.
1. Ketergantungan pom
Saya tidak akan menyebutkan konfigurasi mybatis. Ketergantungan PageHelper adalah sebagai berikut. Jika Anda memerlukan versi baru, Anda dapat memilih di Maven
<dependency> <GroupId> com.github.pagehelper </groupId> <ArTifactId> pageHelper </RiTtifacTID> <Version> 4.1.4 </version> </dependency>
2. Konfigurasi MyBatis dari PageHelper
Buka file konfigurasi mybatis, biasanya di bawah jalur sumber daya. Nama saya mybatis-config.xml.
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype Configuration Public "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> m reverpurasi> </m reviuring> Aktifkan atau nonaktifkan cache. -> <pengaturan nama = "cacheenabled" value = "true"/> <!-Mengaktifkan atau menonaktifkan malas memuat secara global. Saat dinonaktifkan, semua objek terkait dimuat secara instan. -> <pengaturan nama = "LazyLoadingEnabled" value = "true"/> <!-Saat diaktifkan, objek dengan properti pemuatan malas akan sepenuhnya memuat properti apa pun saat dipanggil. Jika tidak, setiap properti akan dimuat sesuai kebutuhan. -> <pengaturan nama = "agresivelazyloading" value = "true"/> <!-apakah akan mengizinkan satu SQL tunggal untuk mengembalikan beberapa dataset (tergantung pada kompatibilitas driver) default: true-> <pengaturan nama = "multipleresultSetsenabled" value = "true"/<!-apakah alias untuk kolom dapat digunakan (depending pada value "true" name = "usecolumnlabel" value = "true"/> <!- Izinkan JDBC untuk menghasilkan kunci primer. Dukungan drive diperlukan. Jika diatur ke True, pengaturan ini akan memaksa kunci primer yang dihasilkan, beberapa drive tidak kompatibel tetapi masih dapat dieksekusi. Default: false-> <pengaturan nama = "useGeneratedKeys" value = "true"/> <!-Tentukan bagaimana mybatis secara otomatis memetakan kolom tabel dasar data tidak ada: tidak mengaburkan parsial: bagian penuh: semua-> <pengaturan nama = "automapping baven" value = "parsial"/> <!-Ini adalah jenis eksekusi (Sederhana: Sederhana: Nilai = Parsial "/> <! Ulangi pernyataan dan pembaruan batch)-> <pengaturan nama = "defaultExecutorType" value = "Simple"/> <!-Konversi bidang menggunakan nomenklatur unta. -> <pengaturan nama = "mapunderscoreTocamelcase" value = "true"/> <!-Mengatur sesi rentang cache lokal: akan ada pernyataan berbagi data: lingkup pernyataan (ini tidak akan menjadi data berbagi) defalut: sesi-> <pengaturan nama = tidak ada kebutuhan: value = "sesi"/> <!-pengaturan tetapi jenis jdbc, dan value no wears: value = "Sesi"/> <! type when inserting a null value --> <setting name="jdbcTypeForNull" value="NULL"/></settings><plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> <property name="offsetAsPageNum" value="false"/> <property name="rowBoundsWithCount" value = "false"/> <name properti = "pagesizezero" value = "true"/> <name properti = "masuk akal" value = "false"/> <properti name = "supportMethodSarguments" value = "false"/> <name properti = "returnPageInfo" value = "none"/> </plugin> </plugin> </configuration> value = "none"/> </plugin> </plugin> </configuration> value = "none"//</plugin> </plugins> </configuration> configurasi>
Yang perlu Anda perhatikan di sini adalah konfigurasi yang terkait dengan PageHelper.
Jika Anda tidak memuat file konfigurasi mybatis, maka Anda menggunakan konfigurasi default mybatis. Bagaimana cara memuat file konfigurasi mybatis?
Buka konfigurasi data Anda.
Saat mengkonfigurasi SQLSessionFactory, tentukan file konfigurasi inti MyBatis dan jalur mapper, kode ini sebagai berikut
@Bean(name = "moonlightSqlSessionFactory") @Primary public SqlSessionFactory moonlightSqlSessionFactory(@Qualifier("moonlightData") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource (DataSource); bean.setmapperlocations (PathMatchingResourcEpatternResolver baru (). GetResources ("ClassPath: MyBatis-Mapper/*. Xml")); bean.setConfiglocation (classpathResource baru ("mybatis-config.xml")); return bean.getObject (); }menjelaskan:
Jalur penyimpanan mapper.xml yang dikonfigurasi di sini ada di folder sumber daya/mybatis-mapper
File mybatis-config.xml yang dikonfigurasi di sini di bawah sumber daya/
3. Pagination
Siapkan mapper.xml, cukup tulis satu untuk tes, cukup gunakan satu dari proyek.
Kueri ini di sini adalah kueri multi-kondisi yang khas. Apa yang perlu kita lakukan adalah memberi paginasi catatan yang cocok dengan beberapa kondisi.
<? Xml Version = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightMapper"> <resultMap id = "geofencelist" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <constructor> <idarg kolom = "id" javatype = "javaRy"> <constructor> <idarg kolom = "id" javatype = "" javaEpe. " jdbctype = "integer" /> <arg column = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "type" javatype = "java.Lang." javatype = "java." java. "javatype =" java. "java." java. "java." /> <arg column = "geo" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "createTime" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "updateTime" javaType = "java." java. "java." java. "java." java. "java." java. "java." java. "java." java. "java." </resultMap> <sql id = "base_column"> id, nama, ketik, `grup`, geo, createtime, updateTime </sql> <pilih id =" querygeofence "ParameTerType =" com.kangaroo.studio.moonlight.dao.model.geofenceFenceAfEnam "hancur" geofing "geofing" geofeofeF "» geofeFeofing " refid = "base_column"/> dari geofence di mana 1 = 1 <if test = "type! = null"> dan type = #{type} </if> <if test = "name! = null"> dan name like concat ('%', #{name}, '%') </if> <if test = "group! dan {{{{{if group ') </{if> {api', '%', </if> <if test = "startTime! = null"> dan createTime> = #{startTime} </if> <if test = "endtime! = null"> dan createTime <= #{endtime} </if> </ pilih> </mapper>Tulis metode yang sesuai di antarmuka mapper.java
Daftar <Geofence> Querygeofence (GeofenceQueryParam GeofenceQueryParam);
Pertama, tambahkan kode halaman dan kemudian jelaskan nanti
@RequestMapping (value = "/pagar/kueri", metode = requestMethod.post) @ResponseBody Public Response QueryFence (@RequestBody GeofenceQueryParam GeofenceQueryParam) {coba {integer pagenum = geofenceQueryparam.getpagenum ()! = Null? Integer PageSize = geofenceQueryparam.getPagesize ()! = Null? Geofencequeryparam.getPageSize (): 10; PageHelper.startpage (pagenum, halaman); Daftar <Geofence> Daftar = MoonlightMapper.QueryGeofence (GeofenceQueryParam); mengembalikan respons baru (resultCode.success, "kueri kesuksesan geofence", daftar); } catch (exception e) {logger.error ("query geofence gagal", e); Mengembalikan respons baru (resultCode.Exception, "Query Geofence Failure", null); }}menjelaskan:
1. Keuntungan dari PageHelper adalah pagination dan mapper.xml sepenuhnya dipisahkan. Metode implementasi adalah untuk memperkuat proses eksekusi MyBatis dalam bentuk plug-in, menambahkan jumlah total dan membatasi kueri. Milik halaman fisik.
2. Ada masalah keamanan yang perlu Anda perhatikan, jika tidak, hal itu dapat menyebabkan gangguan paging. Saya telah langsung menempelkan bagian dari blog ini di sini.
4. Kapan itu akan menyebabkan paging yang tidak aman?
Metode PageHelper menggunakan parameter threadlocal statis, dan parameter paging dan utas terikat.
Selama Anda dapat memastikan bahwa metode PageHelper dipanggil segera diikuti oleh metode kueri Mybatis, ini aman. Karena PageHelper secara otomatis menghapus objek yang disimpan oleh threadlocal di cuplikan akhirnya.
Jika pengecualian terjadi sebelum memasuki pelaksana, utas tidak akan tersedia, yang merupakan bug manusia (seperti ketidakcocokan antara metode antarmuka dan XML, yang akan menyebabkan mappedstatement tidak ditemukan). Situasi ini tidak akan menyebabkan parameter threadlocal salah digunakan karena tidak tersedianya utas.
Tetapi jika Anda menulis kode berikut, itu adalah penggunaan yang tidak aman:
PageHelper.StartPage (1, 10); Daftar <Country> Daftar; if (param1! = Null) {list = countryMapper.selectif (param1);} else {list = new ArrayList <country> ();}Dalam hal ini, karena Param1 memiliki null, pageHelper akan menghasilkan parameter paging, tetapi tidak dikonsumsi, dan parameter ini akan tetap ada di utas ini. Ketika utas ini digunakan lagi, dapat menyebabkan metode yang tidak boleh menjadi paging untuk mengkonsumsi parameter paging, yang menghasilkan paging yang tidak dapat dijelaskan.
Kode di atas harus ditulis sebagai berikut:
Daftar <Ogara> daftar; if (param1! = Null) {pageHelper.startpage (1, 10); Daftar = countrymapper.selectif (param1);} else {list = new arraylist <country> ();}Cara menulis ini dapat memastikan keamanan.
Jika Anda tidak nyaman dengan ini, Anda dapat secara manual membersihkan parameter paging yang disimpan dalam threadlocal, yang dapat digunakan seperti ini:
Daftar <Ogara> daftar; if (param1! = Null) {pageHelper.startpage (1, 10); coba {list = countrymapper.selectall (); } akhirnya {pageHelper.clearpage (); }} else {list = new ArrayList <Ogune> ();}Tidak baik menulis seperti ini, dan itu tidak perlu.
Meringkaskan
Di atas adalah konfigurasi dan metode penggunaan sederhana dari Plugin Plugin Mybatis Plugin PageHelper yang diperkenalkan kepada Anda oleh editor (disarankan). 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!