首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SSH 電商項目實戰:商品分類級聯查詢與分頁功能實現

     編輯:Java 相關知識

項目背景

基於 Struts2 + Spring + Hibernate(SSH)架構的電商後台,實現商品分類與管理員的級聯查詢及分頁展示。

數據庫設計

CREATE TABLE category (
    id INT PRIMARY KEY AUTO_INCREMENT,
    type VARCHAR(20),           -- 分類名稱
    hot BOOLEAN DEFAULT FALSE,  -- 是否熱門
    account_id INT,             -- 關聯管理員
    CONSTRAINT fk_account FOREIGN KEY (account_id) REFERENCES account(id)
);

關係:Category 多對一 Account(一個分類屬於一個管理員)

實體類映射關鍵註解

// Category.java
@ManyToOne(fetch = FetchType.EAGER)  // 級聯查詢時立即加載
@JoinColumn(name = "account_id")
public Account getAccount() { return account; }

// Account.java
@OneToMany(mappedBy = "account", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Set<Category> getCategories() { return categories; }

Service 層實現:解決 N+1 問題

初版(存在 N+1 問題)

String hql = "from Category c where c.type like :type";
// 執行 1 條查分類 + N 條查管理員

優化版:HQL join fetch 一條 SQL 搞定

@Override
public List<Category> queryJoinAccount(String type, int page, int size) {
    String hql = "from Category c left join fetch c.account where c.type like :type";
    return getSession().createQuery(hql)
        .setString("type", "%" + type + "%")
        .setFirstResult((page - 1) * size)  // 起始行
        .setMaxResults(size)                // 頁大小
        .list();
}

關鍵點:left join fetch 同時查詢關聯對象並填充到 Category.account,避免延遲加載產生額外 SQL。

Hibernate 分頁原理

  • setFirstResult((page-1)*size):跳過前 (page-1)*size 條記錄
  • setMaxResults(size):最多返回 size 條記錄
  • 底層轉為數據庫方言的 LIMIT/OFFSET 或 ROW_NUMBER()

單元測試驗證

@Test
public void testQueryJoinAccount() {
    List<Category> list = categoryService.queryJoinAccount("", 1, 2); // 第 1 頁,每頁 2 條
    for (Category c : list) {
        System.out.println(c + " -> " + c.getAccount()); // 直接訪問不觸發額外 SQL
    }
}

擴展建議

  1. 大數據量改用 ScrollableResults 流式處理
  2. 引入 PageHelper 或 Spring Data JPA 簡化分頁代碼
  3. 添加二級緩存(Ehcache/Redis)減輕數據庫壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved