最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • SpringBoot實現(xiàn)國際化的操作步驟

    SpringBoot實現(xiàn)國際化的操作步驟

    國際化(Internationalization) 是指為了適應(yīng)不同語言、文化和地區(qū)的用戶,使軟件能夠方便地進行本地化修改的過程,本文介紹了SpringBoot 國際化功能的簡單使用,感興趣的朋友可以參考下
    2024-02-02
  • Spring中屬性注入詳解

    Spring中屬性注入詳解

    這篇文章主要為大家詳細(xì)介紹了Spring中屬性注入,演示了int、String、數(shù)組、list等屬性的注入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • elasticsearch源碼分析index?action實現(xiàn)方式

    elasticsearch源碼分析index?action實現(xiàn)方式

    這篇文章主要為大家介紹了elasticsearch源碼分析index?action實現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Java實現(xiàn)將數(shù)組的元素用逗號連接的多種方法

    Java實現(xiàn)將數(shù)組的元素用逗號連接的多種方法

    在 Java 開發(fā)中,我們經(jīng)常需要將數(shù)組中的元素用逗號連接成一個字符串,這種需求在日志記錄、數(shù)據(jù)導(dǎo)出、API 響應(yīng)等場景中非常常見,本文將詳細(xì)介紹如何在 Java 中實現(xiàn)這一功能,并提供多種簡潔的方法和優(yōu)化建議,需要的朋友可以參考下
    2025-01-01
  • 深度理解Java訪問修飾符

    深度理解Java訪問修飾符

    今天帶大家學(xué)習(xí)的是Java的相關(guān)知識,文章圍繞著Java訪問修飾符展開,有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring Batch大數(shù)據(jù)量處理之從入門到精通實踐

    Spring Batch大數(shù)據(jù)量處理之從入門到精通實踐

    文章介紹了SpringBatch的基本架構(gòu)和核心配置,接著通過CSV導(dǎo)入數(shù)據(jù)庫和數(shù)據(jù)庫導(dǎo)出到文件兩個簡單任務(wù)示例進行講解,最后介紹了如何處理多步驟復(fù)雜任務(wù)
    2026-04-04
  • SpringBoot 使用 Ehcache 作為緩存的操作方法

    SpringBoot 使用 Ehcache 作為緩存的操作方法

    這篇文章主要介紹了SpringBoot 如何使用 Ehcache 作為緩存,我們通過添加 Ehcache 依賴、創(chuàng)建 Ehcache 配置文件并在 Spring Boot 應(yīng)用程序的配置文件中啟用 Ehcache 緩存,來配置 Ehcache 緩存,需要的朋友可以參考下
    2023-06-06
  • Java?中向?Arraylist?添加對象的示例代碼

    Java?中向?Arraylist?添加對象的示例代碼

    本文介紹了如何在 Java 中向 ArrayList 添加對象,并提供了示例和注意事項,通過掌握這些知識,讀者可以在自己的 Java 項目中有效地使用 ArrayList 來存儲和操作對象,需要的朋友可以參考下
    2023-11-11
  • SpringBoot HikariCP連接池監(jiān)控實現(xiàn)方案

    SpringBoot HikariCP連接池監(jiān)控實現(xiàn)方案

    文章介紹了五種監(jiān)控SpringBoot應(yīng)用程序中HikariCP連接池狀態(tài)和性能的工具和技術(shù),包括SpringBootActuator、Micrometer、Prometheus+Grafana、HikariCP自帶的Metrics以及NewRelic/Datadog等第三方服務(wù),每種方法都有其特點和配置步驟
    2025-01-01
  • java將數(shù)字價格轉(zhuǎn)換為中文大寫代碼示例(工具類)

    java將數(shù)字價格轉(zhuǎn)換為中文大寫代碼示例(工具類)

    這篇文章主要介紹了java將數(shù)字價格轉(zhuǎn)換為中文大寫的相關(guān)資料,在Java中實現(xiàn)將數(shù)字價格轉(zhuǎn)換為中文大寫需要將數(shù)字分解為各個部分(如個位、十位、百位等),并根據(jù)這些部分轉(zhuǎn)換為對應(yīng)的中文大寫數(shù)字,需要的朋友可以參考下
    2024-10-10

最新評論

鄂温| 大渡口区| 吴川市| 静宁县| 惠水县| 诸暨市| 全州县| 沙雅县| 恭城| 紫金县| 札达县| 嘉兴市| 六枝特区| 军事| 九龙城区| 晋江市| 恩施市| 宜章县| 衡阳县| 宣恩县| 湘潭县| 兰溪市| 包头市| 墨江| 保定市| 香港 | 金秀| 厦门市| 资兴市| 武陟县| 长岛县| 安图县| 固安县| 松潘县| 邵武市| 赤城县| 凉山| 平远县| 宜黄县| 明水县| 桃园县|