FaqDAO.java

package model.DAO;

import model.beans.FAQ;
import model.beans.Utente;
import model.storage.ConPool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public final class FaqDAO implements DAO<FAQ> {

   @Override
   public FAQ getById(final int id) {
      if (id > 0) {
         try (Connection con = ConPool.getInstance().getConnection()) {
            try (PreparedStatement ps = con.prepareStatement("SELECT * "
                    + "FROM faq WHERE idFaq = ?")) {
               ps.setInt(1, id);

               ResultSet rs = ps.executeQuery();

               FAQ retrieved = null;

               if (rs.next()) {
                  retrieved = extract(rs);
               }

               return retrieved;
            }
         } catch (SQLException e) {
            throw new RuntimeException("SQL error: " + e.getMessage());
         }
      } else {
         throw new IllegalArgumentException("Id <= 0");
      }
   }

   @Override
   public List<FAQ> getAll() {
      try (Connection con = ConPool.getInstance().getConnection()) {
         try (PreparedStatement ps =
                      con.prepareStatement("SELECT * FROM faq")) {
            ResultSet rs = ps.executeQuery();
            List<FAQ> retrieved = new ArrayList<>();

            while (rs.next()) {
               retrieved.add(extract(rs));
            }

            return retrieved;
         }
      } catch (SQLException e) {
         throw new RuntimeException("SQL error: " + e.getMessage());
      }
   }

   @Override
   public boolean save(final FAQ entity) {
      if (entity != null) {
         try (Connection con = ConPool.getInstance().getConnection()) {
            try (PreparedStatement ps = con.prepareStatement("INSERT INTO "
                            + "faq (domanda, risposta, idUtente) "
                            + "VALUES (?,?,?)",
                    PreparedStatement.RETURN_GENERATED_KEYS)) {

               int index = 1;

               ps.setString(index++, entity.getDomanda());
               ps.setString(index++, entity.getRisposta());
               ps.setInt(index, entity.getUtenteCreatore().getIdUtente());

               boolean esito = ps.executeUpdate() > 0;
               ResultSet resultSet = ps.getGeneratedKeys();
               if (resultSet.next()) {
                  entity.setIdFaq(resultSet.getInt(1));
               }

               return esito;
            }
         } catch (SQLException e) {
            throw new RuntimeException("SQL error: " + e.getMessage());
         }
      } else {
         throw new IllegalArgumentException("Null object");
      }
   }

   @Override
   public boolean update(final FAQ entity) {
      if (entity != null) {
         try (Connection connection =
                      ConPool.getInstance().getConnection()) {
            String query =
                    "UPDATE faq SET domanda = ?, risposta = ?, idUtente = ? "
                            + "WHERE idFaq = ?";

            try (PreparedStatement preparedStatement =
                         connection.prepareStatement(query)) {

               int index = 1;

               preparedStatement.setString(index++, entity.getDomanda());
               preparedStatement.setString(index++, entity.getRisposta());
               preparedStatement.setInt(index++,
                       entity.getUtenteCreatore().getIdUtente());
               preparedStatement.setInt(index, entity.getIdFaq());

               return preparedStatement.executeUpdate() > 0;
            }
         } catch (SQLException e) {
            throw new RuntimeException("SQL error: " + e.getMessage());
         }
      } else {
         throw new IllegalArgumentException("Null object");
      }
   }

   @Override
   public boolean delete(final FAQ entity) {
      if (entity != null) {
         try (Connection connection =
                      ConPool.getInstance().getConnection()) {
            String query =
                    "DELETE FROM faq WHERE idFaq = ?";

            try (PreparedStatement preparedStatement =
                         connection.prepareStatement(query)) {

               preparedStatement.setInt(1, entity.getIdFaq());

               return preparedStatement.executeUpdate() > 0;
            }
         } catch (SQLException e) {
            throw new RuntimeException("SQL error: " + e.getMessage());
         }
      } else {
         throw new IllegalArgumentException("Null object");
      }
   }

   @Override
   public FAQ extract(final ResultSet resultSet)
           throws SQLException {
      if (resultSet != null) {
         FAQ fq = new FAQ();

         fq.setIdFaq(resultSet.getInt("idFaq"));
         fq.setDomanda(resultSet.getString("domanda"));
         fq.setRisposta(resultSet.getString("risposta"));

         Utente ut = new Utente();
         ut.setIdUtente(resultSet.getInt("idUtente"));

         fq.setUtenteCreatore(ut);
         return fq;
      } else {
         throw new IllegalArgumentException("Null object");
      }
   }
}