Java PostgreSQL Kullanımı
Java ile PostgreSQL veritabanı kullanımı için gerekli olan PostgreSQL sürücüsünün kurulumu, PostgreSQL bağlantısı, tablo oluşturma, veri ekleme, güncelleme, silme ve sorgulama işlemleri yer alıyor.
Java PostgreSQL kurulumu
PostgreSQL veritabanına bağlanarak veritabanı işlemleri yapmak için Java JDBC PostgreSQL sürücüsünün(driver) kurulması gerekir.
JDBC hakkında detaylı bilgi almak için Java JDBC yazıma bakmalısın.
Maven projesi oluşturalım.
mvn archetype:generate \
-DgroupId=com.yusufsezer \
-DartifactId=java-postgresql \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
Maven archetype varsayılan Java 1.5 sürümü yerine farklı Java sürümünü properties özelliği ile aşağıdaki gibi belirleyebiliz.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
PostgreSQL sürücüsünü pom.xml dosyasına ekleyelim.
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.4</version>
</dependency>
Maven tabanlı Java projesi oluşturulup PostgreSQL sürücüsü tanımlandıktan sonra mvn install ile kurulum tamamlanır.
Java PostgreSQL bağlantısı
Java JDBC DriverManager sınıfında yer alan getConnection metodu ile veritabanı bağlantısı sağlanır.
Bağlantı sırasında kullanılacak genel JDBC tanımı aşağıdaki gibidir.
jdbc:driver://baglanti-cumlesi
PostgreSQL bağlantı cümlesi aşağıdaki gibidir.
jdbc:postgresql://host:port/database
Örneğin; postgres veritabanına bağlanmak için aşağıdaki bağlantı cümlesi kullanılır.
jdbc:postgresql://localhost:5432/postgres
Aşağıda örnekte Java JDBC PostgreSQL bağlantısı yer almaktadır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "yusuf.sezer";
try {
Connection connection = DriverManager.getConnection(url, user, pass);
System.out.println("Java JDBC bağlantısı başarıyla gerçekleşti.");
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
Bağlantı sırasında oluşabilecek hataları yakalamak ve yönetmek için try-catch kullanımı faydalı olacaktır.
Connection arayüzü AutoCloseable arayüzünü katılım aldığından try-with-resources sayesinde kaynakların teslim edilmesi(veritabanı bağlantısının kapatılması) sağlanabilir.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "yusuf.sezer";
try (Connection connection = DriverManager.getConnection(url, user, pass)) {
System.out.println("Java JDBC bağlantısı başarıyla gerçekleşti.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Veritabanı işlemlerinde kullanılan Connection, Statement ve Resultset arayüzlerinde yer alan close metodunun kullanımı gereksiz kaynak kullanımının önüne geçecektir.
Java PostgreSQL veritabanı işlemleri
JDBC Connection arayüzünde yer alan createStatement, prepareStatement ve prepareCall metotları ve Statement, PreparedStatement ile CallableStatement arayüzleri kullanılarak veritabanı işlemleri yapılır.
Java PostgreSQL tablo oluşturma
PostgreSQL tablo oluşturmak için SQL CREATE komutu ve executeUpdate metodu kullanılır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
try (Connection connection = DriverManager.getConnection(url, user, pass);
Statement statement = connection.createStatement()) {
String sqlSorgusu = """
CREATE TABLE kisiler (
kisi_sira INT GENERATED ALWAYS AS IDENTITY,
kisi_adi VARCHAR(20) NOT NULL,
kisi_soyadi VARCHAR(30) NOT NULL DEFAULT 'SEZER',
kisi_eposta VARCHAR(50) NOT NULL,
CONSTRAINT PK_sira PRIMARY KEY(kisi_sira)
);
""";
statement.executeUpdate(sqlSorgusu);
System.out.println("Tablo başarıyla oluşturuldu.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Tablo oluşturma işlemi için SQL Tablo Oluşturma yazıma bakabilirsin.
Java PostgreSQL veri ekleme
PostgreSQL veritabanına veri eklemek için SQL INSERT komutu ve executeUpdate metodu kullanılır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
try (Connection connection = DriverManager.getConnection(url, user, pass);
Statement statement = connection.createStatement()) {
String sqlSorgusu = """
INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta)
VALUES('Yusuf', 'SEZER', '[email protected]')
""";
int kayitSayisi = statement.executeUpdate(sqlSorgusu);
System.out.printf("%d kayıt eklendi.%n", kayitSayisi);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kullanıcıdan veya dışarıdan alınan bilgilerle veri ekleme, silme veya güncelleme sırasında PreparedStatement arayüzünün kullanımı SQL Injection gibi durumlara karşı faydalı olacaktır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
String sqlSorgusu = """
INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta)
VALUES(?, ?, ?)
""";
try (Connection connection = DriverManager.getConnection(url, user, pass);
PreparedStatement preparedStatement = connection.prepareStatement(sqlSorgusu)) {
Scanner scanner = new Scanner(System.in);
System.out.print("Adınız: ");
preparedStatement.setString(1, scanner.nextLine());
System.out.print("Soyadınız: ");
preparedStatement.setString(2, scanner.nextLine());
System.out.print("E-posta: ");
preparedStatement.setString(3, scanner.nextLine());
int kayitSayisi = preparedStatement.executeUpdate();
System.out.printf("%d kayıt eklendi.%n", kayitSayisi);
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
Java PostgreSQL veri güncelleme
Veri güncelleme işleminde SQL UPDATE komutu ve executeUpdate metodu kullanılır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
String sqlSorgusu = """
UPDATE kisiler SET kisi_adi = ?
WHERE kisi_sira = ?
""";
try (Connection connection = DriverManager.getConnection(url, user, pass);
PreparedStatement preparedStatement = connection.prepareStatement(sqlSorgusu)) {
Scanner scanner = new Scanner(System.in);
System.out.print("Sıra: ");
preparedStatement.setInt(2, Integer.parseInt(scanner.nextLine()));
System.out.print("Adınız: ");
preparedStatement.setString(1, scanner.nextLine());
int kayitSayisi = preparedStatement.executeUpdate();1
System.out.printf("%d kayıt düzenlendi.%n", kayitSayisi);
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
NOT: Veri güncelleme işleminde WHERE kullanılmazsa tablodaki tüm veriler güncellenir.
Java PostgreSQL veri silme
Java JDBC PostgreSQL veri silme işleminde SQL DELETE komutu ve executeUpdate metodu kullanılır.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
String sqlSorgusu = "DELETE FROM kisiler WHERE kisi_sira = ?";
try (Connection connection = DriverManager.getConnection(url, user, pass);
PreparedStatement preparedStatement = connection.prepareStatement(sqlSorgusu)) {
Scanner scanner = new Scanner(System.in);
System.out.print("Sıra: ");
preparedStatement.setInt(1, Integer.parseInt(scanner.nextLine()));
int kayitSayisi = preparedStatement.executeUpdate();
System.out.printf("%d kayıt silindi.%n", kayitSayisi);
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
NOT: Veri silme işleminde WHERE kullanılmazsa tablodaki tüm veriler silinir.
Java PostgreSQL sorgulama
Java JDBC PostgreSQL veri çekme, veri listeme veya sorgulama için SQL SELECT sorgu cümlesi execute, executeQuery metotları ve ResultSet arayüzü kullanılır.
Sınıf veriler üzerinde dolaşmak için next, first, last, previous, absolute gibi metotlara sahiptir.
Veritabanı sütunlarında yer alan verileri almak için getVeriTipi metotları kullanılır.
Metotların kullanımı sütun-adı ve sütün-sırası olmak üzere iki türlüdür.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
String sqlSorgusu = "SELECT * FROM kisiler";
try (Connection connection = DriverManager.getConnection(url, user, pass);
Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery(sqlSorgusu);
int sira;
String adi;
String soyadi;
String eposta;
while (resultSet.next()) {
sira = resultSet.getInt(1); // sütun sırası
adi = resultSet.getString(2);
soyadi = resultSet.getString("kisi_soyadi"); // sütun adı
eposta = resultSet.getString(4);
System.out.println(sira + " " + adi + " " + soyadi + ", " + eposta);
}
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
Statement arayüzünde yer alan execute metodunun kullanımı aşağıdaki gibidir.
public class App {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/postgres";
String user = "postgres";
String pass = "postgres";
String sqlSorgusu = "SELECT * FROM kisiler";
try (Connection connection = DriverManager.getConnection(url, user, pass);
Statement statement = connection.createStatement()) {
boolean sonuc = statement.execute(sqlSorgusu);
if (sonuc) {
ResultSet resultSet = statement.getResultSet();
int sira;
String adi;
String soyadi;
String eposta;
while (resultSet.next()) {
sira = resultSet.getInt(1); // sütun sırası
adi = resultSet.getString(2);
soyadi = resultSet.getString("kisi_soyadi"); // sütun adı
eposta = resultSet.getString(4);
System.out.println(sira + " " + adi + " " + soyadi + ", " + eposta);
}
}
} catch (SQLException sqlException) {
System.err.println(sqlException);
}
}
}
Java PostgreSQL veritabanı işlemlerini JDBC sayesinde sadece sürücü değiştirerek aynı arayüz ve metotlar ile işlem yapmayı sağlar.
Java JDBC sayesinde farklı SQL tabanlı veritabanları üzerinde işlem yapmayı da sağlar.
Son
Java JDBC Connection arayüzünde yer alan getMetaData metodu ile işlem yapılan veritabanı ve tablolar ile ilgili bilgiler alınarak veritabanı işlemlerini daha dinamik olarak yönetilmesini sağlar.
Java ile SQL tabanlı veritabanı bağımsız olarak işlem yapmak için JDBC özelliğini iyi öğrenilmesi faydalı olacaktır.
JDBC hakkında detaylı bilgi almak için Java JDBC yazıma bakmalısın.
Java Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.