Created
May 30, 2021 09:03
-
-
Save neo7BF/ea2ddfcdc0ce35b75499370ed5a9dcc2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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