In previous episodes (Part1, Part2) we saw how to create Java Maven project from scratch using SpringBoot – followed by how to deploy the application to docker and then I also demonstrated how can you set up MySQL database server, with automated initialization of a fresh database instance.
Now, let’s see how to set up RESTful Web API to display data from database using Hibernate ORM. We’ll also see how to set up a local development environment and docker deployment environment to quickly switch between the two, and establish an efficient work-flow for your project. Next, we’d set up our project to perform CRUD operations using Hibernate. And finally, we will create our Web API endpoints which can serve the requests made from the browser, in JSON format.
Let’s start by cleaning up the docker workspace (optional step).
Following commands delete images and containers.
You have been warned.
For now, we want to create two environments or profiles, a local profile for your local development and container profile for your docker container. Evidently, you can create as many profiles for different environments as you need. e.g. QA, UAT, Staging etc.
Here is my current directory structure
│ ├── 01_schema.sql
│ └── 02_data.sql
│ ├── Docker
│ │ └── Dockerfile
│ ├── main
│ │ ├── java
│ │ │ └── edu
│ │ │ └── gatech
│ │ │ └── epidemics
│ │ │ ├── api
│ │ │ │ └── HomeController.java
│ │ │ ├── edu
│ │ │ │ └── gatech
│ │ │ │ └── epidemics
│ │ │ └── EpidemicsApplication.java
│ │ └── resources
│ └── test
│ └── java
Under ./src/main/resources folder, let’s create 3 different files as following:
Here in this example we want to create two environments or profiles, a local profile for your local development and container profile for your docker container, but you can create profiles for your different environments like QA, UAT, Staging etc. as many as you please.
(I dumped the content of these 3 files in one code-block below)
To be able to read these configurations, we need to add a maven dependency, as following:
To actually, read the configurations, let’s create a class in package edu.gatech.epidemics
Next, we need to verify if we can read the configurations:
And it works!
Now let’s move towards the 2nd part of this episode, Web API and Hibernate ORM.
Say, I want to create an API for following table in MySQL database:
Now, back in our project we need to add maven dependencies. In pom.xml add following dependencies:
Create packages inside root as following:
To avoid any pain, I recommend that you follow the project structure I am going for. It certainly makes things easier.
First let’s create our entity or model class as following:
Next is, our repository interface, and yes, it is actually that simple! Just be sure to extend CrudRepository.
Finally, we want to create our service as following:
Now, I do not have MySQL database server installed locally, so I am going to use guess what, a Docker container, instead! We’d wait for MySQL to be up and spinning. The wait time should not be too bad. Now let’s run the application and it works!
One more thing …
Let’s try something real quick. I would stop the application from my IDE and I would also stop the MySQL container. If you have installed the database on your local MySQL database instance, you can follow along by temporarily stopping MySQL service, to make your database temporarily inaccessible.
You can even repeat the same test with empty database (i.e. no tables) and your SpringBoot application would still fail to start.
This proves that before it starts, Hibernate from SpringBoot is expecting MySQL database to be reachable and the database schema to be in place.
So we must ensure the same for our docker configuration as well! To achieve our goal, we need to create a shell script file in our resources folder, along with the 3 files we just created, and let’s call it wrapper.sh
This also requires slight modification in our existing Dockerfile as following:
Now, let’s go ahead and rebuild our project.
Kwel! We are now ready to create our API controller ./src/main/java/edu/gatech/epidemics/api/UserApiController.java as following and run the project one final time!