Spring Boot

Spring Boot Dersleri Pagination Uygulama İşlemleri

Spring Boot Dersleri‘ne devam ediyorum.

Bu yazıda Spring Boot projemizde rest api servisimizdeki pagination yani verileri clienta gönderirken sayfalama işlemini örnek bir uygulama örneği yaparak anlamaya çalışacağız.

Yapacağım örnekte iller ve nüfüsların bulunduğu bir veritabanımız olacak ve bu kayıtlar içerisinden sayfalama işlemlerinin kullanacağımız Spring Boot projesi yapacağız.

Maven bağımlılığımız aşağıdaki gibidir. Bu bağımlılığımızda veritabanı olarakda H2 gömülü veritabanı kullanacağım.

<dependency>
 <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>

İller ve nüfüs bilgilerinin olduğu ve veritabanı ayağa kalktığında bu sabir verilerin yüklenebilmesi için resources klasörünün altında import.sql dosyası oluşturup verimizi Sql cümlecikleri ile ekleyelim.

INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (1, 'Adana', 2201670);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (2, 'Adıyaman', 610484);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (3, 'Afyonkarahisar', 714523);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (4, 'Ağrı', 542255);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (5, 'Amasya', 326351);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (6, 'Ankara', 5346518);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (7, 'Antalya', 2328555);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (8, 'Artvin', 168068);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (9, 'Aydın', 1068260);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (10,'Balıkesir', 1196176);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (11,'Bilecik', 218297);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (12,'Bingöl', 269560);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (13,'Bitlis', 341225);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (14,'Bolu', 299896);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (15,'Burdur', 261401);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (16,'Bursa', 2901396);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (17,'Çanakkale', 519793);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (18,'Çankırı', 183880);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (19,'Çorum', 527863);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (20,'Denizli', 1005687);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (21,'Diyarbakır', 1673119);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (22,'Edirne', 401701);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (23,'Elazığ', 578789);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (24,'Erzincan', 226032);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (25,'Erzurum', 762021);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (26,'Eskişehir', 844842);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (27,'Gaziantep', 1974244);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (28,'Giresun', 444467);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (29,'Gümüşhane', 172034);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (30,'Hakkari', 267813);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (31,'Hatay', 1555165);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (32,'Isparta', 427324);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (33,'Mersin', 1773852);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (34,'İstanbul', 14804116);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (35,'İzmir', 4223545);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (36,'Kars', 289786);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (37,'Kastamonu', 376945);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (38,'Kayseri', 1358980);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (39,'Kırklareli', 351684);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (40,'Kırşehir', 229975);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (41,'Kocaeli', 1830772);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (42,'Konya', 2161303);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (43,'Kütahya', 573642);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (44,'Malatya', 781305);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (45,'Manisa', 1396945);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (46,'Kahramanmaraş', 1112634);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (47,'Mardin', 796237);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (48,'Muğla', 923773);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (49,'Muş', 406501);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (50,'Nevşehir', 290895);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (51,'Niğde', 351468);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (52,'Ordu', 750588);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (53,'Rize', 331048);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (54,'Sakarya', 976948);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (55,'Samsun', 1295927);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (56,'Siirt', 322664);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (57,'Sinop', 205478);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (58,'Sivas', 621224);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (59,'Tekirdağ', 972875);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (60,'Tokat', 602662);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (61,'Trabzon', 779379);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (62,'Tunceli', 82193);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (63,'Şanlıurfa', 1940627);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (64,'Uşak', 358736);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (65,'Van', 1100190);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (66,'Yozgat', 421041);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (67,'Zonguldak', 597524);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (68,'Aksaray', 396673);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (69,'Bayburt', 90154);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (70,'Karaman', 245610);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (71,'Kırıkkale', 277984);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (72,'Batman', 576899);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (73,'Şırnak', 483788);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (74,'Bartın', 192389);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (75,'Ardahan', 98335);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (76,'Iğdır', 192785);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (77,'Yalova', 241665);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (78,'Karabük', 242347);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (79,'Kilis', 130825);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (80,'Osmaniye', 522175);
INSERT Sehirler (Plaka,  Ad, Nufus) VALUES (81,'Düzce', 370371);

Verilerimizin entity sınıfını oluşturalım.

@Entity
@Table
public class Sehirler {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private int plaka;
    private String ad;
    private int nufus;

    public Sehirler() {
    }

    public Sehirler(Long id, int plaka, String ad, int nufus) {
        this.id = id;
        this.plaka = plaka;
        this.ad = ad;
        this.nufus = nufus;
    }

    public Long getId() {
        return id;
    }

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

    public int getPlaka() {
        return plaka;
    }

    public void setPlaka(int plaka) {
        this.plaka = plaka;
    }

    public String getAd() {
        return ad;
    }

    public void setAd(String ad) {
        this.ad = ad;
    }

    public int getNufus() {
        return nufus;
    }

    public void setNufus(int nufus) {
        this.nufus = nufus;
    }
}

Repositorymizi oluşturalım bu sınıfımızda PagingAndSortingRepository extend ederek verilerin pagination işlemi için kullanılabilecek bir yapıda olduğunu söylemiş oluyoruz.

@Repository
public interface  SehirlerRepository extends PagingAndSortingRepository<Sehirler, Long> {

}

Verileri getirecek servis katmanımızın arayüz interface kısmını oluşturalım. Bu interface’de veritabanımıza ulaşacak olan metot tanımlamalarımızı yapıyoruz.

public interface ISehirlerService {
    List<Sehirler> getSehirlerList(int no, int size);
}

Bu metotta no ve size parametrelerini alıyoruz.

  • no değeri sayfa sayısı,
  • size ise o sayfada bulunan kayıt sayısını ifade etmektedir.

Servis katmanımızı oluşturalım ve arayüzümü de bu sınıfa implement edeceğiz.

@Service
public class SehirlerService implements ISehirlerService{
    
    @Autowired
    private SehirlerRepository sehirlerRepository;

    @Override
    public List<Sehirler> getSehirlerList(int no, int size) {
        Pageable pageable = PageRequest.of(no, size);
        Page<Sehirler> sehirlerPage = sehirlerRepository.findAll(pageable);

        return sehirlerPage.toList();
    }
}

Bu sınıf içerisindeki metodumuzda gelecek verinin hangi sayfa sayısından kaç adet veri geleceğini yani pagination işleminin yapıldığı yer. Hangi sayfadan kaç adet veri geleceğini tabiki biz rest api endpointimizden göndereceğiz.

Bunun için Pageable sınıfının içerisinden PageRequest isteği oluşturuyoruz ve ardından bu pagination istediğini data jpa tarafından desteklenen repositorymizdeki findAll metdouna gönderiyoruz.

Bu metod bizim isteğimizi yerine getirirken pagination isteğimizi de ekleyerek ona göre bize verileri getiriyor.

Controllerimizi bu contorllerimiz rest controller olacak. Bu sınıfta ise restfull endpointimizi oluşturalım.

@RestController
public class SehirlerController {

    @Autowired
    private ISehirlerService iSehirlerService;

    @GetMapping("/sehir/{no}/{size}")
    public List<Sehirler> getSehirler(@PathVariable int no,
                                      @PathVariable int size) {

        return iSehirlerService.getSehirlerList(no, size);
    }
}

Ve şimdi Postman’den test edelim.

`localhost:8080/sehir/10/4` isteği gönderdiğimizde gelen cevap aşağıdaki gibi olacaktır.

[
    {
        "id": 41,
        "plaka": 41,
        "ad": "Kocaeli",
        "nufus": 1830772
    },
    {
        "id": 42,
        "plaka": 42,
        "ad": "Konya",
        "nufus": 2161303
    },
    {
        "id": 43,
        "plaka": 43,
        "ad": "Kütahya",
        "nufus": 573642
    },
    {
        "id": 44,
        "plaka": 44,
        "ad": "Malatya",
        "nufus": 781305
    }
]

Projenin Kaynak Kodlarına Ulaş
Önceki Ders: Spring Logging Uygulama Örneği
Spring Boot Dersleri
Sonraki Ders: Github kullanarak Heroku’ya Deploy Etmek

More in:Spring Boot

You may also like

Leave a reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir