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

SpringBoot中各種分頁(yè)查詢(xún)方式的示例代碼

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

1. Spring Data JPA 分頁(yè)

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

1.1 基本實(shí)現(xiàn)

首先,添加依賴(lài):

<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>

實(shí)體類(lèi):

@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í)我們需要自定義返回?cái)?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 分頁(yè)

2.1 使用 PageHelper

添加依賴(lài):

<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 分頁(yè)

添加依賴(lài):

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

配置分頁(yè)插件:

@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)分頁(yè)

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

@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 分頁(yè)參數(shù)自動(dòng)綁定

可以創(chuàng)建一個(gè)分頁(yè)參數(shù)類(lèi)來(lái)自動(dòng)綁定分頁(yè)參數(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)式分頁(yè) (WebFlux)

如果使用 Spring WebFlux:

添加依賴(lài):

<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 分頁(yè):最簡(jiǎn)單,適合大多數(shù) CRUD 應(yīng)用

1.MyBatis 分頁(yè):

  • PageHelper:簡(jiǎn)單易用
  • MyBatis-Plus:功能更強(qiáng)大

2.手動(dòng)分頁(yè):靈活,適合特殊需求

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Spring中的MultipartFile詳解

    這篇文章主要介紹了Spring中的MultipartFile詳解,隨著Spring框架的崛起,使用Spring框架中的MultipartFile來(lái)處理文件也是件很方便的事了,今天就為大家?guī)?lái)剖析MultipartFile的神秘面紗,需要的朋友可以參考下
    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,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 如何將JSON字符串?dāng)?shù)組轉(zhuǎn)對(duì)象集合

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

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

最新評(píng)論