Sto appena iniziando un mio nuovo progetto per piccoli animali domestici. Ho iniziato il progetto utilizzando un modello familiare per utilizzare gli oggetti come "filtri" nelle query SQL. Non sono mai stato molto contento della sua facilità d'uso, ma alla fine l'ho più o meno accettato dopo averlo trapanato nella mia testa dai colleghi.
L'esempio che segue evidenzia con speranza la mia preoccupazione. Soprattutto per quanto riguarda le dimensioni. Tuttavia, detto questo, vedo anche i punti di forza di questo modello che potrebbero metterlo a favore dell'uso continuato.
Sto cercando alcune opinioni se dovessi continuare come ho sempre o se c'è davvero un modo più semplice per farlo. O utilizzando un modello diverso o in qualche modo "automatizza" il processo.
Tieni presente che il seguente è solo un esempio e non è in uso.
public static User getUser(User filter) throws UserControllerException {
String sql, sqlFilter = "";
User user = null;
try {
Connection con = DataSource.getInstance().getConnection();
if (filter.getCorp() != null) sqlFilter += " AND corp_id = ?";
if (!filter.isNew()) sqlFilter += " AND user_id = ?";
if (filter.getUsername() != null) sqlFilter += " AND username = ?";
if (filter.getPasswordHash() != null) sqlFilter += " AND password_hash = ?";
if (filter.getFirstName() != null) sqlFilter += " AND first_name = ?";
if (filter.getLastName() != null) sqlFilter += " AND last_name = ?";
if (filter.getPhoneNumber() > 0) sqlFilter += " AND phone_number = ?";
sql = "SELECT * FROM users WHERE 1 = 1 " + sqlFilter;
PreparedStatement ps = con.prepareStatement(sql);
int psPos = 0;
if (filter.getCorp() != null) ps.setLong(++psPos, filter.getCorp().getCorpId());;
if (!filter.isNew()) ps.setLong(++psPos, filter.getUserId());
if (filter.getUsername() != null) ps.setString(++psPos, filter.getUsername());
if (filter.getPasswordHash() != null) ps.setString(++psPos, filter.getPasswordHash());
if (filter.getFirstName() != null) ps.setString(++psPos, filter.getFirstName());
if (filter.getLastName() != null) ps.setString(++psPos, filter.getLastName());
if (filter.getPhoneNumber() > 0) ps.setLong(++psPos, filter.getPhoneNumber());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
user = new User(
rs.getLong("user_id"),
new Corporation(rs.getLong("corp_id"), null),
rs.getString("username"),
rs.getString("password_hash"),
rs.getString("first_name"),
rs.getString("last_name"),
rs.getLong("phone_number")
);
}
} catch (IOException e) {
throw new UserControllerException(e.getMessage(), e);
} catch (SQLException e) {
throw new UserControllerException(e.getMessage(), e);
}
return user;
}