Commit c0a66224 by Patryk Czarnik

Przykład na parametry '?'

parent ea6eeb5d
...@@ -357,7 +357,7 @@ SELECT city FROM locations WHERE city ILIKE '%o%o%'; ...@@ -357,7 +357,7 @@ SELECT city FROM locations WHERE city ILIKE '%o%o%';
SELECT city FROM locations WHERE lower(city) LIKE '%o%o%'; SELECT city FROM locations WHERE lower(city) LIKE '%o%o%';
-- Informacja nt SIMILAR TO oraz regexp_match -- Informacja nt SIMILAR TO oraz regexp_match
-- https://www.postgresql.org/docs/12/functions-matching.html -- https://www.postgresql.org/docs/16/functions-matching.html
......
package zajecia;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class WybranyJob_v1 {
// 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 static void main(String[] args) {
String url = "jdbc:postgresql://localhost/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod 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.equalsIgnoreCase(szukanyJob)) {
String imie = rs.getString("first_name");
String nazwisko = rs.getString("last_name");
BigDecimal salary = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s\n", imie, nazwisko, job, salary);
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package zajecia;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class WybranyJob_v2 {
// 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 = 1; SELECT '
// '; DROP TABLE employees CASCADE; SELECT '
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod 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 salary = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s\n", imie, nazwisko, job, salary);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package zajecia;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class WybranyJob_v3 {
// 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 static void main(String[] args) {
String url = "jdbc:postgresql://localhost/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
String szukanyJob = JOptionPane.showInputDialog("Podaj kod 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 salary = rs.getBigDecimal("salary");
System.out.printf("%s %s (%s) zarabia %s\n", imie, nazwisko, job, salary);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
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