Masalah paging merupakan masalah yang sangat umum ditemui hampir semua developer. Saya tidak akan membahas cara melakukan paging secara khusus di sini, tetapi akan menjelaskan prinsip paging dalam mode Web. Yang pertama adalah melakukan query untuk mendapatkan kumpulan hasil (ditunjukkan sebagai hasil yang diperoleh dari query database). Jika hasilnya banyak, biasanya kita tidak akan menampilkan semua data sekaligus, maka kita akan menggunakan paging untuk menampilkan data tertentu (seperti itu). sebanyak 20 item). Karena sifat HTTP yang tidak memiliki kewarganegaraan, setiap pengiriman dianggap sebagai permintaan baru. Meskipun halaman diubah, hasil terakhir tidak berdampak pada permintaan berikutnya.
Berikut tiga cara untuk menerapkan paging. Saya tidak tahu apakah ada cara lain!
1. Dapatkan semua data hasil kueri setiap saat, lalu tampilkan catatan yang ditentukan sesuai dengan nomor halaman.
2. Dapatkan hanya satu halaman data berdasarkan halaman tersebut, lalu tampilkan halaman ini. Di sini Anda perlu membuat pernyataan sql.
3. Mengambil sejumlah halaman data merupakan kompromi antara dua halaman sebelumnya.
Yang perlu diperhatikan juga disini adalah apakah data ditempatkan pada request atau session yang akan dibahas satu persatu disini.
1. Umumnya tidak akan ditempatkan di sesi karena akan memakan banyak memori, sehingga harus ditempatkan di permintaan.
Keuntungan: Implementasinya relatif sederhana dan kecepatan query relatif cepat.
Kekurangan: Membutuhkan lebih banyak memori dan mengirimkan banyak data melalui jaringan.
Metode ini lebih cocok untuk query dengan jumlah data yang relatif kecil. Beberapa orang di sini memasukkan data ke dalam sesi sehingga tidak perlu melakukan kueri ulang saat mengganti halaman. Namun, ini sangat buruk dan sangat disarankan untuk tidak digunakan dengan cara ini.
2. Pasti tidak akan ditempatkan di sesi, karena tidak masuk akal untuk meletakkannya di sesi.
Keuntungan: memakan lebih sedikit memori.
Kekurangan: Lebih merepotkan, Anda harus mendapatkan jumlah total hasil query terlebih dahulu, karena Anda perlu mengetahui berapa banyak record yang ada untuk mengetahui berapa halaman yang ada. Selain itu, perlu untuk membuat pernyataan kueri paging, yang berbeda untuk database yang berbeda.
3. Situasi ini harus ditempatkan di sesi, jika tidak, mengapa saya mengambil beberapa halaman? Implementasi ini untuk mengurangi jumlah query database. Misalnya, jika saya menyimpan catatan 1 menjadi 10, lalu jika saya mengubah halaman, Antara 1 dan 10 bisa didapatkan langsung dari sesinya. Jika saya mengubah ke halaman 11, saya dapat mereset cache ke 11
20 halaman data (atau 5 hingga 15 halaman data), dalam hal ini, hanya satu operasi kueri database yang diperlukan untuk 10 perubahan.
Keuntungan: Membutuhkan sedikit memori dan meningkatkan kecepatan kueri rata-rata.
Kekurangan: Implementasinya lebih rumit, mungkin ada data kotor, dan Anda perlu menentukan sendiri pengumpulan cache. Jika jumlah data yang ditanyakan relatif besar, Anda dapat mempertimbangkan untuk menggunakan metode ini.
Desain berikut hanya memperoleh satu halaman data setiap kali, dan jumlah total kueri harus diatur ulang setiap kali. Bagaimana cara menerapkannya sendiri?
Rancang antarmuka di sini:
package treeroot.util;import java.util.List;/*** Antarmuka ini digunakan untuk mengimplementasikan fungsi paging. Perhatikan bahwa tidak ada fungsi modifikasi yang disediakan di sini. * @author treerot* @versi 1.0* @since 2004-9-30*/public interface Pageable{ /** * Dapatkan hasil data* @return */ public List getResult(); * @return */ public int getCount(); /** * Mendapatkan nomor halaman saat ini* @return */ public int getPageSize(); /** * Mendapatkan nomor halaman saat ini* @return */ public int getCurrentPage(); /** * Dapatkan jumlah total halaman* @return */ public int getPages(); /** * Jumlah default record yang ditampilkan pada setiap halaman*/ public final static int DEFAULT_PAGESIZE=20;} Antarmuka ini sangat sederhana. Ini mencakup daftar hasil dan beberapa informasi yang diperlukan untuk paging. Perhatikan beberapa poin di sini:
1. Implementasi antarmuka ini mewakili halaman data tertentu dalam query tertentu, yang tidak ada hubungannya dengan query terakhir.
2. Implementasi antarmuka ini harus bersifat read-only, artinya tidak dapat diubah.
3. Metode getPages() mubazir, namun metode ini tetap disediakan di sini.
Implementasi abstrak diberikan di bawah ini:
paket treeroot.util;import java.util.List;/*** @author treerot* @version 1.0* @since 2004-9-30*/public abstract class abstractPage mengimplementasikan Pageable{ private int currentPage; halaman; jumlah int yang dilindungi; hasil Daftar yang dilindungi; /** * Tentukan halaman saat ini* @param currentPage * @throws PageException */ public abstractPage(int currentPage){ this(currentPage,Pageable.DEFAULT_PAGESIZE); /** * Tentukan halaman dan ukuran halaman saat ini* @param currentPage * @param pageSize * @throws PageException */ public abstractPage(int currentPage,int pageSize) { this.currentPage=currentPage ; this.pageSize=pageSize; } dilindungi void checkPage(int currentPage) menampilkan PageException{ if((currentPage<1)||(currentPage>this.getPages())) throw new PageException("Halaman di luar jangkauan: jumlah total halaman adalah "+this.getPages()+", halaman saat ini adalah " +currentPage); } /** * Metode ini diganti oleh subkelas untuk inisialisasi, yaitu untuk menghitung nilai hitungan dan hasil, dan dipanggil dalam konstruktor subkelas. */ abstrak dilindungi void init() melempar PageException; public List getResult() { mengembalikan hasil; } public int getCurrentPage() { return currentPage; } public int getPages() { if(pages==0) this.pages=(count+pageSize-1)/pageSize kembali halaman; }}Kelas abstrak ini mengimplementasikan semua metode di antarmuka, tetapi mendefinisikan metode abstrak init(), yang harus diimplementasikan di subkelas. Antarmuka dan kelas abstrak di atas terlihat relatif sederhana. Anda mungkin merasa bahwa mereka tidak melakukan apa pun. Memang, mereka tidak melakukan apa pun dalam hal implementasi, tetapi mereka dapat memberikan bantuan besar dalam pengembangan. Kita dapat mewarisi kelas abstrak ini sesuai dengan kebutuhan kita sendiri, dan datanya dapat diperoleh dengan berbagai cara, seperti langsung melalui Daftar, atau melalui JDBC, Hibernate, dll., tetapi kita semua perlu merangkum hasilnya ke dalam Daftar, melalui Hibernate Tampaknya sangat nyaman.
PageException adalah pengecualian khusus
paket treeroot.util /*** @author treeroot* @versi 1.0* @sejak 30-9-2004*/public class PageException extends Exception{ public PageException(){ super(); } public PageException(String pesan){ super( pesan); }}