J'ai essayé de trouver des informations à ce sujet mais suis venu les mains vides:des classes Création dynamique avec Java
Je crois qu'il est possible de créer une classe dynamique en Java en utilisant la réflexion ou proxies, mais je ne peux pas savoir Comment. J'implémente un cadre de base de données simple où je crée les requêtes SQL en utilisant la réflexion. La méthode obtient l'objet avec les champs de base de données en tant que paramètre et crée la requête en fonction de cela. Mais ce serait très utile si je pouvais aussi créer l'objet lui-même de façon dynamique, donc je n'aurais pas besoin d'avoir un simple objet wrapper de données pour chaque table.
Les classes dynamiques ne nécessiteraient que des champs simples (String
, Integer
, Double
), par ex.
public class Data {
public Integer id;
public String name;
}
Est-ce possible et comment est-ce que je ferais ceci?
EDIT: Voici comment j'utiliser:
/** 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;
}
Je ne pense pas que Java est l'outil idéal pour cela, Groovy serait mieux adapté l'OMI. –
Personnellement, je ne vois pas le problème d'avoir un modèle Java qui correspond à votre modèle de base de données. De même, lors de la création de requêtes SQL, veillez à utiliser PreparedStatements pour éviter l'injection SQL plutôt que de créer des chaînes SQL. – JeeBee