Full Stack • Java • System Design • Cloud • AI Engineering

Repository Pattern in Java

Learn Repository Pattern in Java with Spring Data JPA, CRUD operations, database abstraction, enterprise architecture, UML diagrams, code examples, and interview questions.

What You Will Learn

  • What is Repository Pattern?
  • Why Repository Pattern is Needed
  • DAO vs Repository
  • Database Abstraction
  • Spring Data JPA
  • CRUD Operations
  • Enterprise Architecture
  • Benefits and Limitations
  • Interview Questions

Introduction

Every enterprise application needs data access.

Examples:

Customer Data

Order Data

Employee Data

Policy Data

Transaction Data

Without Repository Pattern:

@Service
public class CustomerService {

    public Customer getCustomer(Long id) {

        EntityManager em = ...

        return em.find(
                Customer.class,
                id);
    }
}

Problems:

Database Logic Inside Service

Code Duplication

Difficult Testing

Tight Coupling

Repository Pattern solves this problem.


What is Repository Pattern?

Repository Pattern acts as a collection-like interface between the domain layer and database layer.

Instead of:

Service → Database

Use:

Service

↓

Repository

↓

Database

Purpose of Repository Pattern

Primary Goal:

Abstract Database Access

From Business Logic

Real World Analogy

Think about a library.

Users don't directly access:

Book Storage Room

Instead:

User

↓

Librarian

↓

Storage

Librarian acts as Repository.


Problem Without Repository

flowchart LR
    A[Service]
    B[SQL Queries]
    C[Database]

    A --> B
    B --> C

Business layer knows database details.


Solution With Repository

flowchart LR
    A[Service]
    B[Repository]
    C[Database]

    A --> B
    B --> C

Database access centralized.


Repository Architecture

flowchart LR
    A[Controller]
    B[Service]
    C[Repository]
    D[Database]

    A --> B
    B --> C
    C --> D

Responsibilities

Repository handles:

CRUD Operations

Database Queries

Persistence Logic

Data Retrieval

CRUD Operations

Create

Read

Update

Delete

UML Diagram

classDiagram

class CustomerRepository {
    +save()
    +findById()
    +findAll()
    +delete()
}

class CustomerService

CustomerService --> CustomerRepository

Customer Entity

@Entity
public class Customer {

    @Id
    private Long id;

    private String name;

    private String email;

}

Repository Interface

public interface CustomerRepository {

    Customer findById(Long id);

    List<Customer> findAll();

    Customer save(Customer customer);

    void delete(Long id);
}

Repository Implementation

@Repository
public class CustomerRepositoryImpl
        implements CustomerRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public Customer findById(Long id) {

        return entityManager.find(
                Customer.class,
                id);
    }

    @Override
    public Customer save(
            Customer customer) {

        entityManager.persist(
                customer);

        return customer;
    }
}

Service Layer

@Service
public class CustomerService {

    private final CustomerRepository repository;

    public CustomerService(
            CustomerRepository repository) {

        this.repository = repository;
    }

    public Customer getCustomer(
            Long id) {

        return repository.findById(id);
    }
}

Request Flow

flowchart LR
    A[Controller]
    B[Service]
    C[Repository]
    D[Database]

    A --> B
    B --> C
    C --> D

Spring Data JPA

Spring automatically generates repository implementations.

Developer writes:

public interface CustomerRepository
        extends JpaRepository<
                Customer,
                Long> {

}

Spring generates:

save()

findById()

findAll()

delete()

Automatically.


Spring Data JPA Flow

flowchart LR
    A[Repository Interface]
    B[Spring Data JPA]
    C[Generated Implementation]

    A --> B
    B --> C

CRUD Example

Save

repository.save(customer);

Find By Id

repository.findById(id);

Find All

repository.findAll();

Delete

repository.deleteById(id);

Derived Query Methods

Spring Data JPA supports:

findByEmail(String email);

findByName(String name);

findByStatus(String status);

Spring generates SQL automatically.


Query Generation Flow

flowchart LR
    A[findByEmail]
    B[Spring Data]
    C[Generated SQL]
    D[Database]

    A --> B
    B --> C
    C --> D

Custom Query Example

@Query("""
SELECT c
FROM Customer c
WHERE c.email = :email
""")
Customer findCustomer(
        String email);

Banking Example

Entities:

Account

Transaction

Customer

Loan

Repositories:

AccountRepository

LoanRepository

TransactionRepository

Banking Architecture

flowchart LR
    A[Controller]
    B[Service]
    C[AccountRepository]
    D[Database]

    A --> B
    B --> C
    C --> D

Fund Transfer Flow

flowchart LR
    A[Transfer Request]
    B[Transfer Service]
    C[Account Repository]
    D[Database]

    A --> B
    B --> C
    C --> D

Insurance Example

Entities:

Policy

Claim

Customer

Premium

Repositories:

PolicyRepository

ClaimRepository

Insurance Workflow

flowchart LR
    A[Claim Request]
    B[Claim Service]
    C[Claim Repository]
    D[Database]

    A --> B
    B --> C
    C --> D

Repository vs DAO

Feature Repository DAO
Focus Domain Objects Database Tables
Abstraction High Medium
DDD Friendly Yes No
Spring Data JPA Yes Limited

DAO Example

CustomerDao

Focuses on:

Database Access

Repository Example

CustomerRepository

Focuses on:

Domain Objects

Repository vs Service

Service Repository
Business Logic Data Access
Validation CRUD
Workflow Queries

Testing Example

Mock Repository:

CustomerRepository repository =
        Mockito.mock(
                CustomerRepository.class);

Service testing becomes easy.


Unit Testing Flow

flowchart LR
    A[Test]
    B[Mock Repository]
    C[Service]

    A --> B
    B --> C

Enterprise Examples

Banking

Account Management

Loan Processing

Transaction History

Insurance

Policy Management

Claim Processing

Retail

Order Management

Inventory Tracking

Healthcare

Patient Records

Appointment Systems

Common Spring Repositories

JpaRepository

CrudRepository

PagingAndSortingRepository

JpaRepository Benefits

Provides:

CRUD

Pagination

Sorting

Batch Operations

Enterprise Architecture

flowchart LR
    A[Client]
    B[Controller]
    C[Service]
    D[Repository]
    E[Database]

    A --> B
    B --> C
    C --> D
    D --> E

Benefits

✅ Database Abstraction

✅ Cleaner Service Layer

✅ Better Testability

✅ Reusable Queries

✅ Supports DDD

✅ Easy Spring Integration


Limitations

❌ Extra Layer

❌ More Classes

❌ Can Be Overkill For Small Apps


When To Use

Use Repository Pattern when:

  • Enterprise Applications
  • Spring Boot Applications
  • Database Access Layer
  • Domain Driven Design

When Not To Use

Avoid when:

  • Very Small Utilities
  • Simple Scripts
  • One-Time Applications

Interview Questions

What is Repository Pattern?

A pattern that abstracts data access from business logic.


Why Use Repository?

To separate persistence logic from service logic.


Repository vs DAO?

Repository works with domain models.

DAO works with database operations.


Spring Repository Annotation?

@Repository

Spring Data JPA Repository?

JpaRepository

Main Benefit?

Loose coupling between business logic and persistence layer.


Key Takeaways

  • Repository Pattern abstracts database operations.
  • Separates persistence logic from business logic.
  • Commonly used with Spring Data JPA.
  • Supports CRUD, Pagination, Sorting, and Custom Queries.
  • Makes applications more testable and maintainable.
  • Widely used in Banking, Insurance, Retail, and Healthcare systems.
  • Foundation of modern Spring Boot enterprise applications.