package aplicatie;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
public class MainApp extends JFrame {
private JList jList;
private DefaultListModel listModel;
private JTextField txtTara, txtStatie, txtNumarObiective;
private JButton btnAdauga, btnSterge;
private Connection connection;
public MainApp() {
setTitle("Gestiune Destinații Turistice");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
// Conectare la baza de date
conectareBazaDate();
// Panou de sus pentru afișare
JPanel panouSus = new JPanel(new BorderLayout());
panouSus.setBorder(BorderFactory.createTitledBorder("Destinații Turistice"));
listModel = new DefaultListModel<>();
jList = new JList<>(listModel);
JScrollPane scrollPane = new JScrollPane(jList);
panouSus.add(scrollPane, BorderLayout.CENTER);
// Buton ștergere sub listă
btnSterge = new JButton("Șterge Destinație Selectată");
btnSterge.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
stergeDestinatie();
}
});
panouSus.add(btnSterge, BorderLayout.SOUTH);
// Panou de jos pentru adăugare
JPanel panouJos = new JPanel(new GridLayout(4, 2, 5, 5));
panouJos.setBorder(BorderFactory.createTitledBorder("Adăugare Destinație Nouă"));
panouJos.add(new JLabel("Țara:"));
txtTara = new JTextField();
panouJos.add(txtTara);
panouJos.add(new JLabel("Stațiunea:"));
txtStatie = new JTextField();
panouJos.add(txtStatie);
panouJos.add(new JLabel("Număr Obiective:"));
txtNumarObiective = new JTextField();
panouJos.add(txtNumarObiective);
btnAdauga = new JButton("Adaugă Destinație");
btnAdauga.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
adaugaDestinatie();
}
});
panouJos.add(new JLabel(""));
panouJos.add(btnAdauga);
add(panouSus, BorderLayout.CENTER);
add(panouJos, BorderLayout.SOUTH);
// Încărcare date inițiale
incarcaDate();
setLocationRelativeTo(null);
setVisible(true);
}
private void conectareBazaDate() {
String url = "jdbc:mysql://localhost:3306/turism";
try {
connection = DriverManager.getConnection(url, "root", "root");
creeazaTabelDacaNuExista();
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Eroare la conectarea la baza de date: " + e.getMessage(),
"Eroare Conexiune", JOptionPane.ERROR_MESSAGE);
}
}
private void creeazaTabelDacaNuExista() {
String sql = "CREATE TABLE IF NOT EXISTS destinatii (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"tara VARCHAR(50), " +
"statie VARCHAR(50), " +
"numar_obiective INT)";
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
private void incarcaDate() {
listModel.clear();
String sql = "SELECT * FROM destinatii";
try (Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
String tara = rs.getString("tara");
String statie = rs.getString("statie");
int numarObiective = rs.getInt("numar_obiective");
String linie = String.format("%s, %s, %d", tara, statie, numarObiective);
listModel.addElement(linie);
}
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Eroare la încărcarea datelor: " + e.getMessage(),
"Eroare", JOptionPane.ERROR_MESSAGE);
}
}
private void adaugaDestinatie() {
String tara = txtTara.getText().trim();
String statie = txtStatie.getText().trim();
String numarObStr = txtNumarObiective.getText().trim();
if (tara.isEmpty() || statie.isEmpty() || numarObStr.isEmpty()) {
JOptionPane.showMessageDialog(this,
"Vă rugăm să completați toate câmpurile!",
"Câmpuri Incomplete", JOptionPane.WARNING_MESSAGE);
return;
}
try {
int numarObiective = Integer.parseInt(numarObStr);
String sql = "INSERT INTO destinatii (tara, statie, numar_obiective) VALUES (?, ?, ?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, tara);
ps.setString(2, statie);
ps.setInt(3, numarObiective);
int randuri = ps.executeUpdate();
if (randuri > 0) {
JOptionPane.showMessageDialog(this,
"Destinația a fost adăugată cu succes!",
"Succes", JOptionPane.INFORMATION_MESSAGE);
// Golire câmpuri
txtTara.setText("");
txtStatie.setText("");
txtNumarObiective.setText("");
// Reîncărcare date
incarcaDate();
}
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this,
"Numărul de obiective trebuie să fie un număr întreg!",
"Format Invalid", JOptionPane.ERROR_MESSAGE);
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Eroare la adăugarea destinației: " + e.getMessage(),
"Eroare", JOptionPane.ERROR_MESSAGE);
}
}
private void stergeDestinatie() {
int index = jList.getSelectedIndex();
if (index == -1) {
JOptionPane.showMessageDialog(this,
"Vă rugăm să selectați o destinație din listă!",
"Nicio Selecție", JOptionPane.WARNING_MESSAGE);
return;
}
String linie = listModel.getElementAt(index);
String[] parti = linie.split(", ");
String tara = parti[0];
String statie = parti[1];
int confirmare = JOptionPane.showConfirmDialog(this,
"Sigur doriți să ștergeți destinația: " + tara + ", " + statie + "?",
"Confirmare Ștergere", JOptionPane.YES_NO_OPTION);
if (confirmare == JOptionPane.YES_OPTION) {
String sql = "DELETE FROM destinatii WHERE tara = ? AND statie = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, tara);
ps.setString(2, statie);
int randuri = ps.executeUpdate();
if (randuri > 0) {
JOptionPane.showMessageDialog(this,
"Destinația a fost ștearsă cu succes!",
"Succes", JOptionPane.INFORMATION_MESSAGE);
incarcaDate();
}
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Eroare la ștergerea destinației: " + e.getMessage(),
"Eroare", JOptionPane.ERROR_MESSAGE);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainApp();
}
});
}
}
used code
Interfeţele Statement, PreparedStatement, Connection, ResultSet implementează interfaţa AutoCloseable, putând fi folosite în blocuri try cu resurse, pentru ca resursa să fie închisă automat
does it work?
idk?
please help
În blocurile catch se afişează pe lângă mesajul excepţiei şi comanda sql care a determinat-o Metoda executeUpdate() este utilizată pentru a rula comenzile SQL insert, update şi delete. Metoda returnează numărul de rânduri afectate de comanda SQL. Comenzile update şi delete pot afecta de la nici un rând până la toate rândurile din tabelă, în funcţie de condiţia din clauza where Valorile efective ale parametrilor au fost stabilite prin metodele setInt(nr_parametru,valoare) sausetString(nr_parametru,valoare) Accesarea coloanelor din ResultSet s-a făcut de această dată precizând index-ul coloanei, nu denumirea acesteia