Olá, estou tentando criar um método que gere um INSERT INTO de acordo com a classe que for mandada por parâmetro. Estou tendo alguma dificuldades. Tentei usar introspecção, mas daí não consegui pensar numa forma de evitar as propridades que não são campos declarados na classe.
Tentei usar array de declaredfields, mas claro que não funciona, são private na classe. Não tem como (pelo menos eu não sei) usar get de cada campo por que não sei que classe está vindo - lembra, é genérico.
Eu sei que tem hibernate, dentre outros, sei que há formas melhores de aprender, mas no momento o que preciso é isso. Abaixo tem o fonte do método para facilitar o entendimento do que preciso. Lógico, ele não funciona.
public T insert(T obj) throws Exception {
String fields = "";
String params = "";
Connection c;
PreparedStatement ps;
ResultSet rs;
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
String value = "";
if (!"".equals(fields)) {
fields += ", ";
}
fields += field.getName();
if (!"".equals(params)) {
params += ", ";
}
field.get(value);
params += value.toString();
}
T X = obj.getBean();
if (((!"".equals(params))&&(params != null)) && ((!"".equals(fields))&&(fields != null))) {
String sql = "INSERT INTO " + obj.getClass().getSimpleName() + "(" + fields + ")" +
" VALUES (" + params + ")";
c = Conn.connect();
ps = c.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
Integer numColumns = rsmd.getColumnCount();
for (int i = 0; i < numColumns + 1; i++) {
String columnLabel = rsmd.getColumnLabel(i);
if (X.get(columnLabel).getClass().isAssignableFrom(rs.getObject(columnLabel).getClass())) {
X.set(columnLabel, rs.getObject(columnLabel));
}
}
}
return X;
}
Desde já, sou grato pela ajuda.
Abraço e um bom dia a todos.
Vitor Eduardo