Code ví dụ Spring Boot Data JPA – Page/Pageable – Sort
NỘI DUNG BÀI VIẾT
Các công nghệ sử dụng:
- Spring Boot
- Maven
- JDK 1.8
- Eclipse + Spring Tool Suite
- MySQL
- Thymeleaf
Tạo Database
Tạo database spring-data với table customer trên MySQL
CREATE DATABASE IF NOT EXISTS `spring-data`;
USE `spring-data`;
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
Code language: JavaScript (javascript)
Tạo Spring Boot Project
Cấu trúc project:
File application.properties
Config các thông tin kết nối database, hibernate.
application.properties
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/spring-data?useSSL=false
spring.datasource.username=root
spring.datasource.password=admin1234
## ==============JPA / HIBERNATE=================
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Customer.java
package stackjava.com.sbdatapagination.entities;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "customer")
public class Customer implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "address")
private String address;
// getter - setter
}
Code language: JavaScript (javascript)
CustomerRepository.java
package stackjava.com.sbdatapagination.repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import stackjava.com.sbdatapagination.entities.Customer;
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
@Query("SELECT e FROM Customer e")
Page<Customer> findCustomers(Pageable pageable);
}
Code language: JavaScript (javascript)
CustomerController.java
package stackjava.com.sbdatapagination.controller;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import stackjava.com.sbdatapagination.entities.Customer;
import stackjava.com.sbdatapagination.repository.CustomerRepository;
@Controller
public class CustomerController {
@Autowired
private CustomerRepository customerRepository;
@PostConstruct
public void initData() {
System.out.println("__________Reset and init data________________");
customerRepository.deleteAll();
for (int i = 0; i < 100; i++) {
customerRepository.save(new Customer("name" + i, "address" + i));
}
}
@RequestMapping("/")
public String listCustomer(Model model,
@RequestParam(name = "page", required = false, defaultValue = "0") Integer page,
@RequestParam(name = "size", required = false, defaultValue = "5") Integer size,
@RequestParam(name = "sort", required = false, defaultValue = "ASC") String sort) {
Sort sortable = null;
if (sort.equals("ASC")) {
sortable = Sort.by("id").ascending();
}
if (sort.equals("DESC")) {
sortable = Sort.by("id").descending();
}
Pageable pageable = PageRequest.of(page, size, sortable);
model.addAttribute("listCustomer", customerRepository.findCustomers(pageable));
return "customer-list";
}
}
Code language: JavaScript (javascript)
– Method initData
được đánh dấu @PostConstruct
tức là nó chỉ chạy duy nhất 1 lần khi bean CustomerController
được khởi tạo; method initData
sẽ thực hiện khởi tạo data (xóa hết dữ liệu trong database và insert vào 100 đối tượng customer)
– method listCustomer
sẽ thực hiện trả về trang customer-list.html
với các đối tượng được truy vấn theo tham số gửi lên (trang nào, số phần tử là bao nhiêu, sắp xếp theo thứ tự nào) – ở đây mình thực hiện sort theo id.
customer-list.html
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Spring Data Paging + Sorting</title>
<style>
table, th, td, tr {
border: 1px solid black;
}
td {
padding-right: 30px;
}
</style>
</head>
<body>
<h1>Demo Spring Boot + Spring Data Paging / Sorting</h1>
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Address</th>
</tr>
<th:block th:each="customer : ${listCustomer}">
<tr>
<td><p th:text="${customer.id}"></p></td>
<td><p th:text="${customer.name}"></p></td>
<td><p th:text="${customer.address}"></p></td>
</tr>
</th:block>
</table>
</body>
</html>
Code language: HTML, XML (xml)
Demo:
Trường hợp không truyền gì lên thì sẽ mặc định lấy page đầu tiên (page 0) và kích thước page là 5
Trường hợp mình truyền page = 2, kích thước page = 10 => số phần tử được lấy là 10 kể từ phần tử thứ 10 (page đầu tiên có 10 phần tử)
Okay, Done!
Download code ví dụ trên tại đây.
References:
https://stackjava.com/spring/code-vi-du-spring-boot-data-jpa-page-pageable-sort.html
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
Leave a Reply