Rumah >Java >javaTutorial >Cara menggunakan Java untuk melaksanakan fungsi pertanyaan paging

Cara menggunakan Java untuk melaksanakan fungsi pertanyaan paging

PHPz
PHPzke hadapan
2023-05-10 17:40:141570semak imbas

Pertanyaan paging

Pertanyaan paging memaparkan data yang besar dalam pangkalan data dalam segmen Setiap halaman memaparkan bilangan baris yang ditentukan pengguna untuk meningkatkan pengalaman pengguna cakera pelayan pada satu masa Keluarkan semua data ke memori, terdapat risiko limpahan memori

Paging benar dan palsu

Paging palsu: Prinsipnya ialah membaca semua data ke dalam memori , putar halaman untuk membaca data dari memori, Kelebihan: Pelaksanaan mudah, prestasi tinggi Kelemahan: Jika data besar, mudah menyebabkan limpahan memori
Paging benar: Data pertanyaan daripada pangkalan data (iaitu cakera) setiap masa halaman diputar, Kelebihan: Tidak mudah menyebabkan limpahan memori Kelemahan: Pelaksanaan yang rumit, prestasi yang agak rendah Beberapa

kesan paging

Fungsi paging umum termasuk: Halaman utama Halaman sebelumnya Halaman seterusnya Halaman terakhir Berapa banyak halaman yang ada pada masa ini Berapakah jumlah halaman Berapa banyak baris dalam jumlah Data melompat ke halaman mana Berapa banyak halaman setiap halaman Untuk setiap data, kita perlu menanyakan data ini dan merangkumnya menjadi objek, yang merangkumi idea pengkapsulan dan menyimpan banyak kod kompleks

Cara menggunakan Java untuk melaksanakan fungsi pertanyaan paging

Parameter yang perlu diluluskan untuk paging

Parameter yang perlu untuk dihantar oleh pengguna:
currentPage: halaman semasa, halaman yang hendak dilawati, kali pertama kami melawati, kami mencipta objek, nilai lalai ialah 1
pageSize: setiap Berapa banyak baris data dipaparkan pada halaman? Buat pertama kalinya, kami juga memberikan nilai lalai, seperti 10

Data yang perlu dipaparkan dalam paging

1 maklumat pada halaman semasa
2. Halaman apakah halaman utama
3. Halaman apakah halaman sebelumnya
4. Halaman apakah halaman berikutnya
5. Jumlah halaman berapa banyak , dan nilai halaman terakhir adalah sama
6 jumlah keseluruhannya
7 halaman berapa? maklumat dipaparkan pada setiap halaman?

Sumber data yang perlu dipaparkan dalam halaman

Dari muat naik pengguna: halaman semasa, berapa keping data yang dipaparkan pada setiap halaman

Daripada pertanyaan pangkalan data: jumlah bilangan data, maklumat produk yang akan dipaparkan pada setiap halaman
Daripada berdasarkan Kira maklumat yang diketahui di atas: jumlah bilangan halaman, halaman sebelumnya, halaman seterusnya

Tulis pernyataan sql untuk membuat pertanyaan daripada pangkalan data

Pertanyaan sql pertama dalam pangkalan data Berapa banyak keping data yang ada? >Sql kedua menanyakan halaman berdasarkan parameter yang dihantar dan set hasil bilangan keping data pada satu halaman

SELECT COUNT(*) FROM 表名

Kemudian menganalisis halaman Dua daripada dua penyataan SQL:

Andaikan terdapat 21 keping data dalam jadual produk, dan setiap halaman dibahagikan kepada 5 keping data:

Tanya halaman pertama data: PILIH * DARI LIMIT produk 0, 5

Tanya data pada halaman kedua: SELECT * FROM produk LIMIT 5, 5
Query the data on the third page: SELECT * FROM product LIMIT 10, 5
Query the data on the four page: SELECT * FROM product LIMIT 15, 5
Dengan mencari corak, kami mendapati bahawa: nilai pertama berasal dari (Halaman semasa - 1) * nilai halaman kedua berasal dari
Saiz halaman, iaitu, semuanya berasal dari parameter paging yang diluluskan oleh pengguna? .


Jumlah bilangan halaman, halaman sebelumnya dan halaman seterusnya

# 第一个 ?:从哪一个索引的数据开始查询(默认从 0 开始)
# 第二个 ?:查询多少条数据
SELECT * FROM 表名 LIMIT ?, ?
Pelaksanaan pertanyaan halaman

Proses akses:

Cara menggunakan Java untuk melaksanakan fungsi pertanyaan pagingEnkapsulasi data yang perlu dipaparkan

Jika data tidak dikapsulkan, setiap data perlu disimpan dalam skop, dan data terlalu bertaburan. Menyusahkan untuk pengurusan bersatu

// 优先计算总页数
int totalPage = rows % pageSize == 0 ? rows / pageSize : rows / pageSize + 1;
//上一页等于当前页-1,但不能超过1页界限
int prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
//下一页等于当前页+1,但不能超过总页数界限
int nextPage = currentPage + 1 <= totalPage ? currentPage + 1 : totalPage;

Lapisan kegigihan DAO

Kaedah operasi yang disediakan oleh Mybatis hanya boleh lulus dalam satu parameter untuk melaksanakan tugas SQL, dan kita kini sedang menanyakan data halaman tertentu , kita perlu tahu halaman apakah itu dan berapa keping data setiap halaman, jadi kita perlu merangkum kedua-dua parameter ini dalam objekTulis kelas (bernama objek pertanyaan class) untuk merangkum data pertanyaan ini

/**
* 封装结果数据(某一页的数据)
*/
@Getter
public class PageResult<T> {
    // 两个用户的输入
    private int currentPage; // 当前页码
    private int pageSize; // 每页显示的条数
    // 两条 SQL 语句执行的结果
    private int totalCount; // 总条数
    private List<T> data; // 当前页结果集数据
    // 三个程序计算的数据
    private int prevPage; // 上一页页码
    private int nextPage; // 下一页页码
    private int totalPage; // 总页数/末页页码
    // 分页数据通过下面构造期封装好
    public PageResult(int currentPage, int pageSize, int totalCount, List<T>
    data) {
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
        this.data = data;
        // 计算三个数据
        this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :
        totalCount / pageSize + 1;
        this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
        this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 :
        this.totalPage;
    }
}

Tulis antara muka DAO lapisan kegigihan dan kelas pelaksanaan

@Setter
@Getter
/**
* 封装分页查询需要的两个请求传入的分页参数
*/
public class QueryObject {
    private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值)
    private int pageSize = 3; // 每页显示条数(需要给默认值)
}

Ubah suai productMapper.xml

//DAO接口提供两个根据查询对象的查询方法
int queryForCount();
List<Product> queryForList(QueryObject qo);
//DAO实现类
@Override
//查询数据库总数据条数
public int queryForCount() {
    SqlSession session = MyBatisUtil.getSession();
    int totalCount =
    session.selectOne("cn.xxx.mapper.ProductMapper.queryForCount");
    session.close();
    return totalCount;
}
@Override
//查询某一页的结果集
public List<Product> queryForList(QueryObject qo) {
    SqlSession session = MyBatisUtil.getSession();
    List<Product> products =
    session.selectList("cn.xxx.mapper.ProductMapper.queryForList",qo);
    session.close();
    return products;
}

Ubah suai QueryObject.java

Tambah kaedah getStart ke kelas ini, Mengembalikan baris dari mana saiz setiap halaman perlu dipaparkan dalam pangkalan data berdasarkan halaman semasa

<select id="queryForCount" resultType="int">
SELECT COUNT(*) FROM product
</select>
<select id="queryForList" resultType="cn.xxx.domain.Product">
SELECT * FROM product LIMIT #{start}, #{pageSize}
</select>

Lapisan perniagaan ProductService

Memanggil lapisan kegigihan DAO untuk melengkapkan pertanyaan data, dan Berbilang data dirangkumkan ke dalam satu objek

@Setter
@Getter
/**
* 封装分页查询需要的两个请求传入的分页参数
*/
public class QueryObject {
    private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值)
    private int pageSize = 3; // 每页显示条数(需要给默认值)
    // 用于 Limit 子句第一个 ? 取值
    public int getStart(){
        return (currentPage - 1) * pageSize;
    }
}

Pelaksanaan fungsi halaman muka hadapan

1 komponen lapisan perniagaan mesti dilengkapkan terlebih dahulu untuk memastikan ujian latar belakang lulus. 2. Ikuti pemikiran MVC.

3. Penyemak imbas menghantar parameter permintaan halaman (halaman mana untuk pergi ke/berapa keping data bagi setiap halaman), menerima parameter ini dalam Servlet dan merangkumnya

4 Pergi ke objek QueryObject kaedah pertanyaan paging dalam Perkhidmatan ( pertanyaan).
5 Kongsi objek hasil pertanyaan paging yang diperoleh (PageResult) dalam skop permintaan, lompat ke JSP dan paparkannya.
6. Ubah suai halaman JSP dan tulis maklumat bar paging (maklumat dalam bar paging berasal dari objek PageResult).


Ubah suai ProductServlet.java dan paparkan jsp

1 Dapatkan parameter permintaan halaman, nilai bahawa ia adalah operasi pertanyaan, panggil kaedah pertanyaan dan dapatkan paging parameter 2. Parameter dirangkumkan ke dalam QueryObject

3 Panggil kaedah lapisan perniagaan untuk menanyakan halaman data tertentu

4 page jsp
6. Dapatkan hasil daripada skop dalam jsp dan balas pelayar

//IProductService接口
public interface IProductService {
    /**
    * 完成查询某一页的业务逻辑功能
    */
    PageResult<Product> query(QueryObject qo);
}
//Service实现类
public class ProductServiceImpl implements IProductService {
    private IProductDAO productDAO = new ProductDAOImpl();
    @Override
    public PageResult<Product> query(QueryObject qo) {
        // 调用 DAO 查询数据数量
        int totalCount = productDAO.queryForCount();
        // 为了性能加入判断,若查询的数据数量为 0,说明没有数据,返回返回空集合,即集合中没有
        元素
        if(totalCount == 0){
            return new PageResult(qo.getCurrentPage(), qo.getPageSize(),
            totalCount, Collections.emptyList());
        }
        // 执行到这里代表有数据,查询当前页的结果数据
        List<Product> products = productDAO.queryForList(qo);
        return new PageResult(qo.getCurrentPage(), qo.getPageSize(), totalCount,
        products);
    }
}

Ubah suai fail jsp dan gunakan JSTL+EL untuk mendapatkan data dalam skop
//创建业务层对象
private IProductService productService = new ProductServiceImpl();

protected void list(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
    QueryObject qo = new QueryObject();
    // 获取请求参数 currentPage,并转型封装
    String currentPage = req.getParameter("currentPage");
    if(StringUtil.hasLength(currentPage)) {
        qo.setCurrentPage(Integer.valueOf(currentPage));
    }
    // 获取请求参数 pageSize,并转型封装
    String pageSize = req.getParameter("pageSize");
    if(StringUtil.hasLength(pageSize)) {
        qo.setPageSize(Integer.valueOf(pageSize));
    }
    // 调用业务层方法来处理请求查询某一页数据
    PageResult<Product> pageResult = productService.query(qo);
    // 把数据共享给 list.jsp
    req.setAttribute("pageResult", pageResult);
    // 控制跳转到 list.jsp 页面
    req.getRequestDispatcher("/WEB-INF/views/product/list.jsp").forward(req,
    resp);
}

Soalan Lazim

Jika operasi membelok halaman berjaya dan anda tidak boleh membelok selepas beberapa halaman, anda hanya boleh menghidupkan tomcat dengan memulakan semula Masalah: Objek SqlSession tidak ditutup dalam DAO

Atas ialah kandungan terperinci Cara menggunakan Java untuk melaksanakan fungsi pertanyaan paging. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam