SpringBoot中各種分頁查詢方式的示例代碼
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. 手動分頁
當數(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. 響應式分頁 (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 應用
1.MyBatis 分頁:
- PageHelper:簡單易用
- MyBatis-Plus:功能更強大
2.手動分頁:靈活,適合特殊需求
3.自動綁定分頁參數(shù):提高代碼整潔度
4.響應式分頁:適合響應式應用
根據(jù)項目需求和技術(shù)棧選擇合適的分頁方式。對于大多數(shù) Spring Boot 項目,Spring Data JPA 或 MyBatis-Plus 的分頁功能已經(jīng)足夠強大且易于使用。
以上就是SpringBoot中各種分頁查詢方式的示例代碼的詳細內(nèi)容,更多關(guān)于SpringBoot分頁查詢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)
這篇文章主要介紹了fastjson對JSONObject中的指定字段重新賦值的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Spring通過c3p0配置bean連接數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了Spring通過c3p0配置bean連接數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
Java中的System.getenv()和System.getProperty()使用詳解
文章介紹了Java中用于讀取環(huán)境配置信息的兩種方法:System.getenv()和System.getProperty(),前者讀取系統(tǒng)環(huán)境變量,返回一個不可修改的Map;后者獲取JVM環(huán)境變量值,可以通過-D參數(shù)設置,文章還提到,通過這兩種方法可以簡化配置,不需要修改代碼2024-11-11
springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式
這篇文章主要介紹了springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
mybatis3使用@Select等注解實現(xiàn)增刪改查操作
這篇文章主要介紹了mybatis3使用@Select等注解實現(xiàn)增刪改查操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
如何在Spring Boot應用中優(yōu)雅的使用Date和LocalDateTime的教程詳解
這篇文章主要介紹了如何在Spring Boot應用中優(yōu)雅的使用Date和LocalDateTime,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

