Actualmente tengo el siguiente código que recupera datos de la base de datos y luego crea un User
. Este código se usa en muchos de mis classe para crear otros objetos como News
, Comments
etc ...constructores genéricos java
Utiliza apache commons dbutils.
final ResultSetHandler<User> handler = new ResultSetHandler<User>() {
@Override
public User handle(ResultSet rs) throws SQLException {
User user = null;
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
return user;
}
};
final User user = run.query(
"SELECT id, username, password FROM users WHERE username = ? AND active = 2 LIMIT 1;", handler,
username);
¿Sería posible envolver la QueryRunner
en una clase genérica y anular el método de consulta para el controlador de la instanciate genérica T
con el conjunto de resultados. Me aseguraría de que cualquier tipo de T
tuviera un constructor que aceptara un ResultSet
.
así:
public class QueryExecuter<T> extends QueryRunner {
private ResultSetHandler<T> _handler;
public QueryExecuter(){//The T type was for testing haha
super();
handler = new ResultSetHandler<T>() {
@Override
public T handle(ResultSet rs) throws SQLException {
T object = null;
if (rs.next()) {
object = new T(rs);
}
return object;
}
};
}
}
No sé si vas a entender, pero lo espero, me pregunta si quieres más detalles o una mejor explicación.
EDITAR
pensé que podría utilizar un AbstractClass en lugar del tipo genérico que todos los objetos diferentes haría extiende, pero parece que no puedo escribir una constructora abstracto. Voy a tener que hacer un método estático que devuelve una instancia del objeto como:
public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}
¿por qué necesita pasar 'T type' en el constructor? – yair
use reflection, puede invocar el constructor de clase con el conjunto de resultados –