Spring Boot Tutorial
Spring Boot - Software Setup and Configuration (STS/Eclipse/IntelliJ)
Prerequisite (Spring Core Concepts)
Spring Boot Core
Spring Boot with REST API
Spring Boot with Database and Data JPA
Spring Boot with Kafka
Spring Boot with AOP
Spring Data JPA is an integral part of the Spring Data family. It provides a way to reduce the boilerplate code required to implement data access layers for various persistence stores.
Spring Data JPA works with JPA (Java Persistence API) and allows easy database access while maintaining the advantages of real object-oriented software development. With Spring Data JPA, you can easily perform CRUD operations, pagination, and sorting without much configuration or using boilerplate code.
Repository Pattern: Spring Data JPA provides a set of repository interfaces (like CrudRepository
and JpaRepository
) to help with common database operations without writing boilerplate code.
Derived Query Methods: By declaring methods with specific naming conventions in your repository interface, you can create queries without writing their implementations.
Specifications: To build complex dynamic queries.
Entity Auditing: Automatically populates auditing-related fields in database entities.
Pagination and Sorting: Easily handles pagination and sorting without extra code.
Custom Queries: Allows the use of @Query
annotation to specify JPQL or native SQL queries.
Add Dependencies:
First, add the necessary dependencies to your pom.xml
:
<!-- Spring Boot Data JPA Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Database Driver (Example for H2 Database) --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
Configure Database:
In the application.properties
or application.yml
, specify your database connection details:
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver spring.jpa.hibernate.ddl-auto=update
Define an Entity:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters, setters, and other attributes }
Create a Repository:
By extending one of the Spring Data JPA repository interfaces, you can gain access to CRUD methods and more without writing any implementation:
public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); }
The findByName
method is a derived query and will automatically be implemented by Spring Data JPA based on its naming.
Use the Repository:
You can @Autowire
the repository in your service or controller and use it:
@Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByName(String name) { return userRepository.findByName(name); } }
Run and Test:
You can now run your Spring Boot application, and the defined operations will be available to use.
Configuring Spring Data JPA in Spring Boot:
application.properties
or application.yml
file.// Example configuration in application.properties spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update
Entity mapping and repositories in Spring Boot with Spring Data JPA:
// Example entity in Spring Boot with Spring Data JPA @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; // Getters and setters } // Example repository in Spring Boot with Spring Data JPA public interface UserRepository extends JpaRepository<User, Long> { // Additional custom queries can be defined here }
CRUD operations with Spring Data JPA in Spring Boot:
// Example CRUD operations in Spring Boot with Spring Data JPA @Service public class UserService { @Autowired private UserRepository userRepository; public User createUser(User user) { return userRepository.save(user); } public List<User> getAllUsers() { return userRepository.findAll(); } public User getUserById(Long userId) { return userRepository.findById(userId).orElse(null); } public void deleteUser(Long userId) { userRepository.deleteById(userId); } }
Custom queries and JPQL in Spring Boot Spring Data JPA:
// Example custom query in Spring Boot Spring Data JPA public interface UserRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.username = :username") User findByUsername(@Param("username") String username); }
Pagination and sorting with Spring Data JPA in Spring Boot:
// Example pagination and sorting in Spring Boot Spring Data JPA public interface UserRepository extends JpaRepository<User, Long> { Page<User> findByUsername(String username, Pageable pageable); }
Auditing and versioning with Spring Data JPA in Spring Boot:
// Example auditing and versioning in Spring Boot Spring Data JPA @EntityListeners(AuditingEntityListener.class) public class User { @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; // Other fields and annotations }
Transaction management with Spring Data JPA in Spring Boot:
@Transactional
to manage transactions.// Example transaction management in Spring Boot Spring Data JPA @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public User createUser(User user) { // Perform multiple operations in a transaction // ... return userRepository.save(user); } }
Handling relationships and associations in Spring Boot Spring Data JPA:
@OneToOne
, @OneToMany
, @ManyToOne
, and @ManyToMany
.// Example relationship in Spring Boot Spring Data JPA @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; // Other fields @ManyToOne @JoinColumn(name = "user_id") private User user; } @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; // Other fields @OneToMany(mappedBy = "user") private List<Post> posts; }