Spring Data JPA kirish

01.07.2026 | Muallif: Jaxongir a.k.a | Kategoriya: Spring Boot | 21 daqiqa o'qish

Bu bo‘limda Spring Boot’da database bilan ishlashni boshlaymiz. Bu mavzu ichida @Entity, @Id, @GeneratedValue, JpaRepository, H2 in-memory database, spring.datasource configuration, @Column, @Table bor.


1. Spring Data JPA nima?

Spring Data JPA - database bilan ishlashni osonlashtiradigan Spring moduli.

Oddiy Java’da database bilan ishlash uchun ko‘p kod yoziladi:

Connection connection = DriverManager.getConnection(...);
PreparedStatement statement = connection.prepareStatement(...);
ResultSet resultSet = statement.executeQuery();

Spring Data JPA’da esa ko‘pincha bunday yozamiz:

userRepository.findAll();
userRepository.findById(1L);
userRepository.save(user);
userRepository.deleteById(1L);

Ya’ni:

Spring Data JPA database bilan CRUD qilishni juda osonlashtiradi.


2. JPA nima?

JPA - Java Persistence API.

Oddiy tushuncha:

JPA - Java objectlarni database table bilan bog‘lash standarti.

Masalan, Java’da User class bor:

public class User {
    private Long id;
    private String name;
    private String email;
}

Database’da esa users table bor:

CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255)
);

JPA shu Java class bilan database table o‘rtasida mapping qiladi.


3. ORM nima?

ORM - Object Relational Mapping.

Ya’ni:

Java object  ↔  Database table
Class        ↔  Table
Field        ↔  Column
Object       ↔  Row

Misol:

Java

Database

User class

users table

id field

id column

name field

name column

new User(...) object

bitta row

Spring Boot’da JPA uchun odatda Hibernate ishlatiladi.


4. Spring Data JPA nima qiladi?

Spring Data JPA quyidagi ishlarni osonlashtiradi:

Ma’lumot saqlash
Ma’lumot olish
Ma’lumot yangilash
Ma’lumot o‘chirish
ID orqali qidirish
Pagination
Sorting
Custom query yozish

Boshlang'ich bosqichda eng muhimi - CRUD.


5. Kerakli dependency

Spring Initializr’da quyidagilarni tanlaymiz:

Spring Web
Spring Data JPA
H2 Database
Lombok

Maven’da shunday bo‘ladi:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

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

6. H2 Database nima?

H2 - yengil, in-memory database.

In-memory degani:

Database RAM ichida ishlaydi. App o‘chsa, data ham o‘chishi mumkin.

H2 boshlang'ich uchun juda qulay, chunki PostgreSQL yoki MySQL o‘rnatmasdan JPA’ni o‘rganish mumkin.

Real production’da esa odatda:

PostgreSQL
MySQL
Oracle
MS SQL Server

ishlatiladi.


7. application.properties sozlamasi

H2 bilan ishlash uchun:

spring.application.name=jpa-demo

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Bu yerda:

Config

Ma’nosi

spring.datasource.url

Database manzili

spring.datasource.username

DB username

spring.datasource.password

DB password

spring.h2.console.enabled

Browserdan H2 console ochish

spring.jpa.hibernate.ddl-auto

Table yaratish/update qilish

spring.jpa.show-sql

SQL querylarni logda ko‘rsatish


8. H2 console’ga kirish

App ishga tushgandan keyin browserda:

http://localhost:8080/h2-console

Kirishda:

JDBC URL: jdbc:h2:mem:testdb
User Name: sa
Password: bo‘sh

Shu yerda table va datalarni ko‘rish mumkin.


9. @Entity nima?

@Entity - class database table bilan bog‘lanishini bildiradi.

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id
    private Long id;

    private String name;
    private String email;
}

Bu degani:

User class database’da table sifatida ishlatiladi.


10. @Id nima?

@Id - primary key fieldni bildiradi.

Database’da har bir row’ni ajratib turadigan unique qiymat kerak.

@Id
private Long id;

Masalan:

id

name

email

1

Ali

ali@mail.com

2

Vali

vali@mail.com

Bu yerda id - primary key.


11. @GeneratedValue nima?

@GeneratedValue - ID avtomatik yaratilishini bildiradi.

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

Endi user yaratganda idni o‘zimiz bermaymiz. Database o‘zi beradi.


12. To‘liq Entity misol

package uz.jts.demo.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {

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

    private String name;
    private String email;

    public User() {
    }

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Muhim:

JPA entity’da no-args constructor bo‘lishi kerak.

Ya’ni:

public User() {
}

13. Lombok bilan Entity

Lombok ishlatsak kod qisqaradi:

package uz.jts.demo.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@Entity
public class User {

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

    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

Lekin boshlang'ich bosqichda avval oddiy getter/setter bilan tushungan yaxshi.


14. @Table nima?

@Table - database table nomini aniq berish uchun ishlatiladi.

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

Agar @Table yozilmasa, table nomi odatda class nomidan olinadi.

Yaxshi amaliyot:

@Table(name = "users")

Nega users? Chunki user ba’zi database’larda reserved keyword bo‘lishi mumkin.


15. @Column nima?

@Column - field qaysi column bilan bog‘lanishini va uning qoidalarini belgilaydi.

@Column(name = "email", nullable = false, unique = true)
private String email;

Bu degani:

Column nomi: email
Null bo‘lishi mumkin emas
Unique bo‘lishi kerak

To‘liqroq misol:

@Column(name = "full_name", nullable = false, length = 100)
private String name;

16. Entity yaxshi yozilishi

package uz.jts.demo.entity;

import jakarta.persistence.*;

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

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

    @Column(name = "full_name", nullable = false, length = 100)
    private String name;

    @Column(name = "email", nullable = false, unique = true)
    private String email;

    public User() {
    }

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // getter/setter
}

17. JpaRepository nima?

JpaRepository - tayyor CRUD methodlar beradigan interface.

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

Bu yerda:

User - qaysi entity bilan ishlaydi
Long - User ID tipi

Shu bitta interface orqali ko‘p methodlar tayyor bo‘ladi.


18. JpaRepository tayyor methodlari

Method

Vazifasi

findAll()

Barcha datani olish

findById(id)

ID orqali olish

save(entity)

Saqlash yoki update qilish

deleteById(id)

ID orqali o‘chirish

existsById(id)

Bor-yo‘qligini tekshirish

count()

Row sonini olish

Misol:

List<User> users = userRepository.findAll();

Optional<User> user = userRepository.findById(1L);

User savedUser = userRepository.save(user);

userRepository.deleteById(1L);

19. Repository yozish

package uz.jts.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import uz.jts.demo.entity.User;

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

Bu interface’ga @Repository yozish shart emas. Spring Data JPA o‘zi bean qiladi.


20. DTO nima uchun kerak?

Entity’ni to‘g‘ridan-to‘g‘ri API’da ishlatish boshlang'ich uchun mumkin, lekin professional loyihada DTO ishlatiladi.

Sababi:

Entity database modeli
DTO API request/response modeli

Yaxshi structure:

UserEntity       → database uchun
CreateUserRequest → POST body uchun
UserResponse     → clientga javob uchun

21. Request DTO

package uz.jts.demo.dto;

public record CreateUserRequest(
        String name,
        String email
) {
}

22. Response DTO

package uz.jts.demo.dto;

public record UserResponse(
        Long id,
        String name,
        String email
) {
}

23. Service yozish

package uz.jts.demo.service;

import org.springframework.stereotype.Service;
import uz.jts.demo.dto.CreateUserRequest;
import uz.jts.demo.dto.UserResponse;
import uz.jts.demo.entity.User;
import uz.jts.demo.repository.UserRepository;

import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public UserResponse createUser(CreateUserRequest request) {
        User user = new User(request.name(), request.email());

        User savedUser = userRepository.save(user);

        return new UserResponse(
                savedUser.getId(),
                savedUser.getName(),
                savedUser.getEmail()
        );
    }

    public List<UserResponse> getUsers() {
        return userRepository.findAll()
                .stream()
                .map(user -> new UserResponse(
                        user.getId(),
                        user.getName(),
                        user.getEmail()
                ))
                .toList();
    }
}

Bu yerda:

request → entity
entity database’ga saqlanadi
saved entity → response

24. Controller yozish

package uz.jts.demo.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import uz.jts.demo.dto.CreateUserRequest;
import uz.jts.demo.dto.UserResponse;
import uz.jts.demo.service.UserService;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public ResponseEntity<UserResponse> createUser(
            @RequestBody CreateUserRequest request
    ) {
        UserResponse response = userService.createUser(request);

        return ResponseEntity
                .status(HttpStatus.CREATED)
                .body(response);
    }

    @GetMapping
    public List<UserResponse> getUsers() {
        return userService.getUsers();
    }
}

25. Test qilish

POST user yaratish

POST http://localhost:8080/users
Content-Type: application/json

Body:

{
  "name": "Ali",
  "email": "ali@mail.com"
}

Response:

{
  "id": 1,
  "name": "Ali",
  "email": "ali@mail.com"
}

GET users

GET http://localhost:8080/users

Response:

[
  {
    "id": 1,
    "name": "Ali",
    "email": "ali@mail.com"
  }
]

26. findById bilan bitta user olish

Service:

public UserResponse getUserById(Long id) {
    User user = userRepository.findById(id)
            .orElseThrow(() -> new RuntimeException("User topilmadi"));

    return new UserResponse(
            user.getId(),
            user.getName(),
            user.getEmail()
    );
}

Controller:

@GetMapping("/{id}")
public UserResponse getUserById(@PathVariable Long id) {
    return userService.getUserById(id);
}

Request:

GET /users/1

27. save() update ham qila oladi

save() ikki xil ishlaydi:

Holat

Natija

id == null

Yangi row yaratadi

id mavjud

Existing row update qiladi

Update service:

public UserResponse updateUser(Long id, CreateUserRequest request) {
    User user = userRepository.findById(id)
            .orElseThrow(() -> new RuntimeException("User topilmadi"));

    user.setName(request.name());
    user.setEmail(request.email());

    User updatedUser = userRepository.save(user);

    return new UserResponse(
            updatedUser.getId(),
            updatedUser.getName(),
            updatedUser.getEmail()
    );
}

Controller:

@PutMapping("/{id}")
public UserResponse updateUser(
        @PathVariable Long id,
        @RequestBody CreateUserRequest request
) {
    return userService.updateUser(id, request);
}

28. Delete qilish

Service:

public void deleteUser(Long id) {
    if (!userRepository.existsById(id)) {
        throw new RuntimeException("User topilmadi");
    }

    userRepository.deleteById(id);
}

Controller:

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    userService.deleteUser(id);
    return ResponseEntity.noContent().build();
}

Response:

204 No Content

29. To‘liq CRUD API

Endpointlar:

POST   /users
GET    /users
GET    /users/{id}
PUT    /users/{id}
DELETE /users/{id}

Layerlar:

UserController → UserService → UserRepository → H2 Database

Bu boshlang'ich bosqich uchun juda yaxshi birinchi real backend API.


30. Package structure

Tavsiya qilinadigan structure:

uz.jts.demo
 ├── DemoApplication.java
 ├── controller
 │   └── UserController.java
 ├── service
 │   └── UserService.java
 ├── repository
 │   └── UserRepository.java
 ├── entity
 │   └── User.java
 └── dto
     ├── CreateUserRequest.java
     └── UserResponse.java

31. ddl-auto nima?

spring.jpa.hibernate.ddl-auto=update

Bu Hibernate table’larni qanday boshqarishini bildiradi.

Eng ko‘p uchraydigan qiymatlar:

Qiymat

Ma’nosi

none

Hech narsa qilmaydi

validate

Entity va table mosligini tekshiradi

update

Table’ni entity bo‘yicha update qiladi

create

Har startda qayta yaratadi

create-drop

Startda yaratadi, stopda o‘chiradi

boshlang'ich bosqich uchun H2'da:

spring.jpa.hibernate.ddl-auto=update

yoki:

spring.jpa.hibernate.ddl-auto=create-drop

Production’da ehtiyot bo‘lish kerak. Real loyihada Flyway yoki Liquibase ishlatiladi.


32. show-sql nima?

spring.jpa.show-sql=true

Bu Hibernate ishlatayotgan SQL querylarni console’da ko‘rsatadi.

Masalan:

insert into users (email, full_name, id) values (?, ?, default)
select u1_0.id, u1_0.email, u1_0.full_name from users u1_0

boshlang'ich bosqich uchun foydali, chunki JPA orqada qanday SQL ishlatayotganini ko‘rasan.


33. Derived query methods

Spring Data JPA method nomidan query yasay oladi.

Repository:

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);

    List<User> findByName(String name);

    boolean existsByEmail(String email);
}

Bu methodlar uchun SQL yozmaymiz. Spring nomidan tushunadi.

Misollar:

Method

Ma’nosi

findByEmail

email orqali qidirish

findByName

name orqali qidirish

existsByEmail

email bor-yo‘qligini tekshirish

deleteByEmail

email orqali o‘chirish


34. Email unique tekshirish

Service’da:

public UserResponse createUser(CreateUserRequest request) {
    if (userRepository.existsByEmail(request.email())) {
        throw new RuntimeException("Bu email allaqachon mavjud");
    }

    User user = new User(request.name(), request.email());
    User savedUser = userRepository.save(user);

    return new UserResponse(
            savedUser.getId(),
            savedUser.getName(),
            savedUser.getEmail()
    );
}

Repository:

public interface UserRepository extends JpaRepository<User, Long> {

    boolean existsByEmail(String email);
}

35. Eng ko‘p uchraydigan xatolar

1. @Entity unutish

Xato:

public class User {
}

To‘g‘ri:

@Entity
public class User {
}

2. @Id unutish

Xato:

@Entity
public class User {
    private Long id;
}

To‘g‘ri:

@Entity
public class User {
    @Id
    private Long id;
}

3. No-args constructor yo‘q

Xato:

@Entity
public class User {

    public User(String name) {
        this.name = name;
    }
}

To‘g‘ri:

public User() {
}

4. Repository generics noto‘g‘ri

Xato:

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

Agar entity’da ID Long bo‘lsa, to‘g‘ri:

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

5. Entity’ni API’da to‘g‘ridan-to‘g‘ri qaytarish

boshlang'ich bosqich uchun ishlaydi, lekin production’da tavsiya qilinmaydi.

Yaxshiroq:

Entity → Response DTO
Request DTO → Entity

36. Interview uchun javoblar

Savol: Spring Data JPA nima?

Spring Data JPA - JPA asosida database bilan ishlashni osonlashtiradigan Spring moduli. U repository interface orqali CRUD methodlarni tayyor beradi.

Savol: @Entity nima?

@Entity class database table bilan mapping qilinishini bildiradi.

Savol: @Id nima?

@Id entity’dagi primary key fieldni bildiradi.

Savol: @GeneratedValue nima?

@GeneratedValue ID avtomatik generatsiya qilinishini bildiradi.

Savol: JpaRepository<User, Long> nimani bildiradi?

Bu repository User entity bilan ishlaydi va uning ID tipi Long ekanini bildiradi.

Savol: save() nima qiladi?

save() entity’ni database’ga saqlaydi. Agar ID yangi bo‘lsa insert qiladi, mavjud entity bo‘lsa update qiladi.


37. Java developer uchun xulosa

Bugungi mavzudan eslab qol:

Spring Data JPA - database bilan ishlashni osonlashtiradi
JPA - Java object va database table orasidagi mapping standarti
Hibernate - JPA implementation
@Entity - classni table qiladi
@Id - primary key
@GeneratedValue - ID avtomatik yaratiladi
@Table - table nomini sozlaydi
@Column - column qoidalarini sozlaydi
JpaRepository - tayyor CRUD methodlar beradi
H2 - boshlang'ich bosqich uchun yengil test database
DTO - API request/response modeli

38. Amaliy vazifa

Product CRUD API yoz:

Entity

Product
- id
- name
- price

Endpointlar

POST   /products
GET    /products
GET    /products/{id}
PUT    /products/{id}
DELETE /products/{id}

Package structure

controller
service
repository
entity
dto

Qo‘shimcha

Repository’da method yoz:

boolean existsByName(String name);

Product yaratishda nomi oldin mavjud bo‘lsa, xato qaytar.