Commit d51370ff by Patryk Czarnik

UPDATE

parent b979144c
package bazy.a_poczatek;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/* W tej wersji operacje na bazie wykonywane są w trybie "auto commit",
* czyli gdy program wykona polecenie UPDATE (i nie ma żadnego błędu), to OD RAZU zmiany są zapisywane w bazie.
*
* To jest domyślny sposób działanie połączeń w Javie/JDBC.
*/
public class PodwyzkaBezTransakcji {
public static void main(String[] args) {
final String url = "jdbc:postgresql://localhost/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
String job = JOptionPane.showInputDialog("Komu dać podwyżkę?\nPodaj job_id:");
BigDecimal zmiana = new BigDecimal(JOptionPane.showInputDialog("Podaj kwotę podwyżki"));
zmienPensje(c, job, zmiana);
JOptionPane.showMessageDialog(null, "Gotowe");
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void zmienPensje(Connection c, String job, BigDecimal zmiana) throws SQLException {
final String sql = "UPDATE employees SET salary = salary + ? WHERE job_id = ?";
try(PreparedStatement stmt = c.prepareStatement(sql)) {
stmt.setBigDecimal(1, zmiana);
stmt.setString(2, job);
stmt.executeUpdate();
}
}
}
package bazy.a_poczatek;
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 java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
/* W tej wersji program korzysta z bazy danych "w transakcji", co oznacza,
* że dopóki nie zatwierdzi zmian (commit), zmiany te nie są widoczne dla innych klientów,
* nie są zapisane w sposób trwały, można je wycofać.
*/
public class PodwyzkaWTransakcji {
public static void main(String[] args) {
final String url = "jdbc:postgresql://localhost/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
// wyłączam tryb auto-commit, wchodzę w tryb transakcji
c.setAutoCommit(false);
List<String> jobs = znajdzJoby(c);
String job = (String) JOptionPane.showInputDialog(null,
"Wybierz job", "Komu dać podwyżkę?", JOptionPane.QUESTION_MESSAGE, null, jobs.toArray(), null);
double avg1 = sredniaPensja(c, job);
JOptionPane.showMessageDialog(null, "Średnia pensja na stanowisku " + job + " wynosi teraz " + avg1);
BigDecimal zmiana = new BigDecimal(JOptionPane.showInputDialog("Podaj kwotę podwyżki"));
zmienPensje(c, job, zmiana);
double avg2 = sredniaPensja(c, job);
JOptionPane.showMessageDialog(null, "Średnia pensja na stanowisku " + job + " wynosi teraz " + avg2);
int wybor = JOptionPane.showConfirmDialog(null, "Czy zatwierdzić zmiany?");
switch (wybor) {
case JOptionPane.YES_OPTION -> c.commit();
case JOptionPane.NO_OPTION -> c.rollback();
default -> {}
}
double avg3 = sredniaPensja(c, job);
JOptionPane.showMessageDialog(null, "Średnia pensja na stanowisku " + job + " wynosi teraz " + avg3);
JOptionPane.showMessageDialog(null, "Koniec programu, zaraz sie rozłączę...");
} catch (SQLException e) {
e.printStackTrace();
}
}
private static double sredniaPensja(Connection c, String job) throws SQLException {
String sql = "SELECT avg(salary) FROM employees WHERE job_id = ?";
try (PreparedStatement stmt = c.prepareStatement(sql)) {
stmt.setString(1, job);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return rs.getDouble(1);
}
}
}
return 0.0;
}
private static List<String> znajdzJoby(Connection c) throws SQLException {
List<String> jobs = new ArrayList<>();
try(PreparedStatement stmt = c.prepareStatement("SELECT DISTINCT job_id FROM employees ORDER BY 1");
ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
jobs.add(rs.getString(1));
}
}
return jobs;
}
private static void zmienPensje(Connection c, String job, BigDecimal zmiana) throws SQLException {
final String sql = "UPDATE employees SET salary = salary + ? WHERE job_id = ?";
try(PreparedStatement stmt = c.prepareStatement(sql)) {
stmt.setBigDecimal(1, zmiana);
stmt.setString(2, job);
int ile = stmt.executeUpdate();
JOptionPane.showMessageDialog(null, "UPDATE wykonany. Zmieniono " + ile + " rekordów.");
}
}
}
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