Commit 650d3c69 by Patryk Czarnik

przykłady JDBC podstawy

parent 3490456e
package bazy.zajecia;
import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Modyfikacja {
public static void main(String[] args) {
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost/hr", "alx", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG");
int zmiana = Integer.parseInt(JOptionPane.showInputDialog("Podaj zmianę pensji", "1000"));
final String sql = "UPDATE employees SET salary = salary + ? WHERE job_id = ?";
PreparedStatement stmt = c.prepareStatement(sql);
stmt.setInt(1, zmiana);
stmt.setString(2, szukanyJob);
int wynik = stmt.executeUpdate();
JOptionPane.showMessageDialog(null, "Zmieniono " + wynik + " rekordów.");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
package bazy.zajecia;
import javax.swing.*;
import java.sql.*;
public class ModyfikacjaWTransakcji {
public static void main(String[] args) {
final String updateSql = "UPDATE employees SET salary = salary + ? WHERE job_id = ?";
final String avgSql = "SELECT avg(salary) FROM employees WHERE job_id = ?";
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost/hr", "alx", "abc123")) {
PreparedStatement updateStmt = c.prepareStatement(updateSql);
PreparedStatement avgStmt = c.prepareStatement(avgSql);
c.setAutoCommit(false);
// weszliśmy w tryb transakcji, tzn. zmiany dokonywane w tej sesji nie będą zapisane w sposób trwały dopóki nie wykonamy polecenia COMMIT
// zerwanie sesji bez zrobienia COMMIT powoduje utratę zmian
String szukanyJob = JOptionPane.showInputDialog("Podaj kod stanowiska", "IT_PROG");
avgStmt.setString(1, szukanyJob);
try(ResultSet rs = avgStmt.executeQuery()) {
if(rs.next()) {
double avg = rs.getDouble(1);
JOptionPane.showMessageDialog(null, "Średnia pensja wynosi " + avg);
}
}
int zmiana = Integer.parseInt(JOptionPane.showInputDialog("Podaj zmianę pensji", "1000"));
updateStmt.setInt(1, zmiana);
updateStmt.setString(2, szukanyJob);
int wynik = updateStmt.executeUpdate();
JOptionPane.showMessageDialog(null, "Zmieniono " + wynik + " rekordów.");
try(ResultSet rs = avgStmt.executeQuery()) {
if(rs.next()) {
double avg = rs.getDouble(1);
JOptionPane.showMessageDialog(null, "Średnia pensja wynosi teraz " + avg);
}
}
int wybor = JOptionPane.showConfirmDialog(null, "Czy zapisać zmiany?");
switch(wybor) {
case JOptionPane.YES_OPTION -> c.commit();
case JOptionPane.NO_OPTION -> c.rollback();
case JOptionPane.CANCEL_OPTION -> {return;} // wcześniej przerywa program; połączenie zostanie zamknięte bez commita
}
try(ResultSet rs = avgStmt.executeQuery()) {
if(rs.next()) {
double avg = rs.getDouble(1);
JOptionPane.showMessageDialog(null, "Średnia pensja wynosi teraz " + avg);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
......@@ -26,7 +26,6 @@ public class OdczytajPostgreSQL1 {
);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
......
package bazy.zajecia;
import javax.swing.*;
import java.math.BigDecimal;
import java.sql.*;
// Zadanie: niech program wypisuje tylko tych pracowników, którzy mają podane job_id
// Wada tego rozwiązania: NISKA WYDAJNOŚĆ
// Serwer odczytuje wszystkie rekordy z dysku
// wszystkie rekordy są przesyłanie przez sieć
// wszystkie rekordy są odbieranie i przeglądane przez program w Javie.
public class PracownicyWedlugJob1 {
public static void main(String[] args) {
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "alx", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj nazwę stanowiska", "IT_PROG");
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees")) {
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
String job = rs.getString("job_id");
if(job.equals(szukanyJob)) {
String imie = rs.getString("first_name");
String nazwisko = rs.getString("last_name");
BigDecimal pensja = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s%n", imie, nazwisko, job, pensja);
}
}
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
package bazy.zajecia;
import javax.swing.*;
import java.math.BigDecimal;
import java.sql.*;
// Zadanie: niech program wypisuje tylko tych pracowników, którzy mają podane job_id
// Niech program wypisuje tylko tych pracowników, którzy mają podane job_id.
// Ta wersja jest niebezpieczna - umożliwia użytkownikowi dopisanie dowolnego kodu do zapytania.
// = "SQL Injection"
// '; UPDATE employees SET salary = 99000; SELECT '
// '; DROP TABLE employees CASCADE; SELECT '
public class PracownicyWedlugJob2 {
public static void main(String[] args) {
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "alx", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj nazwę stanowiska", "IT_PROG");
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = '" + szukanyJob +"'")) {
System.out.println(stmt);
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
String job = rs.getString("job_id");
String imie = rs.getString("first_name");
String nazwisko = rs.getString("last_name");
BigDecimal pensja = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s%n", imie, nazwisko, job, pensja);
}
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
package bazy.zajecia;
import javax.swing.*;
import java.math.BigDecimal;
import java.sql.*;
// Zadanie: niech program wypisuje tylko tych pracowników, którzy mają podane job_id
// Rozwiązanie poprawne:
// - Dzięki WHERE to serwer wybiera tylko te rekordy, które spełniają warunek.
// * Jeśli dla kolumny jest zdefiniowany indeks, to serwer bardzo sprawnie odczyta z dysku tylko te rekordy, które mają sens (dla dużych danych to jest olbrzymie przyspieszenie)
// * Nawet gdyby nie było indeksu, to sprawdzanie warunku po stronie serwera zmniejsza transfer i obciążenie naszej aplikacji klienckiej.
// - Dzięki podstawianiu parametrów za pomocą ? jest to bezpieczne - nie ma możliwości SQL Injection (oczywiście o ile twórcy sterownika postgresql-jdbc dobrze go napisali...)
public class PracownicyWedlugJob3 {
public static void main(String[] args) {
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hr", "alx", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj nazwę stanowiska", "IT_PROG");
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees WHERE job_id = ?")) {
stmt.setString(1, szukanyJob);
System.out.println(stmt);
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
String job = rs.getString("job_id");
String imie = rs.getString("first_name");
String nazwisko = rs.getString("last_name");
BigDecimal pensja = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s%n", imie, nazwisko, job, pensja);
}
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment