Conceive Design Implement Operate
JPAREPOSITORY API
GIẢNG VIÊN:
AGENDA
JPAREPOSITORY API
GIỚI THIỆU CSDL MẪU J5SHOP
TẠO CÁC LỚP THỰC THỂ
SƠ ĐỒ PHÂN CẤP THỪA KẾ JPAREPOSITORY
TẠO CÁC DAO LÀM VIỆC VỚI J5SHOP
XÂY DỰNG ỨNG DỤNG CRUD
SẮP XẾP VÀ PHÂN TRANG VỚI JPAREPOSITORY
TRUY VẤN CÓ SẮP XẾP
TRUY VẤN CÓ PHÂN TRANG
SẮP XẾP VÀ PHÂN TRANG SẢN PHẨM
CSDL J5SHOP
CSDL J5SHOP
POM.XML - THƯ VIỆN CẦN THIẾT
APPLICATION.PROPERTIES - THÔNG SỐ KẾT NỐI CSDL
spring.datasource.url=<dburl>
spring.datasource.username=<username>
spring.datasource.password=
spring.datasource.driverClassName=<driver>
spring.jpa.hibernate.dialect=<dialect>
spring.jpa.hibernate.ddl-auto=<none|create|create-drop|validate|update>
spring.jpa.show-sql=<true|false>
spring.jpa.properties.hibernate.format_sql=<true|false>
ENTITY RELATIONAL DIAGRAM
Product
Id: Integer
Name: String
Image: String
Price: Double
Quantity: Integer
CreateDate: Date
CategoryId: String
Available: Boolean
Username: String
Fullname: String
Password: String
Email: String
Photo: String
Activated: Boolean
Admin: Boolean
Id: Long
Username: String
CreateDate: Date
Address: String
Id: Long
OrderId: Long
ProductId: Integer
Price: Double
Quantity: Integer
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
Account
Id: String
Name: String
Order
OrderDetail
Category
@Entity
@Table
@UniqueConstraint
@Column
@Id
@GeneratedValue
@Temporal
@OneToMany
@ManyToOne
@JoinColumn
ERD - ENTITY RELATIONAL DIAGRAM
Category
…
@OneToMany(mappedBy=“category”)
List<Product> products
@OneToMany
1. @ManyToOne
Thay foreign key bằng entity
Product
@ManyToOne
2. @OneToMany
Map mới @ManyToOne
…
@ManyToOne
@JoinColumn(name=“categoryid”)
Category category
ORDERDETAIL ENTITY CLASS
❑ @Entity
❑ @Table
❑ @UniqueConstraint
❑ @Id
❑ @GeneratedValue
❑ @Column
❑ @ManyToOne
❑ @JoinColumn
ORDER ENTITY CLASS
❑@Temporal
❑@OneToMany
JPAREPOSITORY INHERITANCE HIERARCHY
<<Interface>>
Repository
<<Interface>>
CrudRepository
<<Interface>>
PagingAndSortingRepository
<<Interface>>
JpaRepository
<<Class>>
SimpleJpaRepository
❑Thông qua sơ đồ phân cấp thừa kế này, có
2 lựa chọn để lập trình với JpaRepository
1. Sử dụng SimpleJpaRepository.
2. Xây dựng lớp DAO implements JpaRepository
❑Với Spring Boot, thay vì xây dựng các lớp
DAO, ta chỉ việc tạo các interface thừa kế từ
JpaRepository và viết thêm các phương
thức truy vấn cần thiết, hệ thống sẽ tự
động tạo các Spring Bean thực thi theo
interface của chúng ta.
JPAREPOSITORY API DETAIL
<<Interface>>
CrudRepository<T, ID>
<S extends T> S save(S entity)
void delete(T entity)
T getOne(ID id)
Optional<T> findById(ID id)
Iterable<T> findAll()
Long count()
boolean exists(ID id)
<<Interface>>
JpaRepository<T, ID>
List<T> findAll()
List<T> findAll(Sort sort)
List<T> save(Iterable<? extends T> entities)
void flush()
T saveAndFlush(T entity)
void deleteInBatch(Iterable<T> entities)
❑Generic Types
<<Interface>>
PagingAndSortingRepository<T, ID>
Iterable<T> findAll(Sort sort)
Page<T> findAll(Pageable pageable)
❖T: Entity Class
❖ID: Primary Key Class
CRUDREPOSITORY<T, ID> API
❑<S extends T> S save(S entity)
❖Tạo mới hoặc update nếu entity đã tồn tại
❑void delete(T entity), deleteById(ID id)
❖Xóa thực thể
❑T getOne(ID id), Optional<T> findById(ID id)
❖Truy vấn thực thể theo id
❑Iterable<T> findAll()
❖Truy vấn tất cả thực thể
❑Long count()
❖Lấy số lượng của tất cả thực thể
❑boolean exists(ID id)
❖Kiểm tra sự tồn tại theo id
PAGINGANDSORTINGREPOSITORY<T, ID> API
❑Iterable<T> findAll(Sort sort)
❖Truy vấn tất cả có sắp xếp
❑Page<T> findAll(Pageable pageable)
❖Truy vấn phân trang có sắp xếp
<<Interface>>
CrudRepository
❑Trong đó:
❖Sort
➢ Cung cấp tiêu chí sắp xếp
<<Interface>>
PagingAndSortingRepository
❖Pageable
➢ Cung cấp tiêu chí sắp xếp và phân trang (nếu cần)
❖Page
➢ Chứa dữ liệu của trang đã được truy vấn và các thông số kết quả phân trang
JPAREPOSITORY<T, ID> API
❑List<T> findAll()
❖Truy vấn tất cả
❑List<T> findAll(Sort sort)
❖Truy vấn tất cả có sắp xếp
<<Interface>>
CrudRepository
❑List<T> save(Iterable<? extends T> entities)
❖Lưu (tạo hoặc cập nhật) nhiều thực thể
❑void flush()
<<Interface>>
PagingAndSortingRepository
❖Đồng bộ với CSDL
❑T saveAndFlush(T entity)
❖Lưu và đồng bộ với CSDL
❑void deleteInBatch(Iterable<T> entities)
❖Xóa nhiều thực thể
<<Interface>>
JpaRepository
CÁCH 1: SỬ DỤNG SIMPLEJPAREPOSITORY<T, ID>
implements
<<Interface>>
JpaRepository<T, ID>
<<Class>>
SimpleJpaRepository<T, ID>
❑SimpleJpaRepository(Class<Entity>, EntityManager)
❖Phương thức khởi dựng này tạo một đối tượng DAO tương ứng với một
Entity. Từ đó có thể gọi các phương thức phù hợp để làm việc với CSDL.
CÁCH 2: KẾ THỪA JPAREPOSITORY<T, ID>
extends
<<Interface>>
JpaRepository<T, ID>
<<Interface>>
XyzDAO
J5SHOP REPOSITORY CLASS DIAGRAM
<Category, String>
<Product, Integer>
<OrderDetail, Long>
<Order, Long>
<Account, String>
<<Interface>
CategoryDAO
<<Interface>
ProductDAO
<<Interface>
OrderDetail
DAO
<<Interface>
OrderDAO
<<Interface>
AccountDAO
<<Interface>
JpaRepository<T, ID>
J5SHOP REPOSITORY IMPLEMENTATION
public interface CategoryDAO extends JpaRepository<Category, String>{}
public interface ProductDAO extends JpaRepository<Product, Integer>{}
public interface AccountDAO extends JpaRepository<Account, String>{}
public interface OrderDAO extends JpaRepository<Order, Long>{}
public interface OrderDetailDAO extends JpaRepository<OrderDetail, Long>{}