溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis Plus中怎么自定義分頁

發布時間:2021-08-03 15:05:55 來源:億速云 閱讀:379 作者:Leah 欄目:編程語言
# Mybatis Plus中怎么自定義分頁

## 一、Mybatis Plus分頁基礎

### 1.1 Mybatis Plus內置分頁功能
Mybatis Plus提供了開箱即用的分頁插件`PaginationInnerInterceptor`,通過簡單配置即可實現基礎分頁查詢:

```java
@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

1.2 基礎分頁使用示例

// 構造分頁參數
Page<User> page = new Page<>(1, 10); // 當前頁,每頁大小

// 執行查詢
Page<User> result = userMapper.selectPage(page, null);

// 獲取分頁數據
List<User> records = result.getRecords();
long total = result.getTotal();

二、自定義分頁實現方案

2.1 自定義SQL分頁查詢

2.1.1 Mapper接口定義

public interface UserMapper extends BaseMapper<User> {
    
    @Select("SELECT * FROM user WHERE age > #{age}")
    Page<User> selectByAgePage(Page<User> page, @Param("age") Integer age);
}

2.1.2 XML映射文件實現

<select id="selectByAgePage" resultType="com.example.User">
    SELECT * FROM user WHERE age > #{age}
</select>

2.2 復雜關聯查詢分頁

2.2.1 多表關聯分頁

@Select("SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id = d.id")
Page<UserDeptDTO> selectUserWithDept(Page<UserDeptDTO> page);

2.2.2 子查詢分頁處理

<select id="selectComplexPage" resultType="com.example.User">
    SELECT * FROM user WHERE id IN 
    (SELECT user_id FROM user_role WHERE role_id = #{roleId})
</select>

三、高級自定義分頁技巧

3.1 自定義分頁結果處理

public Page<UserVO> customPageResult(Page<User> page) {
    // 原始分頁查詢
    Page<User> userPage = userMapper.selectPage(page, null);
    
    // 轉換為VO
    Page<UserVO> voPage = new Page<>();
    BeanUtils.copyProperties(userPage, voPage);
    voPage.setRecords(userPage.getRecords().stream()
            .map(this::convertToVO)
            .collect(Collectors.toList()));
    
    return voPage;
}

3.2 分頁參數動態調整

public Page<User> dynamicPage(PageParam param) {
    // 根據業務邏輯動態設置分頁參數
    Page<User> page = new Page<>();
    if (param.getPageSize() > 100) {
        page.setSize(100); // 限制最大分頁大小
    } else {
        page.setSize(param.getPageSize());
    }
    page.setCurrent(param.getPageNum());
    
    return userMapper.selectPage(page, null);
}

四、自定義分頁攔截器

4.1 實現自定義分頁邏輯

public class CustomPaginationInterceptor implements InnerInterceptor {
    
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, 
            Object parameter, RowBounds rowBounds, ResultHandler resultHandler, 
            BoundSql boundSql) {
        
        if (parameter instanceof Page) {
            // 自定義分頁處理邏輯
            processCustomPagination((Page<?>) parameter, boundSql);
        }
    }
    
    private void processCustomPagination(Page<?> page, BoundSql boundSql) {
        String originalSql = boundSql.getSql();
        // 自定義SQL改寫邏輯
        String paginationSql = buildPaginationSql(originalSql, page);
        resetSql(boundSql, paginationSql);
    }
}

4.2 注冊自定義攔截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new CustomPaginationInterceptor());
    return interceptor;
}

五、性能優化建議

5.1 分頁查詢優化方案

  1. *避免使用SELECT **
-- 不推薦
SELECT * FROM large_table LIMIT 100000, 10

-- 推薦
SELECT id, name FROM large_table LIMIT 100000, 10
  1. 使用延遲關聯優化
SELECT t1.* FROM large_table t1
JOIN (SELECT id FROM large_table LIMIT 100000, 10) t2
ON t1.id = t2.id

5.2 大數據量分頁處理

5.2.1 游標分頁實現

public List<User> cursorPagination(Long lastId, int pageSize) {
    return userMapper.selectList(new LambdaQueryWrapper<User>()
            .gt(User::getId, lastId)
            .orderByAsc(User::getId)
            .last("LIMIT " + pageSize));
}

5.2.2 分片查詢+內存分頁

public Page<User> shardingPage(Page<User> page) {
    // 先獲取所有ID(小結果集)
    List<Long> ids = userMapper.selectIdsByCondition();
    
    // 內存分頁
    List<Long> pageIds = ids.stream()
            .skip((page.getCurrent() - 1) * page.getSize())
            .limit(page.getSize())
            .collect(Collectors.toList());
    
    // 批量查詢詳細數據
    List<User> records = userMapper.selectBatchIds(pageIds);
    
    page.setRecords(records);
    page.setTotal(ids.size());
    return page;
}

六、常見問題解決方案

6.1 分頁插件不生效排查

  1. 檢查攔截器是否正確配置
  2. 確認方法參數中包含Page對象
  3. 檢查SQL是否正確支持分頁語法

6.2 分頁總數查詢優化

// 關閉自動count查詢
Page<User> page = new Page<>(1, 10, false);

// 手動執行count查詢(復雜場景)
if (needTotal) {
    page.setTotal(userMapper.selectCount(queryWrapper));
}

七、總結

Mybatis Plus的分頁功能通過合理的自定義可以滿足絕大多數業務場景需求。關鍵點包括:

  1. 掌握基礎分頁配置和使用方法
  2. 熟練使用自定義SQL實現復雜分頁
  3. 了解高級分頁優化技巧
  4. 大數據量場景選擇合適的分頁策略

通過本文介紹的各種方案,開發者可以靈活應對不同的分頁需求,在保證功能實現的同時兼顧系統性能。 “`

注:本文實際約2000字,包含了Mybatis Plus自定義分頁的完整實現方案,從基礎使用到高級技巧,并提供了多種代碼示例和優化建議??筛鶕枰{整具體章節的詳細程度。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女