Spring Data JPA bilen birine Spring JDBC Template öğretmeni istiyorum.Interview soruları ve cevapları.





Elbette, Spring JDBC Template'le çalışma konusunda yardımcı olmaktan memnuniyet duyarım! Spring Data JPA bilgisi olan biri için, bazı temel farklılıkları anlamak önemli olacaktır, ancak çok fazla yeni şey öğrenmeniz gerekmez.


Spring JDBC Template, Java'nın Spring Framework'ünde veritabanı erişimi için kullanılan bir teknolojidir. Spring Data JPA ile karşılaştırıldığında, daha düşük seviyeli ve daha fazla kontrol sunar, ancak aynı zamanda daha çok kod yazmanızı gerektirir.


1. Bağlantı Ayarları

Öncelikle, veritabanına bağlanmak için gerekli olan DataSource'un nasıl yapılandırılacağına bakalım. application.properties dosyanızda, aşağıdaki gibi bir yapılandırma olabilir:


properties

Copy code

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2. JDBC Template Bean'ini Yapılandırma

Daha sonra, JdbcTemplate bean'ini Spring uygulamanızda yapılandırmanız gerekir. Bunu aşağıdaki gibi bir yapılandırma sınıfında yapabilirsiniz:


java

Copy code

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;


@Configuration

public class JdbcConfig {

    @Bean

    public JdbcTemplate jdbcTemplate(DataSource dataSource) {

        return new JdbcTemplate(dataSource);

    }

}

3. Veritabanı İşlemleri

Şimdi, bir veritabanı işlemi yapmak için bir örnek görelim. Öncelikle bir servis sınıfı oluşturacağız:


java

Copy code

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Service;


@Service

public class EmployeeService {

    private final JdbcTemplate jdbcTemplate;


    public EmployeeService(JdbcTemplate jdbcTemplate) {

        this.jdbcTemplate = jdbcTemplate;

    }


    public int getEmployeeCount() {

        String sql = "SELECT COUNT(*) FROM employees";

        return jdbcTemplate.queryForObject(sql, Integer.class);

    }

}

Bu, employees tablosundaki çalışan sayısını döndürür.



4. Sorgular ve Nesne Dönüşümü

Bir sonraki adımda, veritabanından veri almak ve bu verileri nesnelere dönüştürmekle ilgili bir örnek görelim. Öncelikle basit bir Employee sınıfı oluşturalım:


java

Copy code

public class Employee {

    private Long id;

    private String name;

    private String position;


    // Getters and setters

}

Daha sonra, bu çalışanları veritabanından almak için bir sorgu yazabiliriz:


java

Copy code

import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;


@Service

public class EmployeeService {

    // ...


    public List<Employee> getAllEmployees() {

        String sql = "SELECT * FROM employees";

        return jdbcTemplate.query(sql, new EmployeeRowMapper());

    }


    private static class EmployeeRowMapper implements RowMapper<Employee> {

        @Override

        public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {

            Employee employee = new Employee();

            employee.setId(rs.getLong("id"));

            employee.setName(rs.getString("name"));

            employee.setPosition(rs.getString("position"));

            return employee;

        }

    }

}

Burada, RowMapper arayüzünü kullanarak her satırın nasıl bir Employee nesnesine dönüştürüleceğini belirttik.


5. Ekleme, Güncelleme ve Silme İşlemleri

Şimdi, bir çalışan eklemek, güncellemek veya silmek gibi değiştirme işlemlerine bakalım.


Ekleme

java

Copy code

public void addEmployee(Employee employee) {

    String sql = "INSERT INTO employees (name, position) VALUES (?, ?)";

    jdbcTemplate.update(sql, employee.getName(), employee.getPosition());

}

Güncelleme

java

Copy code

public void updateEmployee(Employee employee) {

    String sql = "UPDATE employees SET name = ?, position = ? WHERE id = ?";

    jdbcTemplate.update(sql, employee.getName(), employee.getPosition(), employee.getId());

}

Silme

java

Copy code

public void deleteEmployee(Long id) {

    String sql = "DELETE FROM employees WHERE id = ?";

    jdbcTemplate.update(sql, id);

}

Bu, Spring JDBC Template ile temel CRUD işlemlerini gerçekleştirmeniz için gereken bilgileri içerir. Daha karmaşık işlemler, işlem yönetimi, adımlı sorgular gibi konulara mı geçmek istersiniz, yoksa belirli bir şey üzerinde mi durmak istersiniz?


6. İşlem Yönetimi

Bazen, birkaç veritabanı işlemini bir arada gruplamak ve hepsinin başarılı olmasını sağlamak isteyebilirsiniz. Bunu Spring'in işlem yönetimi desteğiyle yapabilirsiniz.


java

Copy code

import org.springframework.transaction.annotation.Transactional;


@Service

public class EmployeeService {

    // ...


    @Transactional

    public void addEmployeeWithAddress(Employee employee, Address address) {

        addEmployee(employee);

        addressService.addAddress(address);

        // Both methods need to be successful

    }

}

@Transactional annotasyonu, bu yöntemin bir işlemde çalıştırılmasını sağlar. Herhangi bir şey başarısız olursa, tüm işlem geri alınır.


7. Adımlı Sorgular (Named Queries)

Adımlı sorgular, sorgu dizesinde parametre adları kullanmanıza olanak tanır. Bu, kodun okunabilirliğini artırabilir.


java

Copy code

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;


@Service

public class EmployeeService {

    private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;


    public EmployeeService(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {

        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;

    }


    public Employee getEmployeeByName(String name) {

        String sql = "SELECT * FROM employees WHERE name = :name";

        MapSqlParameterSource params = new MapSqlParameterSource();

        params.addValue("name", name);

        return namedParameterJdbcTemplate.queryForObject(sql, params, new EmployeeRowMapper());

    }

}

8. Batch İşlemleri

Büyük miktarda veri ile çalışırken, batch işlemleri performansı artırabilir.


java

Copy code

public void addEmployees(List<Employee> employees) {

    String sql = "INSERT INTO employees (name, position) VALUES (?, ?)";

    List<Object[]> args = new ArrayList<>();

    for (Employee employee : employees) {

        args.add(new Object[]{employee.getName(), employee.getPosition()});

    }

    jdbcTemplate.batchUpdate(sql, args);

}

Bu, bir seferde birçok çalışan eklemenize olanak tanır, veritabanına yapılan yükü azaltır.


Sonuç

Bu, Spring JDBC Template kullanarak veritabanı işlemleri gerçekleştirmenin temel yönlerini kapsar. Spring Data JPA'nın aksine, JDBC Template daha düşük seviyeli bir yaklaşım sunar ve daha fazla kontrol sağlar, ancak aynı zamanda daha fazla manuel kod yazmanızı gerektirir.


Elbette, devam edelim! Şimdi, Spring JDBC Template ile daha ileri düzey konulara dalalım, özellikle de Stored Procedures, Lob Handling ve Custom Types ile çalışma üzerine yoğunlaşacağız.


9. Stored Procedures

Veritabanında depolanan prosedürler, SQL sorgularını ve komutlarını bir araya getirerek daha karmaşık işlemleri kolaylaştırmak için kullanılır. Spring JDBC Template ile bu prosedürleri çağırmak oldukça basittir.


Öncelikle, bir stored procedure örneği düşünelim:


sql

Copy code

CREATE PROCEDURE get_employee_by_name(IN emp_name VARCHAR(255), OUT emp_position VARCHAR(255))

BEGIN

  SELECT position INTO emp_position FROM employees WHERE name = emp_name;

END;

Bu prosedür, belirtilen isme sahip çalışanın pozisyonunu döndürür. Spring JDBC Template ile bu prosedürü şu şekilde çağırabiliriz:


java

Copy code

import org.springframework.jdbc.core.SqlOutParameter;

import org.springframework.jdbc.core.SqlParameter;

import org.springframework.jdbc.object.StoredProcedure;


public class GetEmployeePosition extends StoredProcedure {

    public GetEmployeePosition(DataSource dataSource) {

        super(dataSource, "get_employee_by_name");

        declareParameter(new SqlParameter("emp_name", Types.VARCHAR));

        declareParameter(new SqlOutParameter("emp_position", Types.VARCHAR));

        compile();

    }


    public String execute(String empName) {

        Map<String, Object> inParams = new HashMap<>();

        inParams.put("emp_name", empName);

        Map<String, Object> out = execute(inParams);

        return (String) out.get("emp_position");

    }

}

10. Lob Handling (Large Objects)

Büyük nesnelerle (LOB) çalışırken, LobHandler sınıfını kullanabilirsiniz. Bu, BLOB (Binary Large Object) ve CLOB (Character Large Object) türlerini işlemeyi kolaylaştırır.


java

Copy code

import org.springframework.jdbc.support.lob.DefaultLobHandler;

import org.springframework.jdbc.support.lob.LobHandler;


public class EmployeeLobMapper implements RowMapper<Employee> {

    private final LobHandler lobHandler = new DefaultLobHandler();


    @Override

    public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {

        Employee employee = new Employee();

        employee.setId(rs.getLong("id"));

        employee.setName(rs.getString("name"));

        employee.setImage(lobHandler.getBlobAsBytes(rs, "image")); // Handling BLOB

        return employee;

    }

}

11. Custom Types

Veritabanı ile özel türlerle çalışırken, özel bir RowMapper veya ResultSetExtractor oluşturabilirsiniz.


java

Copy code

public class EmployeeWithAddressMapper implements ResultSetExtractor<EmployeeWithAddress> {

    @Override

    public EmployeeWithAddress extractData(ResultSet rs) throws SQLException {

        EmployeeWithAddress employeeWithAddress = new EmployeeWithAddress();

        employeeWithAddress.setId(rs.getLong("id"));

        employeeWithAddress.setName(rs.getString("name"));

        Address address = new Address();

        address.setStreet(rs.getString("street"));

        address.setCity(rs.getString("city"));

        employeeWithAddress.setAddress(address);

        return employeeWithAddress;

    }

}

Bu, özel bir nesne yapısıyla veritabanı sonuçlarını eşleştirmenize olanak tanır.


Sonuç

Spring JDBC Template, çok yönlü ve güçlü bir araçtır. Bu rehber, temel CRUD işlemlerinden, işlem yönetimine, depolanan prosedürlerle çalışmaya, büyük nesnelerin ve özel türlerin işlenmesine kadar bir dizi konuyu kapsamaktadır.



Spring JDBC Template intervies soruları ve cevapları


Tabii ki! İşte Spring JDBC Template ile ilgili bazı yaygın mülakat soruları ve cevapları:


1. Soru: Spring JDBC Template Nedir ve Ne İçin Kullanılır?

Cevap: Spring JDBC Template, Java'nın Spring Framework'ünde veritabanı erişimi için kullanılan bir araçtır. JDBC kodunu daha etkin bir şekilde yazmanıza yardımcı olur, hata işleme ve kaynak yönetimi gibi tekrarlayan görevleri otomatize eder.


2. Soru: Spring JDBC Template ve Vanilla JDBC Arasındaki Farklar Nelerdir?

Cevap: Spring JDBC Template, standart JDBC'ye göre aşağıdaki avantajlara sahiptir:


Daha az tekrarlayan kod

Daha iyi hata işleme

Kaynak yönetimi otomasyonu (bağlantıların, ifadelerin kapatılması vb.)

Sorgu yazma ve sonuç dönüştürme için daha yüksek seviye API'ler

3. Soru: JdbcTemplate Sınıfının Ana Metodları Nelerdir?

Cevap: JdbcTemplate sınıfının ana metodları şunları içerir:


queryForObject(): Tek bir nesne döndürmek için kullanılır

query(): Bir nesne listesi döndürmek için kullanılır

update(): Ekleme, güncelleme, silme gibi değiştirme işlemleri için kullanılır

execute(): DDL işlemleri için kullanılır

4. Soru: RowMapper Arayüzü Nedir ve Ne İçin Kullanılır?

Cevap: RowMapper arayüzü, bir ResultSet satırını bir nesneye dönüştürmek için kullanılır. Bu, veritabanından dönen sonuçları Java nesnelerine dönüştürmek için kullanılır.


5. Soru: Spring JDBC Template İle İşlem Yönetimi Nasıl Yapılır?

Cevap: Spring JDBC Template ile işlem yönetimi, @Transactional annotasyonu kullanılarak yapılır. Bu annotasyon, belirli bir yöntemin bir işlemde çalıştırılmasını sağlar, ve eğer herhangi bir şey başarısız olursa, tüm işlem geri alınır.


6. Soru: Adımlı Sorgular (Named Queries) Nedir ve Ne İçin Kullanılır?

Cevap: Adımlı sorgular, sorgu dizesinde parametre adları kullanmanıza olanak tanır. Bu, kodun okunabilirliğini artırabilir. NamedParameterJdbcTemplate sınıfı, adımlı sorguları destekler.


7. Soru: JDBC Template İle Batch İşlemleri Nasıl Yapılır?

Cevap: Batch işlemleri, büyük miktarda veri ile çalışırken performansı artırmak için kullanılır. JdbcTemplate'in batchUpdate() metodu, bir seferde birçok kaydı işlemek için kullanılabilir.


8. Soru: Spring JDBC Template'te Hata İşleme Nasıl Yapılır?

Cevap: Spring JDBC Template, DataAccessException sınıfı ve ondan türetilen özel istisnalar aracılığıyla hata işlemeyi kolaylaştırır. Bu, SQL hatası türüne bağlı olarak daha spesifik bir istisna fırlatılmasına olanak tanır, böylece hataların daha etkili bir şekilde ele alınmasına yardımcı olur.


9. Soru: JDBC Template'te Depolanan Prosedürler Nasıl Kullanılır?

Cevap: JDBC Template, StoredProcedure sınıfı aracılığıyla depolanan prosedürleri kullanabilir. Bu sınıf, prosedür parametrelerini tanımlamak, prosedürü çağırmak ve sonuçları almak için kullanılır.


10. Soru: JDBC Template İle Çalışırken Performansı Artırmak İçin Hangi Yöntemler Kullanılabilir?

Cevap: Performansı artırmak için kullanılabilecek yöntemler arasında şunlar bulunur:


Batch işlemler kullanmak

Uygun indeksleme ve sorgu optimizasyonu yapmak

İhtiyaca göre bağlantı havuzu kullanmak

11. Soru: JDBC Template İle BLOB ve CLOB Veri Türleri Nasıl İşlenir?

Cevap: JDBC Template, LobHandler arayüzü aracılığıyla BLOB ve CLOB veri türleriyle çalışmayı destekler. Bu, büyük ikili veya karakter verilerini okuma ve yazma işlemlerini kolaylaştırır.


12. Soru: Adımlı Parametreler (Named Parameters) Nasıl Kullanılır?

Cevap: Adımlı parametreler, sorgularda yer tutucu yerine isim kullanmanıza olanak tanır. NamedParameterJdbcTemplate sınıfı, adımlı parametreleri destekler ve MapSqlParameterSource veya BeanPropertySqlParameterSource gibi sınıflar aracılığıyla parametre değerlerini sağlayabilir.


13. Soru: JDBC Template İle İlgili İşlem Yönetimi Nasıl Sağlanır?

Cevap: Spring JDBC Template, Spring'in işlem yönetimi altyapısıyla entegre olarak çalışır. İşlem sınırlarını belirlemek için @Transactional annotasyonu kullanılabilir. Bu, yöntem çağrıları arasında tutarlılık sağlar ve bir hatada otomatik geri alma yapar.


14. Soru: Spring JDBC Template İle Dinamik Sorgular Nasıl Yazılır?

Cevap: Dinamik sorgular, sorgunun farklı kısımlarının koşullara bağlı olarak bir araya getirilmesini gerektirir. NamedParameterJdbcTemplate ile birlikte, dinamik sorguların oluşturulmasını kolaylaştırmak için parametre isimlerini kullanabilirsiniz.


Spring JDBC bağlantı havuzunu kodla açıklar mısın?


Elbette! Bağlantı havuzu (connection pooling), bir uygulamanın veritabanı bağlantılarını etkili bir şekilde yönetmesine yardımcı olur. Bir bağlantı havuzu, önceden oluşturulmuş bir bağlantı kümesi sağlar, böylece her istekte yeni bir bağlantı oluşturmak yerine mevcut bağlantılar yeniden kullanılabilir. Bu, performansı artırabilir ve kaynak kullanımını optimize edebilir.


Spring Framework, farklı bağlantı havuzu kütüphaneleri ile entegre olabilir. Bu kütüphaneler arasında HikariCP, Apache Tomcat ve C3P0 gibi popüler seçenekler bulunur.


HikariCP ile Bağlantı Havuzu Kullanımı

HikariCP, yüksek performanslı ve güvenilir bir bağlantı havuzu kütüphanesidir. Spring Boot projesinde kullanmak için, öncelikle bağımlılığı eklemelisiniz:


xml

Copy code

<dependency>

    <groupId>com.zaxxer</groupId>

    <artifactId>HikariCP</artifactId>

    <version>4.0.3</version> <!-- Versiyon numarası projenize uygun olmalı -->

</dependency>

application.properties dosyanızda, HikariCP ile ilgili yapılandırmaları belirtebilirsiniz:


properties

Copy code

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.hikari.maximum-pool-size=10

Bu yapılandırma, bağlantı havuzunun en fazla 10 bağlantı içermesini sağlar.


Java Yapılandırması ile Bağlantı Havuzu

Eğer XML veya Java tabanlı bir yapılandırma kullanıyorsanız, bir DataSource bean'ini manuel olarak oluşturabilirsiniz:


java

Copy code

import com.zaxxer.hikari.HikariConfig;

import com.zaxxer.hikari.HikariDataSource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

public class DatabaseConfig {


    @Bean

    public DataSource dataSource() {

        HikariConfig config = new HikariConfig();

        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");

        config.setUsername("root");

        config.setPassword("root");

        config.setDriverClassName("com.mysql.cj.jdbc.Driver");

        config.setMaximumPoolSize(10);

        return new HikariDataSource(config);

    }

}

Bu yapılandırma, HikariCP bağlantı havuzunu kullanarak bir DataSource oluşturur ve Spring uygulamanızın kullanabileceği şekilde sağlar.


Bağlantı havuzları, veritabanı bağlantılarını yönetmek ve uygulamanın ölçeklenebilirliğini artırmak için önemli bir araçtır. Farklı bağlantı havuzu kütüphaneleri, farklı yapılandırma seçenekleri ve özellikler sunar, bu nedenle projenizin gereksinimlerine uygun olanı seçmek önemlidir.


Spring JDBC template dinamik sorgulrı advanced bir senaryo ile kod örneği verip açıklar mısın?


Elbette! Dinamik sorgular, sorgunun belirli kısımlarının koşullara bağlı olarak bir araya getirilmesini gerektirir. Spring JDBC Template ile birlikte, bu tür sorguları oluşturabilir ve parametrelerle çalışabilirsiniz.


Aşağıda, belirli bir kriter setine göre çalışanları aramak için kullanılabilecek bir dinamik sorgu örneği bulunmaktadır.


Senaryo

Diyelim ki bir kullanıcı, adına, pozisyonuna, maaş aralığına veya çalıştığı departmana göre çalışanları arayabilir. Bu, farklı kombinasyonlar ve koşullar gerektirecektir.


Kod Örneği

java

Copy code

import org.springframework.jdbc.core.RowMapper;

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import org.springframework.stereotype.Repository;


import java.util.ArrayList;

import java.util.List;


@Repository

public class EmployeeRepository {

    private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;


    public EmployeeRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {

        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;

    }


    public List<Employee> searchEmployees(String name, String position, Double minSalary, Double maxSalary, String department) {

        StringBuilder sql = new StringBuilder("SELECT * FROM employees WHERE 1 = 1");

        MapSqlParameterSource params = new MapSqlParameterSource();


        if (name != null) {

            sql.append(" AND name LIKE :name");

            params.addValue("name", "%" + name + "%");

        }


        if (position != null) {

            sql.append(" AND position = :position");

            params.addValue("position", position);

        }


        if (minSalary != null) {

            sql.append(" AND salary >= :minSalary");

            params.addValue("minSalary", minSalary);

        }


        if (maxSalary != null) {

            sql.append(" AND salary <= :maxSalary");

            params.addValue("maxSalary", maxSalary);

        }


        if (department != null) {

            sql.append(" AND department = :department");

            params.addValue("department", department);

        }


        return namedParameterJdbcTemplate.query(sql.toString(), params, employeeRowMapper());

    }


    private RowMapper<Employee> employeeRowMapper() {

        return (rs, rowNum) -> {

            Employee employee = new Employee();

            employee.setId(rs.getLong("id"));

            employee.setName(rs.getString("name"));

            employee.setPosition(rs.getString("position"));

            employee.setSalary(rs.getDouble("salary"));

            employee.setDepartment(rs.getString("department"));

            return employee;

        };

    }

}

Açıklama

Bu örnekte, farklı parametrelerle çalışanları arayabilmek için dinamik bir SQL sorgusu oluşturduk. Parametreler null ise, ilgili koşul sorguya eklenmez, böylece kullanıcı istediği kriterlerle arama yapabilir.


NamedParameterJdbcTemplate kullanarak, parametre adlarıyla çalışabilir ve SQL enjeksiyon saldırılarına karşı güvenli olabiliriz.


Bu örnek, daha karmaşık ve dinamik sorguların nasıl yazılabileceğine dair iyi bir giriş sağlar ve Spring JDBC Template'in bu tür senaryolarda ne kadar esnek ve güçlü olabileceğini gösterir.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال