Spring JDBC ile İlişkisel Veriler

Herkese selamlar. Bugün ki yazımızda Spring JDBC kullanarak ilişkisel verilere erişmeyi öğreneceğiz. Spring’in JdbcTemplate bean‘ini kullanarak ilişkisel veri tabanlarına (Relational Database) kayıt edilmiş olan ilişkisel verilere erişen bir uygulama geliştireceğiz.

 

Spring JDBC – Bağımlılıklar

Şimdi dilerseniz Spring Initialzr kullanarak ya da IntelliJ IDEA ya da Eclipse STS ile proje oluşturun. İhtiyacımız olan iki adet bağımlılık var bunlar sırasıyla; Spring JDBC ve H2 Database. Bu iki bağımlılığımızı ekledikten sonra pom.xml dosyamız aşağıdaki gibi olmalı.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/>
    </parent>
    <groupId>com.codingbytime</groupId>
    <artifactId>relationaldata</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>relationaldata</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

Buraya kadar geldiysek süperiz. Şimdi ilişkisel bir veritabanı tasarladığımızı düşünelim. Bir müşteri sınıfımız olsun ve id, isim ve soyisim olmak üzere 3 adet sütun barındırsın. Şimdi bunu oluşturacağımız java sınıfımızı yaratalım. Getter, Setter, Constructor ve ToString metodlarını oluşturmayı da unutmayalım.

package com.codingbytime.relationaldata;


public class Customer {
    private String firstName;
    private String lastName;

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public Customer() {
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

 

H2 veritabanımıza veri kaydetme ve devamında bu verileri kullanabilmek amacıyla CommandLineRunner interface’ini implement eden bir DataLoader sınıfı oluşturalım. Buralar biraz karışacak o nedenle vaziyet alınız. Burada yapılan işlemler için minimum 1.8 JDK‘ ya ihtiyacınız var. Burada yaptıklarımızı özetleyecek olursak:

Çıktılarımız için logger kullandık. JdbsTemplate’imizi @Autowired ile Application Context’imizden çektik ve burada bir kullanmak amacıyla bean’imizi değişkenimize atadık.

Execute ile tablo yapımızı oluşturduk. Tablo ismimiz ise Customer.

İçerisinde ad ve soyad değerlerini array olarak tutan bir List’imiz var. Buna ise 3 adet müşteri verdim. İlk isim ise Spring’in kurucusu olan Rod Johnson.

Daha sonra bu isimleri log olarak yazdırdık ve veritabanımıza 3 defa git-gel olmaması amacıyla batch olarak bu verileri gönderdik.

 

 

package com.codingbytime.relationaldata;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class DataLoader implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DataLoader.class);
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public DataLoader(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void run(String... args){
        log.info("creating customer table");
        jdbcTemplate.execute("CREATE TABLE Customer(firstname VARCHAR(55), lastname VARCHAR(55))");


        List<Object[]> customerInfo = Arrays.asList("Rod Johnson", "John Doe", "John Wick")
                .stream()
                .map(name -> name.split(" "))
                .collect(Collectors.toList());

        customerInfo.forEach(name -> {
            log.info(String.format("müsteri kaydediliyor: %s %s", name[0], name[1]));
        });

        jdbcTemplate.batchUpdate("INSERT INTO Customer(firstname, lastname) VALUES (?,?)", customerInfo);

        jdbcTemplate
                .query(
                        "SELECT firstname, lastname FROM Customer WHERE firstname = ?", new Object[]{"John"},
                        (rs, rowNum) -> new Customer(rs.getString("firstname"), rs.getString("lastname"))
                )
                .forEach(customer -> log.info(customer.toString()));
    }
}

 

Projemizi Çalıştıralım

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.0)

2020-11-26 16:06:28.529 INFO 11576 --- [ main] c.c.relationaldata.JdbcApplication : Starting JdbcApplication using Java 1.8.0_265
2020-11-26 16:06:28.536 INFO 11576 --- [ main] c.c.relationaldata.JdbcApplication : No active profile set, falling back to default profiles: default
2020-11-26 16:06:29.141 INFO 11576 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
2020-11-26 16:06:29.156 INFO 11576 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7 ms. Found 0 JDBC repository interfaces.
2020-11-26 16:06:29.748 INFO 11576 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-11-26 16:06:29.916 INFO 11576 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-11-26 16:06:30.050 INFO 11576 --- [ main] c.c.relationaldata.JdbcApplication : Started JdbcApplication in 2.274 seconds (JVM running for 3.547)
2020-11-26 16:06:30.054 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : creating customer table
2020-11-26 16:06:30.065 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : müsteri kaydediliyor: Rod Johnson
2020-11-26 16:06:30.066 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : müsteri kaydediliyor: John Doe
2020-11-26 16:06:30.066 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : müsteri kaydediliyor: John Wick
2020-11-26 16:06:30.108 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : Customer{firstName='John', lastName='Doe'}
2020-11-26 16:06:30.108 INFO 11576 --- [ main] c.c.relationaldata.DataLoader : Customer{firstName='John', lastName='Wick'}
2020-11-26 16:06:30.114 INFO 11576 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-11-26 16:06:30.116 INFO 11576 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

Process finished with exit code 0

More Reading

Post navigation