### Java JDBC Temelleri
Java Database Connectivity (JDBC), Java uygulamalarının ilişkisel veritabanlarına bağlanmasını sağlayan bir API'dir. JDBC, veritabanı bağlantısı kurmak, SQL sorguları çalıştırmak ve veritabanı işlemleri yapmak için gerekli olan sınıfları ve arayüzleri sağlar.
#### JDBC Temel Bileşenleri
1. **JDBC Driver:** Veritabanı ile Java uygulaması arasında köprü görevi görür. Veritabanı türüne göre farklı JDBC sürücüleri vardır (örneğin, MySQL, Oracle, PostgreSQL).
2. **Connection:** Veritabanı ile Java uygulaması arasında bir bağlantı sağlar.
3. **Statement:** SQL sorguları çalıştırmak için kullanılır.
4. **ResultSet:** SQL sorgularının sonuçlarını temsil eder.
5. **PreparedStatement:** Önceden derlenmiş SQL sorguları ile performansı artırır ve güvenliği sağlar.
6. **CallableStatement:** Depolanmış prosedürleri çağırmak için kullanılır.
### Veritabanı Bağlantısı
Veritabanı bağlantısı kurmak için JDBC sürücüsü yüklenir ve `DriverManager` aracılığıyla bağlantı sağlanır.
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("Veritabanına başarıyla bağlandınız!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
- **DriverManager.getConnection(url, user, password):** Veritabanına bağlantı sağlar.
- **Connection:** Bağlantıyı temsil eder ve SQL işlemlerini gerçekleştirmek için kullanılır.
### Sorgular ve İşlemler
JDBC ile SQL sorguları çalıştırmak için `Statement` veya `PreparedStatement` kullanılır. İşte temel işlemler:
#### Statement Kullanımı
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
String query = "SELECT * FROM employees";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("Name: " + rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
- **Statement:** SQL sorguları çalıştırmak için kullanılır.
- **executeQuery(query):** Veritabanından veri okur ve bir `ResultSet` döner.
- **ResultSet:** Sorgu sonuçlarını temsil eder ve veri okuma işlemleri yapılabilir.
#### PreparedStatement Kullanımı
`PreparedStatement`, SQL sorgularını önceden derler ve performansı artırır. Ayrıca SQL enjeksiyonlarına karşı daha güvenlidir.
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "INSERT INTO employees (name, age) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Alice");
pstmt.setInt(2, 30);
pstmt.executeUpdate();
System.out.println("Veri başarıyla eklendi!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
- **PreparedStatement:** SQL sorgularını derler ve parametreli sorgular kullanır.
- **setString(index, value):** SQL sorgusundaki parametreleri ayarlar.
- **executeUpdate():** Sorgu çalıştırır ve güncelleme yapar (INSERT, UPDATE, DELETE).
#### CallableStatement Kullanımı
`CallableStatement`, veritabanında depolanmış prosedürleri çağırmak için kullanılır.
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "{call getEmployeeById(?)}";
try (CallableStatement cstmt = conn.prepareCall(sql)) {
cstmt.setInt(1, 1); // Prosedüre parametre ayarlama
boolean hasResultSet = cstmt.execute();
if (hasResultSet) {
try (ResultSet rs = cstmt.getResultSet()) {
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("Name: " + rs.getString("name"));
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
- **CallableStatement:** Depolanmış prosedürleri çağırmak için kullanılır.
- **prepareCall(sql):** Depolanmış prosedür çağrısı için `CallableStatement` oluşturur.
- **execute():** Depolanmış prosedürü çalıştırır ve sonuçları döner.
### Özet
Bu ders notları, Java'da JDBC kullanarak veritabanı bağlantısı kurma, SQL sorguları çalıştırma, `PreparedStatement` ve `CallableStatement` kullanımı konularını kapsamaktadır. JDBC, Java uygulamalarının veritabanlarıyla etkileşimde bulunmasını sağlar ve `Statement`, `PreparedStatement`, ve `CallableStatement` sınıfları, veritabanı işlemlerini daha verimli ve güvenli bir şekilde yönetmeyi mümkün kılar. Bu temel bilgilerle, Java uygulamalarınızda veritabanı işlemlerini etkin bir şekilde gerçekleştirebilirsiniz.