Object-Relational Mapping (ORM)

December 16, 20243 min read

Object-Relational Mapping (ORM)

Object-Relational Mapping (ORM) simplifies database operations in modern applications. This guide will show you how to set up ORM with PostgreSQL using Spring Boot and the Gin framework.


🌟 Why Use ORM?

ORM bridges the gap between object-oriented programming and relational databases by mapping objects directly to database tables. This eliminates the need for manual SQL queries, reducing errors and increasing productivity for developers.


🌟 Prerequisites

📋 Ensure you have the following:

  • Java Development Kit (JDK) 17+
  • 📦 Maven or Gradle installed
  • 🖥️ A Java IDE
  • 🐘 PostgreSQL installed and running

For Go:

  • 🔧 Golang 1.17+ installed
  • 🔄 go.mod initialized in your project

🛠️ Step 1: Add Dependencies

To set up a Spring Boot project and integrate ORM, follow these steps:

Add Dependencies

For Spring Boot projects, include the following dependencies in your project:

  • Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency>
  • Gradle:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.postgresql:postgresql'

Configure the Database

Set up your PostgreSQL connection in the application.properties or application.yml file:

spring.datasource.url=jdbc:postgresql://localhost:5432/demo spring.datasource.username=your_username spring.datasource.password=your_password spring.jpa.hibernate.ddl-auto=update

Initialize the Project

If you haven't already, create your Spring Boot project using Spring Initializr:

  1. Choose Spring Web, Spring Data JPA, and PostgreSQL Driver as dependencies.
  2. Download the project and import it into your preferred IDE.

For Go projects:

  • Install Gin Framework and GORM:
# Install the Gin framework go get -u github.com/gin-gonic/gin # Install the GORM PostgreSQL driver go get -u gorm.io/driver/postgres # Install the GORM ORM library go get -u gorm.io/gorm

📋 Step 2: Define the Model and Implement the REST Controller

This step combines creating the entity/model, repository, and REST controllers.

Entity

package com.example.demo.entity; import jakarta.persistence.*; import lombok.Data; @Data @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; }

Repository

package com.example.demo.repository; import com.example.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { }

REST Controller

package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.repository.UserRepository; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/users") import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class UserController { private final UserRepository userRepository; @GetMapping public List<User> getAllUsers() { return userRepository.findAll(); } @PostMapping public User createUser(@RequestBody User user) { return userRepository.save(user); } }

Entity

package com.example.demo.entity import jakarta.persistence.* @Entity class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0, var name: String, var email: String )

Repository

package com.example.demo.repository import com.example.demo.entity.User import org.springframework.data.jpa.repository.JpaRepository interface UserRepository : JpaRepository<User, Long>

REST Controller

package com.example.demo.controller import com.example.demo.entity.User import com.example.demo.repository.UserRepository import org.springframework.web.bind.annotation.* @RestController @RequestMapping("/api/users") class UserController( private val userRepository: UserRepository ) { @GetMapping fun getAllUsers(): List<User> = userRepository.findAll() @PostMapping fun createUser(@RequestBody user: User): User = userRepository.save(user) }

Model and Database Connection

package main import ( "gorm.io/driver/postgres" "gorm.io/gorm" ) var DB *gorm.DB func connectDatabase() { dsn := "host=localhost user=your_username password=your_password dbname=demo port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic("Failed to connect to database!") } DB = db DB.AutoMigrate(&User{}) } type User struct { ID uint `json:"id" gorm:"primaryKey"` Name string `json:"name"` Email string `json:"email"` }

Handlers

package main import ( "github.com/gin-gonic/gin" ) func getUsers(c *gin.Context) { var users []User DB.Find(&users) c.JSON(200, users) } func createUser(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } DB.Create(&user) c.JSON(201, user) } func main() { r := gin.Default() connectDatabase() r.GET("/api/users", getUsers) r.POST("/api/users", createUser) r.Run() // Listen and serve on 0.0.0.0:8080 }

▶️ Running the Applications

  • Spring Boot:

    ./mvnw spring-boot:run
  • Gin:

    go run main.go

🧪 Testing with cURL

You can test the API using the following cURL commands:

Fetch All Users:

curl -X GET http://localhost:8080/api/users

Create a New User:

curl -X POST http://localhost:8080/api/users \ -H "Content-Type: application/json" \ -d '{"name": "John Doe", "email": "johndoe@example.com"}'

This guide demonstrates how to use ORM for PostgreSQL in Spring Boot with Java, Kotlin, and Gin.