He tratado de encontrar información sobre esto, pero he venido con las manos vacías:clases creación dinámica con Java
tengo entendido que es posible crear una clase dinámica en Java utilizando la reflexión o proxies, pero no puedo averiguar cómo. Estoy implementando un marco de base de datos simple donde creo las consultas SQL usando reflexión. El método obtiene el objeto con los campos de la base de datos como un parámetro y crea la consulta en función de eso. Pero sería muy útil si también pudiera crear el objeto mismo dinámicamente para no tener la necesidad de tener un objeto contenedor de datos simple para cada tabla.
Las clases dinámicas solo necesitarían campos simples (String
, Integer
, Double
), p.
public class Data {
public Integer id;
public String name;
}
¿Es esto posible y cómo podría hacerlo?
EDIT: Esta es la forma en que yo usaría esto:
/** Creates an SQL query for updating a row's values in the database.
*
* @param entity Table name.
* @param toUpdate Fields and values to update. All of the fields will be
* updated, so each field must have a meaningful value!
* @param idFields Fields used to identify the row(s).
* @param ids Id values for id fields. Values must be in the same order as
* the fields.
* @return
*/
@Override
public String updateItem(String entity, Object toUpdate, String[] idFields,
String[] ids) {
StringBuilder sb = new StringBuilder();
sb.append("UPDATE ");
sb.append(entity);
sb.append("SET ");
for (Field f: toUpdate.getClass().getDeclaredFields()) {
String fieldName = f.getName();
String value = new String();
sb.append(fieldName);
sb.append("=");
sb.append(formatValue(f));
sb.append(",");
}
/* Remove last comma */
sb.deleteCharAt(sb.toString().length()-1);
/* Add where clause */
sb.append(createWhereClause(idFields, ids));
return sb.toString();
}
/** Formats a value for an sql query.
*
* This function assumes that the field type is equivalent to the field
* in the database. In practice this means that this field support two
* types of fields: string (varchar) and numeric.
*
* A string type field will be escaped with single parenthesis (') because
* SQL databases expect that. Numbers are returned as-is.
*
* If the field is null, a string containing "NULL" is returned instead.
*
* @param f The field where the value is.
* @return Formatted value.
*/
String formatValue(Field f) {
String retval = null;
String type = f.getClass().getName();
if (type.equals("String")) {
try {
String value = (String)f.get(f);
if (value != null) {
retval = "'" + value + "'";
} else {
retval = "NULL";
}
} catch (Exception e) {
System.err.println("No such field: " + e.getMessage());
}
} else if (type.equals("Integer")) {
try {
Integer value = (Integer)f.get(f);
if (value != null) {
retval = String.valueOf(value);
} else {
retval = "NULL";
}
} catch (Exception e) {
System.err.println("No such field: " + e.getMessage());
}
} else {
try {
String value = (String) f.get(f);
if (value != null) {
retval = value;
} else {
retval = "NULL";
}
} catch (Exception e) {
System.err.println("No such field: " + e.getMessage());
}
}
return retval;
}
No creo que Java es la herramienta adecuada para que, maravilloso sería más adecuado de la OMI. –
Personalmente, no veo el problema de tener un modelo de Java que se corresponda con su modelo de base de datos. Además, al crear consultas SQL, asegúrese de utilizar PreparedStatements para evitar la inyección SQL, en lugar de crear cadenas SQL. – JeeBee