spring jdbc nedir ?
Published: 2024-06-14 15:46:11

Spring JDBC, Spring Framework'ün bir parçası olan ve JDBC (Java Database Connectivity) kullanarak ilişkisel veritabanlarıyla etkileşimi kolaylaştıran bir modüldür. Spring JDBC, ham JDBC API'sinin kullanımını basitleştirir, tekrarlanan kodları ortadan kaldırır ve kaynak yönetimini otomatikleştirir. Bu sayede geliştiriciler daha temiz ve okunabilir kod yazabilirler.

### Spring JDBC'nin Temel Özellikleri

1. **JdbcTemplate**: JDBC operasyonlarını basitleştirmek için kullanılan merkezi sınıftır. CRUD (Create, Read, Update, Delete) işlemleri için çeşitli yöntemler sağlar.
2. **NamedParameterJdbcTemplate**: Adlandırılmış parametreler kullanarak SQL sorgularını daha okunabilir hale getirir.
3. **SimpleJdbcInsert ve SimpleJdbcCall**: Ekleme ve saklı yordam çağrılarını basitleştirir.
4. **RowMapper ve ResultSetExtractor**: Veritabanından dönen sonuçların Java nesnelerine dönüştürülmesini sağlar.

### Spring JDBC Kullanarak Veritabanı İşlemleri

Aşağıda, Spring JDBC kullanarak bir veritabanı bağlantısının nasıl kurulacağını ve veri işlemlerinin nasıl yapılacağını gösteren bir örnek bulunmaktadır.

### Maven Bağımlılıkları

```xml
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.9</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
</dependencies>
```

### Veritabanı Yapılandırması (applicationContext.xml)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Veritabanı bağlantı bilgileri -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/your_database_name"/>
        <property name="username" value="your_username"/>
        <property name="password" value="your_password"/>
    </bean>

    <!-- JdbcTemplate bean tanımı -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>
```

### Entity Sınıfı (Employee.java)

```java
public class Employee {
    private int id;
    private String name;
    private int age;

    // Getter ve Setter metodları
    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
```

### EmployeeDAO Sınıfı (EmployeeDAO.java)

```java
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class EmployeeDAO {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // Veri ekleme
    public int saveEmployee(Employee employee) {
        String query = "INSERT INTO Employee (name, age) VALUES (?, ?)";
        return jdbcTemplate.update(query, employee.getName(), employee.getAge());
    }

    // Veri güncelleme
    public int updateEmployee(Employee employee) {
        String query = "UPDATE Employee SET name=?, age=? WHERE id=?";
        return jdbcTemplate.update(query, employee.getName(), employee.getAge(), employee.getId());
    }

    // Veri silme
    public int deleteEmployee(int id) {
        String query = "DELETE FROM Employee WHERE id=?";
        return jdbcTemplate.update(query, id);
    }

    // Veri okuma
    public List<Employee> getAllEmployees() {
        String query = "SELECT * FROM Employee";
        return jdbcTemplate.query(query, new EmployeeRowMapper());
    }
}
```

### EmployeeRowMapper Sınıfı (EmployeeRowMapper.java)

```java
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class EmployeeRowMapper implements RowMapper<Employee> {
    @Override
    public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
        Employee employee = new Employee();
        employee.setId(rs.getInt("id"));
        employee.setName(rs.getString("name"));
        employee.setAge(rs.getInt("age"));
        return employee;
    }
}
```

### Main Sınıfı (Main.java)

```java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        EmployeeDAO employeeDAO = (EmployeeDAO) context.getBean("employeeDAO");

        // Yeni bir çalışan ekleme
        Employee employee = new Employee();
        employee.setName("John Doe");
        employee.setAge(30);
        employeeDAO.saveEmployee(employee);

        // Çalışanları listeleme
        List<Employee> employees = employeeDAO.getAllEmployees();
        for (Employee emp : employees) {
            System.out.println("ID: " + emp.getId() + ", Name: " + emp.getName() + ", Age: " + emp.getAge());
        }
    }
}
```

### Spring JDBC'nin Avantajları

1. **Kolay Kullanım**: Spring JDBC, JDBC API'sinin karmaşıklığını azaltarak daha basit bir kullanım sunar.
2. **Kaynak Yönetimi**: Bağlantıların, ifadelerin ve sonuç kümelerinin yönetimini otomatikleştirir.
3. **Hata Yönetimi**: SQLExceptions'ı anlamlı Spring DataAccessExceptions'a dönüştürerek hata yönetimini kolaylaştırır.
4. **Esneklik**: Ham SQL sorgularını kullanarak esneklik sağlar, ayrıca NamedParameterJdbcTemplate gibi araçlar ile okunabilirliği artırır.

Bu örnekler ve açıklamalar, Spring JDBC'nin temel kullanımını ve avantajlarını anlamanıza yardımcı olacaktır. Spring JDBC, veritabanı işlemlerini daha verimli ve yönetilebilir hale getirir.