亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot中各種分頁查詢方式的示例代碼

 更新時間:2025年06月13日 09:00:06   作者:北葵向暖_南梔傾寒  
在?Spring?Boot?中,實現(xiàn)分頁查詢有多種方式,下面小編將介紹幾種常見的分頁實現(xiàn)方法,包括?Spring?Data?JPA?分頁、MyBatis?分頁、手動分頁等

1. Spring Data JPA 分頁

這是最簡單和常用的分頁方式,Spring Data JPA 內(nèi)置了分頁支持。

1.1 基本實現(xiàn)

首先,添加依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
</dependency>

實體類:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    // getters, setters, constructors...
}

Repository 接口:

public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findByNameContaining(String name, Pageable pageable);
}

Service 層:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public Page<User> getUsersByName(String name, int page, int size) {
        Pageable pageable = PageRequest.of(page, size, Sort.by("name").ascending());
        return userRepository.findByNameContaining(name, pageable);
    }
}

Controller 層:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping
    public ResponseEntity<Page<User>> getUsers(
            @RequestParam(required = false) String name,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        return ResponseEntity.ok(userService.getUsersByName(name, page, size));
    }
}

1.2 自定義返回結(jié)果

有時我們需要自定義返回數(shù)據(jù)結(jié)構(gòu):

public class PageResult<T> {
    private List<T> content;
    private int page;
    private int size;
    private long totalElements;
    private int totalPages;
    // getters, setters...
    
    public static <T> PageResult<T> fromPage(Page<T> page) {
        PageResult<T> result = new PageResult<>();
        result.setContent(page.getContent());
        result.setPage(page.getNumber());
        result.setSize(page.getSize());
        result.setTotalElements(page.getTotalElements());
        result.setTotalPages(page.getTotalPages());
        return result;
    }
}

然后在 Controller 中使用:

@GetMapping("/custom")
public ResponseEntity<PageResult<User>> getUsersCustom(
        @RequestParam(required = false) String name,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size) {
    Page<User> userPage = userService.getUsersByName(name, page, size);
    return ResponseEntity.ok(PageResult.fromPage(userPage));
}

2. MyBatis 分頁

2.1 使用 PageHelper

添加依賴:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

Mapper 接口:

@Mapper
public interface UserMapper {
    List<User> findByName(@Param("name") String name);
}

Service 層:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public PageInfo<User> getUsersByName(String name, int page, int size) {
        PageHelper.startPage(page, size);
        List<User> users = userMapper.findByName(name);
        return new PageInfo<>(users);
    }
}

Controller 層:

@GetMapping("/mybatis")
public ResponseEntity<PageInfo<User>> getUsersMybatis(
        @RequestParam(required = false) String name,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size) {
    return ResponseEntity.ok(userService.getUsersByName(name, page, size));
}

2.2 MyBatis-Plus 分頁

添加依賴:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

配置分頁插件:

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

Mapper 接口:

public interface UserMapper extends BaseMapper<User> {
    // 繼承基本方法
}

Service 層:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public IPage<User> getUsersByName(String name, int page, int size) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("name", name);
        return userMapper.selectPage(new Page<>(page, size), wrapper);
    }
}

Controller 層:

@GetMapping("/mybatis-plus")
public ResponseEntity<IPage<User>> getUsersMybatisPlus(
        @RequestParam(required = false) String name,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size) {
    return ResponseEntity.ok(userService.getUsersByName(name, page, size));
}

3. 手動分頁

當(dāng)數(shù)據(jù)量不大或需要特殊處理時,可以使用手動分頁:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public List<User> getUsersManually(String name, int page, int size) {
        List<User> allUsers = userRepository.findByNameContaining(name);
        
        int fromIndex = page * size;
        if (fromIndex >= allUsers.size()) {
            return Collections.emptyList();
        }
        
        int toIndex = Math.min(fromIndex + size, allUsers.size());
        return allUsers.subList(fromIndex, toIndex);
    }
    
    public Map<String, Object> getUsersWithTotal(String name, int page, int size) {
        List<User> allUsers = userRepository.findByNameContaining(name);
        List<User> pageContent = getUsersManually(name, page, size);
        
        Map<String, Object> result = new HashMap<>();
        result.put("content", pageContent);
        result.put("currentPage", page);
        result.put("pageSize", size);
        result.put("totalElements", allUsers.size());
        result.put("totalPages", (int) Math.ceil((double) allUsers.size() / size));
        
        return result;
    }
}

Controller 層:

@GetMapping("/manual")
public ResponseEntity<Map<String, Object>> getUsersManual(
        @RequestParam(required = false) String name,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size) {
    return ResponseEntity.ok(userService.getUsersWithTotal(name, page, size));
}

4. WebMvc 分頁參數(shù)自動綁定

可以創(chuàng)建一個分頁參數(shù)類來自動綁定分頁參數(shù):

public class PageParam {
    @Min(0)
    private int page = 0;
    
    @Min(1)
    @Max(100)
    private int size = 10;
    
    private String sort = "id,asc"; // 格式: field,direction
    
    // getters, setters...
    
    public Pageable toPageable() {
        String[] parts = sort.split(",");
        if (parts.length == 2) {
            return PageRequest.of(page, size, 
                Sort.by(Sort.Direction.fromString(parts[1]), parts[0]));
        }
        return PageRequest.of(page, size);
    }
}

Controller 使用:

@GetMapping("/auto-page")
public ResponseEntity<Page<User>> getUsersAutoPage(
        @RequestParam(required = false) String name,
        PageParam pageParam) {
    return ResponseEntity.ok(userRepository.findByNameContaining(name, pageParam.toPageable()));
}

5. 響應(yīng)式分頁 (WebFlux)

如果使用 Spring WebFlux:

添加依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Repository:

public interface ReactiveUserRepository extends ReactiveMongoRepository<User, String> {
    Flux<User> findByNameContaining(String name, Pageable pageable);
}

Service:

@Service
public class ReactiveUserService {
    @Autowired
    private ReactiveUserRepository userRepository;
    
    public Mono<Page<User>> getUsers(String name, int page, int size) {
        Pageable pageable = PageRequest.of(page, size);
        Flux<User> userFlux = userRepository.findByNameContaining(name, pageable);
        Mono<Long> countMono = userRepository.countByNameContaining(name);
        
        return Mono.zip(userFlux.collectList(), countMono)
            .map(tuple -> new PageImpl<>(tuple.getT1(), pageable, tuple.getT2()));
    }
}

Controller:

@RestController
@RequestMapping("/api/reactive/users")
public class ReactiveUserController {
    @Autowired
    private ReactiveUserService userService;
    
    @GetMapping
    public Mono<ResponseEntity<Page<User>>> getUsers(
            @RequestParam(required = false) String name,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        return userService.getUsers(name, page, size)
            .map(ResponseEntity::ok)
            .defaultIfEmpty(ResponseEntity.notFound().build());
    }
}

總結(jié)

Spring Data JPA 分頁:最簡單,適合大多數(shù) CRUD 應(yīng)用

1.MyBatis 分頁:

  • PageHelper:簡單易用
  • MyBatis-Plus:功能更強大

2.手動分頁:靈活,適合特殊需求

3.自動綁定分頁參數(shù):提高代碼整潔度

4.響應(yīng)式分頁:適合響應(yīng)式應(yīng)用

根據(jù)項目需求和技術(shù)棧選擇合適的分頁方式。對于大多數(shù) Spring Boot 項目,Spring Data JPA 或 MyBatis-Plus 的分頁功能已經(jīng)足夠強大且易于使用。

以上就是SpringBoot中各種分頁查詢方式的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot分頁查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    這篇文章主要介紹了fastjson對JSONObject中的指定字段重新賦值的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring通過c3p0配置bean連接數(shù)據(jù)庫

    Spring通過c3p0配置bean連接數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了Spring通過c3p0配置bean連接數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java中的System.getenv()和System.getProperty()使用詳解

    Java中的System.getenv()和System.getProperty()使用詳解

    文章介紹了Java中用于讀取環(huán)境配置信息的兩種方法:System.getenv()和System.getProperty(),前者讀取系統(tǒng)環(huán)境變量,返回一個不可修改的Map;后者獲取JVM環(huán)境變量值,可以通過-D參數(shù)設(shè)置,文章還提到,通過這兩種方法可以簡化配置,不需要修改代碼
    2024-11-11
  • idea指定啟動參數(shù)、環(huán)境變量的過程

    idea指定啟動參數(shù)、環(huán)境變量的過程

    這篇文章主要介紹了idea指定啟動參數(shù)、環(huán)境變量的操作過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 教你怎么用java一鍵自動生成數(shù)據(jù)庫文檔

    教你怎么用java一鍵自動生成數(shù)據(jù)庫文檔

    最近小編也在找這樣的插件,就是不想寫文檔了,浪費時間和心情啊,果然我找到一款比較好用,操作簡單不復(fù)雜.screw 是一個簡潔好用的數(shù)據(jù)庫表結(jié)構(gòu)文檔的生成工具,支持 MySQL、Oracle、PostgreSQL 等主流的關(guān)系數(shù)據(jù)庫.需要的朋友可以參考下
    2021-05-05
  • springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式

    springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式

    這篇文章主要介紹了springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • mybatis3使用@Select等注解實現(xiàn)增刪改查操作

    mybatis3使用@Select等注解實現(xiàn)增刪改查操作

    這篇文章主要介紹了mybatis3使用@Select等注解實現(xiàn)增刪改查操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Spring中的MultipartFile詳解

    Spring中的MultipartFile詳解

    這篇文章主要介紹了Spring中的MultipartFile詳解,隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就為大家?guī)砥饰鯩ultipartFile的神秘面紗,需要的朋友可以參考下
    2024-01-01
  • 如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    這篇文章主要介紹了如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 如何將JSON字符串?dāng)?shù)組轉(zhuǎn)對象集合

    如何將JSON字符串?dāng)?shù)組轉(zhuǎn)對象集合

    這篇文章主要介紹了如何將JSON字符串?dāng)?shù)組轉(zhuǎn)對象集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論