Skip to content

Instantly share code, notes, and snippets.

@neo7BF
Created May 30, 2021 09:03
Show Gist options
  • Save neo7BF/ea2ddfcdc0ce35b75499370ed5a9dcc2 to your computer and use it in GitHub Desktop.
Save neo7BF/ea2ddfcdc0ce35b75499370ed5a9dcc2 to your computer and use it in GitHub Desktop.
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class GenericsAndResultSet {
public static void main(String[] args) {
try {
ResultSet rs = null; //riempito eseguendo una query sul database
List<Ombrello> ombrelli = convertToList(rs, Ombrello.class);
//usi ombrelli come vuoi...
}catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
//Quest'annotazione serve per "sopprimere un alert di Eclipse riguardante il metodo newInstance che dice:
// "Type safety: Unchecked cast from capture#1-of ? to T" ma grazie ai generici siamo al sicuro.
//Bisogna tenere anche conto che questo metodo è anche molto rischioso vista la lunga fila di eccezioni che possono accadere
//Va bene ?! Come sempre il punto è "Dipende dalla situazione".
public static <T> List<T> convertToList (ResultSet rs, Class<T> classOfT)
throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, SQLException{
List<T> items = new ArrayList<T>();
while(rs.next()) {
Constructor<?> cons = classOfT.getConstructor(ResultSet.class); //per funzionare ho dovuto legare ResultSet all'entità
T t = (T) cons.newInstance(rs);
items.add(t);
}
return items;
}
static class Ombrello {
private BigDecimal id = null;
private String marca = null;
private String modello = null;
//Logicamente è corrretto che la presente Entity sappia come costruirsi a partire da un ResulSet perché
//secondo il paradigma OOP la manipolazione\gestione dei dati deve appartenere all'oggetto di competenza di quei dati (L'Expert)
//Ma bisogna tenere conto anche che l'entità Ombrello è fortemente accoppiata con un'interfaccia del package java.sql
//in certe situazioni ciò potrebbe diventare svantaggioso.
//PER MITIGARE PROBLEMA POSSIAMO USARE il PATTERN MEDIATOR... CHE CONSISTE NELLO SPOSTARE QUESTO LEGAME IN UN'ALTRA CLASSE CHE FA DA MEDIATORE
//SE VUOI TI POSSO CREARE UN'ALTRO ESEMPIO
public Ombrello (ResultSet rs) throws SQLException {
this.id = rs.getBigDecimal("OMBRELLI_ID");
this.marca = rs.getString("OMBRELLI_MARCA");
this.modello = rs.getString("OMBRELLI_MODELLO");
}
public BigDecimal getId() {
return id;
}
public void setId(BigDecimal id) {
this.id = id;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModello() {
return modello;
}
public void setModello(String modello) {
this.modello = modello;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment