post-image

Code ví dụ Spring Boot Data JPA – Page/Pageable – Sort

Spring Boot Starters & Common Configurations Thực hành

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 database spring-data với table customer

Tạo Spring Boot Project

spring starter project
Code ví dụ Spring Boot Data JPA - Page/Pageable - Sort
Code ví dụ Spring Boot Data JPA - Page/Pageable - Sort

Cấu trúc project:

Code ví dụ Spring Boot Data JPA - Page/Pageable - Sort

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

Code ví dụ Spring Boot Data JPA - Page/Pageable - Sort

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

Code ví dụ Spring Boot Data JPA - Page/Pageable - Sort

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

Your email address will not be published. Required fields are marked *