Module: Database Integration

H2 / MySQL Configuration

This section will guide you through integrating a database with your Spring Boot application. We'll cover both H2 (an in-memory database, great for development and testing) and MySQL (a popular relational database for production).

Prerequisites

  • Java Development Kit (JDK) 8 or higher
  • Maven or Gradle
  • Spring Boot project set up (refer to previous tutorials if needed)
  • MySQL Server installed (for MySQL configuration)

1. H2 Database Configuration

H2 is a lightweight, in-memory database perfect for development and testing. Spring Boot automatically configures H2 if the necessary dependencies are present.

a) Add H2 Dependency:

Add the following dependency to your pom.xml (Maven) or build.gradle (Gradle):

Maven (pom.xml):

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle (build.gradle):

runtimeOnly 'com.h2database:h2'

b) Configure application.properties or application.yml:

Spring Boot automatically configures H2 with default settings. However, you can customize it. Here's an example using application.properties:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create  # Creates tables automatically
spring.h2.console.enabled=true # Enables the H2 console (for browsing data)

Explanation:

  • spring.datasource.url: The JDBC URL for the H2 database. mem:testdb creates an in-memory database named testdb.
  • spring.datasource.driverClassName: The JDBC driver class name for H2.
  • spring.datasource.username: The database username (default is sa).
  • spring.datasource.password: The database password (default is empty).
  • spring.jpa.hibernate.ddl-auto: Controls how Hibernate manages the database schema. create will create tables if they don't exist. Other options include update (updates schema based on changes in entities) and none (no schema management). Use create or update cautiously in production.
  • spring.h2.console.enabled: Enables the H2 console, accessible at http://localhost:8080/h2-console (assuming your application runs on port 8080).

c) Accessing the H2 Console:

After running your Spring Boot application, open your web browser and navigate to http://localhost:8080/h2-console. Use the following credentials:

  • JDBC URL: jdbc:h2:mem:testdb
  • Username: sa
  • Password: (leave blank)

You can now view and manipulate the database schema and data.

2. MySQL Database Configuration

To connect to a MySQL database, you'll need to provide the connection details in your Spring Boot configuration.

a) Add MySQL Dependency:

Add the MySQL Connector/J dependency to your pom.xml (Maven) or build.gradle (Gradle):

Maven (pom.xml):

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle (build.gradle):

runtimeOnly 'mysql:mysql-connector-java'

b) Configure application.properties or application.yml:

Configure your database connection details in application.properties or application.yml. Replace the placeholders with your actual MySQL credentials.

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.jpa.hibernate.ddl-auto=create # Or update, depending on your needs

application.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydatabase?useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: myuser
    password: mypassword
  jpa:
    hibernate:
      ddl-auto: create # Or update

Explanation:

  • spring.datasource.url: The JDBC URL for your MySQL database. Replace localhost:3306 with your MySQL server address and port. Replace mydatabase with the name of your database. useSSL=false disables SSL, which is often necessary for local development.
  • spring.datasource.driverClassName: The JDBC driver class name for MySQL.
  • spring.datasource.username: Your MySQL username.
  • spring.datasource.password: Your MySQL password.
  • spring.jpa.hibernate.ddl-auto: As explained in the H2 section. Consider update for production environments.

c) Create the Database (if it doesn't exist):

Before running your application, ensure the database specified in the spring.datasource.url exists in your MySQL server. You can create it using a MySQL client (e.g., MySQL Workbench, command line):

CREATE DATABASE mydatabase;

d) Run Your Application:

After configuring the database connection, run your Spring Boot application. Spring Boot will automatically create the tables defined by your JPA entities (if spring.jpa.hibernate.ddl-auto is set to create or update).

3. Data Access with JPA (Example)

Let's assume you have a simple entity:

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {

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

    private String name;

    private String email;

    // Getters and setters
}

And a corresponding repository:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

You can then use the repository to interact with the database:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

This demonstrates a basic example of how to save and retrieve data from the database using Spring Data JPA.

Important Considerations

  • Security: Never hardcode database credentials directly in your code. Use environment variables or a configuration server for secure credential management.
  • Connection Pooling: Spring Boot automatically configures a connection pool (HikariCP by default). You can customize the connection pool settings in application.properties or application.yml.
  • Transaction Management: Spring Boot provides automatic transaction management. Use @Transactional annotation to manage transactions in your service methods.
  • Database Schema Management: Carefully consider the spring.jpa.hibernate.ddl-auto property. create is suitable for development, but update or none are generally preferred for production. Use a database migration tool (e.g., Flyway, Liquibase) for managing schema changes in a controlled manner.
  • Error Handling: Implement proper error handling to gracefully handle database connection errors and other exceptions.

This tutorial provides a foundation for database integration in Spring Boot. Explore Spring Data JPA and other related technologies to build more complex and robust data access layers.