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 ↔ RowMisol:
Java | Database |
|---|---|
|
|
|
|
|
|
| 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 yozishBoshlang'ich bosqichda eng muhimi - CRUD.
5. Kerakli dependency
Spring Initializr’da quyidagilarni tanlaymiz:
Spring Web
Spring Data JPA
H2 Database
LombokMaven’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 Serverishlatiladi.
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=trueBu yerda:
Config | Ma’nosi |
|---|---|
| Database manzili |
| DB username |
| DB password |
| Browserdan H2 console ochish |
| Table yaratish/update qilish |
| SQL querylarni logda ko‘rsatish |
8. H2 console’ga kirish
App ishga tushgandan keyin browserda:
http://localhost:8080/h2-consoleKirishda:
JDBC URL: jdbc:h2:mem:testdb
User Name: sa
Password: bo‘shShu 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:
Userclass 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 | |
|---|---|---|
1 | Ali | |
2 | Vali |
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 kerakTo‘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 tipiShu bitta interface orqali ko‘p methodlar tayyor bo‘ladi.
18. JpaRepository tayyor methodlari
Method | Vazifasi |
|---|---|
| Barcha datani olish |
| ID orqali olish |
| Saqlash yoki update qilish |
| ID orqali o‘chirish |
| Bor-yo‘qligini tekshirish |
| 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 modeliYaxshi structure:
UserEntity → database uchun
CreateUserRequest → POST body uchun
UserResponse → clientga javob uchun21. 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 → response24. 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/jsonBody:
{
"name": "Ali",
"email": "ali@mail.com"
}Response:
{
"id": 1,
"name": "Ali",
"email": "ali@mail.com"
}GET users
GET http://localhost:8080/usersResponse:
[
{
"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/127. save() update ham qila oladi
save() ikki xil ishlaydi:
Holat | Natija |
|---|---|
| Yangi row yaratadi |
| 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 Content29. To‘liq CRUD API
Endpointlar:
POST /users
GET /users
GET /users/{id}
PUT /users/{id}
DELETE /users/{id}Layerlar:
UserController → UserService → UserRepository → H2 DatabaseBu 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.java31. ddl-auto nima?
spring.jpa.hibernate.ddl-auto=updateBu Hibernate table’larni qanday boshqarishini bildiradi.
Eng ko‘p uchraydigan qiymatlar:
Qiymat | Ma’nosi |
|---|---|
| Hech narsa qilmaydi |
| Entity va table mosligini tekshiradi |
| Table’ni entity bo‘yicha update qiladi |
| Har startda qayta yaratadi |
| Startda yaratadi, stopda o‘chiradi |
boshlang'ich bosqich uchun H2'da:
spring.jpa.hibernate.ddl-auto=updateyoki:
spring.jpa.hibernate.ddl-auto=create-dropProduction’da ehtiyot bo‘lish kerak. Real loyihada Flyway yoki Liquibase ishlatiladi.
32. show-sql nima?
spring.jpa.show-sql=trueBu 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_0boshlang'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 |
|---|---|
| email orqali qidirish |
| name orqali qidirish |
| email bor-yo‘qligini tekshirish |
| 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 → Entity36. 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?
@Entityclass database table bilan mapping qilinishini bildiradi.
Savol: @Id nima?
@Identity’dagi primary key fieldni bildiradi.
Savol: @GeneratedValue nima?
@GeneratedValueID avtomatik generatsiya qilinishini bildiradi.
Savol: JpaRepository<User, Long> nimani bildiradi?
Bu repository
Userentity bilan ishlaydi va uning ID tipiLongekanini 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 modeli38. Amaliy vazifa
Product CRUD API yoz:
Entity
Product
- id
- name
- priceEndpointlar
POST /products
GET /products
GET /products/{id}
PUT /products/{id}
DELETE /products/{id}Package structure
controller
service
repository
entity
dtoQo‘shimcha
Repository’da method yoz:
boolean existsByName(String name);Product yaratishda nomi oldin mavjud bo‘lsa, xato qaytar.