В настоящее время у меня есть следующий код, который получает данные из базы данных и затем создает User
. Этот код используется во многих моих классах для создания других объектов, таких как News
, Comments
и т.д ...
Использует 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);
Можно ли обернуть QueryRunner
в универсальный класс и переопределить метод запроса, чтобы обработчик создал обобщенный T
с ResultSet. Я хотел бы убедиться, что любой тип T
будет иметь конструктор, принимающий ResultSet
.
Вот так:
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;
}
};
}
}
Я не знаю, поймете ли вы, но я надеюсь, спросите меня, хотите ли вы больше подробностей или лучшего объяснения.
EDIT
Я думал, что мог бы использовать AbstractClass вместо универсального типа, который расширяет все объекты различий, но кажется, что я не могу написать абстрактный конструктор. Придется ли мне создавать статический метод, который будет возвращать экземпляр объекта, например:
public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}