This tutorial will walk you through the steps of building a full stack CRUD web app and RESTful APIs web services example with Spring Boot, Lombok, JPA and Hibernate, MySQL, FreeMarker, VueJS and Axios

What you'll build

What you'll need

Your local computer should have JDK 8+ or OpenJDK 8+, Maven 3+, MySQL Server 5+ or Docker CE 18+

You should also walk through the following tutorials

Project structure

├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── hellokoding
│       │           └── springboot
│       │               └── restful
│       │                   ├── product
│       │                   │   ├── Product.java
│       │                   │   ├── ProductAPI.java
│       │                   │   ├── ProductController.java
│       │                   │   ├── ProductRespository.java
│       │                   │   └── ProductService.java
│       │                   └── Application.java
│       └── resources
│           ├── static
│           │   ├── products.css
│           │   └── products.js
│           ├── templates
│           │   └── products.html
│           └── application.properties
├── Dockerfile
├── docker-compose.yml
└── pom.xml

Project dependencies


Define JPA Entity


@Data is a Lombok annotation which generates field getters and setters, toString, equals and hashCode methods for you at compile time

@Entity is a JPA annotation which specifies the class as an entity (so the class name can be used in JPQL queries) and as a table in database (the @Entity class name will match with the underlying table name, if the @Table annotation is omitted)

Learn more about JPA and Hibernate

Define Spring Data JPA Repository


Implement Service


RequiredArgsConstructor is a Lombok annotation which generates a constructor with required fields (final fields and @NonNull fields). For the above ProductService class, Lombok will generate

@Service
public class ProductService {  
    private final ProductRespository productRespository;

    public ProductService(ProductRespository productRespository) {
        this.productRespository = productRespository;
    }

    ...
}

For classes which only have single constructor, since Spring 4.3, you no longer need to specify an explicit injection annotation such as @Autowired, Spring does that for you

If your editor has not been installed Lombok plugin, you may get a highlight error on the productRespository field. Either compiling the project or installing the plugin will resolve the problem

Learn more about using Lombok in Java and Spring Boot

Define REST APIs


Define Web Controller


Define FreeMarker View Template


Static Files



Application Configurations



hk-mysql refers to Docker Compose service defined in the below docker-compose.yml file

spring.jpa.hibernate.ddl-auto=create allows JPA/Hibernate auto create database and table schema for you

On production environment, you may like to disable the DDL Auto feature by using spring.jpa.hibernate.ddl-auto=validate or spring.jpa.hibernate.ddl-auto=none (default). Check out this example as one of the approaches
Flyway Example of Database Migration/Evolution with Spring Boot, JPA and Hibernate

Run with Docker

Prepare Dockerfile for Java/Spring Boot application and docker-compose.yml for MySQL Server



Type the below command at the project root directory, make sure your local Docker is running

docker-compose up

Run with your local MySQL Server

You can run the app with your local MySQL Server by updating hk-mysql on application.properties to localhost and type the below command at the project root directory

mvn clean spring-boot:run

Testing time

Access to localhost:8080 and start playing around with the app

Source code

https://github.com/hellokoding/hellokoding-courses/tree/master/springboot-examples/springboot-crud-mysql-vuejs

References