Create a Spring Boot Project
Open IntelliJ IDEA, click Create New Project and select Spring Initializr. Then click Next.


For the add on dependencies, we can add them later. Click Next and Finish.
Change the Java version to your current Java version.

Also remember to change the Java version in pom.xml and the SpringBoot version:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- version under 3 -->
<version>2.6.7 </version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
Connect to Database
JDBC
Add the following dependencies in pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
Reload the project using Maven and we can see the dependencies. Java version
To connect to the database, we need to add the following configurations in application.properties:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/transactionDemo
spring.datasource.username=root
#NEVER store password as plain text in the property file or databases!!!
spring.datasource.password=password
Then create a configuration file for JDBC with DataSource.
@Configuration
@PropertySource("classpath:application.properties")
public class JDBCTemplateConfig {
@Value("${spring.datasource.driver-class-name}")
private String JDBC_DRIVER;
@Value("${spring.datasource.url}")
private String DB_URL;
@Value("${spring.datasource.username}")
private String USER;
@Value("${spring.datasource.password}")
private String PASSWORD;
@Bean // register extra libs to spring container
public DataSource jdbcDataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(getJDBC_DRIVER());
dataSource.setUrl(getDB_URL());
dataSource.setUsername(getUSER());
dataSource.setPassword(getPASSWORD());
return dataSource;
}
// getters and setters...
}
Then we can use JdbcTemplate to connect to the database, the common methods are listed below.
@Repository
public class QuestionDao {
private JdbcTemplate jdbcTemplate;
private QuestionRowMapper questionRowMapper;
@Autowired
public QuestionDao(JdbcTemplate jdbcTemplate, QuestionRowMapper questionRowMapper) {
this.jdbcTemplate = jdbcTemplate;
this.questionRowMapper = questionRowMapper;
}
// query for a list of Object using query() method
public List<Question> getAllQuestions() {
String sql = "SELECT * FROM question";
return jdbcTemplate.query(sql, questionRowMapper);
}
// query for a single Object using queryForObject() method
public Question getQuestionById(Integer questionId) {
String sql = "SELECT * FROM question WHERE question_id = ?";
return jdbcTemplate.queryForObject(sql, questionRowMapper, questionId);
}
// insert, update, delete using update() method
public void addQuestion(int categoryId, String description, boolean active) {
String sql = "INSERT INTO question (category_id, description, is_active) VALUES (?, ?, ?)";
jdbcTemplate.update(sql, categoryId, description, active);
}
public void changeQuestionStatus(Integer questionId, boolean status) {
String sql = "UPDATE question SET is_active = ? WHERE question_id = ?";
jdbcTemplate.update(sql, status, questionId);
}
}
To map the result set to an object, we need to create a RowMapper class.
@Component
public class QuestionRowMapper implements RowMapper<Question> {
@Override
public Question mapRow(ResultSet rs, int rowNum) throws SQLException {
Question question = new Question();
question.setQuestionId(rs.getInt("question_id"));
question.setCategoryId(rs.getInt("category_id"));
question.setActive(rs.getBoolean("is_active"));
question.setDescription(rs.getString("description"));
return question;
}
}
Now, with the JdbcTemplate and RowMapper, we can manipulate the database.
Hibernate
Add the following dependencies in pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <!-- JPA -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <!-- MySQL -->
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.14.Final</version>
</dependency>
Create a RESTful Controller
Add the following dependencies in pom.xml:
<!-- Notice that the spring-boot-starter-Tomcat is embedded in web here -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <!-- Spring Web -->
</dependency>
Add @RestController annotation to the controller class. Also, we need to create the DTO classes to handle the request and response.
```Java
@RestController
public class DashBoardController {
private CategoryService categoryService;
@Autowired
public DashBoardController(CategoryService categoryService) {
this.categoryService = categoryService;
}
@GetMapping("/categories")
// @RequestBody ProductRequest productRequest
public ResponseEntity<CategoriesResponse> getCategories() {
// get all catogires
List<Category> allCategories = categoryService.getAllCategories();
return ResponseEntity.ok(CategoriesResponse.builder().categories(allCategories).build());
}
}
For the request and response, we need to create the DTO classes.
@Getter
@Setter
@Builder
public class CategoriesResponse {
// this is to map the response with the Json key
@JsonProperty(value = "categories")
private List<Category> categories;
}
