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 Boot JPA Sample Maven Project With Query Methods

Below is a step-by-step guide to create a Spring Boot JPA sample Maven project with query methods:

1. Dependencies:

Start by adding necessary dependencies to your pom.xml:

<dependencies>
    <!-- Spring Boot Starter Web for RESTful APIs -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data JPA for JPA support -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- H2 database for demonstration purposes -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2. Entity:

Assume a simple Book entity:

package com.example.demo.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String author;

    // Getters, setters, constructors, etc.
}

3. Repository:

Create a repository with query methods:

package com.example.demo.repository;

import com.example.demo.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BookRepository extends JpaRepository<Book, Long> {
    List<Book> findByTitle(String title);
    List<Book> findByAuthor(String author);
    // Add more custom query methods as needed
}

Note: The methods findByTitle and findByAuthor are examples of query methods that will be auto-implemented by Spring Data JPA without requiring actual SQL or JPQL.

4. Service:

Use the repository in a service:

package com.example.demo.service;

import com.example.demo.entity.Book;
import com.example.demo.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookService {

    @Autowired
    private BookRepository bookRepository;

    public List<Book> findBooksByTitle(String title) {
        return bookRepository.findByTitle(title);
    }

    public List<Book> findBooksByAuthor(String author) {
        return bookRepository.findByAuthor(author);
    }

    // ... other methods as required
}

5. Controller:

Create a REST controller:

package com.example.demo.controller;

import com.example.demo.entity.Book;
import com.example.demo.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("/books/title")
    public List<Book> getBooksByTitle(@RequestParam String title) {
        return bookService.findBooksByTitle(title);
    }

    @GetMapping("/books/author")
    public List<Book> getBooksByAuthor(@RequestParam String author) {
        return bookService.findBooksByAuthor(author);
    }
}

6. Configuration:

In application.properties:

# H2 configurations
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

# Hibernate configurations
spring.jpa.hibernate.ddl-auto=update

7. Application:

Ensure you have a Spring Boot application runner class, typically with a @SpringBootApplication annotation.

8. Testing:

Now, run the application and you can access endpoints like /books/title?title=SomeTitle and /books/author?author=SomeAuthor to filter books by title or author, respectively.

With this structure, you have a fully functioning Spring Boot JPA application with custom query methods, and you can easily extend it with additional entities, repositories, and services as required.

  1. Building a simple Spring Boot JPA Maven project:

    • Description: This topic involves setting up a basic Spring Boot project with Maven and integrating JPA for data persistence.
    • Code:
      // Main Application Class
      @SpringBootApplication
      public class SpringBootJpaApplication {
          public static void main(String[] args) {
              SpringApplication.run(SpringBootJpaApplication.class, args);
          }
      }
      
  2. Query methods in Spring Boot JPA with Maven project:

    • Description: Introduces simple query methods for CRUD operations provided by Spring Data JPA.
    • Code:
      // UserRepository Interface
      public interface UserRepository extends JpaRepository<User, Long> {
          List<User> findByFirstName(String firstName);
          Optional<User> findByIdAndLastName(Long id, String lastName);
      }
      
  3. CRUD operations and query methods in Spring Boot JPA:

    • Description: Expands on the basic CRUD operations and custom query methods using JpaRepository.
    • Code:
      // User Entity
      @Entity
      public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String firstName;
          private String lastName;
          // Getters and setters
      }
      
  4. Using JpaRepository and query annotations in Spring Boot Maven project:

    • Description: Demonstrates the usage of JpaRepository and query annotations like @Query for more complex queries.
    • Code:
      // UserRepository Interface
      public interface UserRepository extends JpaRepository<User, Long> {
          @Query("SELECT u FROM User u WHERE u.age > :age")
          List<User> findByAgeGreaterThan(@Param("age") int age);
      }
      
  5. Custom query methods with Spring Boot JPA and Maven:

    • Description: Explores the creation of custom query methods in Spring Boot JPA repositories.
    • Code:
      // UserRepository Interface
      public interface UserRepository extends JpaRepository<User, Long> {
          List<User> findCustomQuery(String param);
      }
      
  6. Dynamic queries with QueryDSL in Spring Boot JPA Maven project:

    • Description: Introduces QueryDSL for building dynamic queries in Spring Boot JPA applications.
    • Code:
      // UserRepository Interface
      public interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
      }
      
  7. Testing query methods in Spring Boot JPA Maven project:

    • Description: Discusses approaches to test query methods in a Spring Boot JPA application.
    • Code:
      // UserRepositoryTest Class
      @RunWith(SpringRunner.class)
      @DataJpaTest
      public class UserRepositoryTest {
          @Autowired
          private TestEntityManager entityManager;
          @Autowired
          private UserRepository userRepository;
          // Test methods
      }