2014-09-10 4 views
0

Je suis en train de créer un outil de données permettant aux utilisateurs de créer du code ETL. Avant d'en arriver là, j'ai besoin de construire un 'agent' qui s'occupera de tous les travaux liés à la base de données que l'outil devra effectuer. Plus précisément, cela impliquerait -Guide sur la conception de classes Java

  • Sélection, l'insertion, la mise à jour et la suppression
  • plusieurs enregistrements
  • de/vers/dans différentes tables avec des mises en page différentes

Ma pensée est de construire un classe avec les 4 méthodes suivantes -

ArrayList[][] selectFromRepository (String dbTable, String[] columnNames) 
ArrayList[][] selectFromRepository (String dbTable, String[] columnNames, Map<String, Object> predicate) 
void   insertToRepository (String dbTable, Map<String, Object>[] payload) 
void   updateInRepository (String dbTable, Map<String, Object>[] payload, Map<String,Object>[] predicate) 
void   deleteFromRepository (String dbTable, Map<String, Object>[] payload) 

selectFromRepository répondra avec une 2D liste des éléments hétérogènes basée sur les types des éléments dans "columnNames" récupérés de l'argument "dbTable". La version surchargée permet de spécifier un prédicat de clause where via une carte "prédicat". Je pensais que je pouvais vérifier le type de l'élément objet de la carte transmis à la méthode et construire la clause where correctement (par exemple

"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String 

et ainsi de suite ..

D'autres méthodes fonctionneront avec des méthodes de mise à jour prédicat travaillant similaire à celui de la sélection surchargée

Je suis à la recherche de vos conseils sur les meilleures pratiques, les inconvénients de mon idée (et donc les avantages de vous faire à votre façon :)). Aussi, serait-il logique de construire un type DB appelé élément DB qui accepte tous les types de données DB connus avec lesquels je pense travailler en tant qu'entrée de type, puis l'utiliser à la place du type "Object" dans les arguments map/arraylist?

Merci d'avance!

+0

JDBC est implémenté, il implémente la plupart des fonctionnalités que vous recherchez. –

Répondre

3

Eh bien c'est tout à fait la question.

Tout d'abord, je ne l'implémenterais pas moi-même. il ya un certain nombre de bibliothèques libres là-bas (Spring, Hibernate) qui le font pour vous, et beaucoup mieux sous la forme d'un ORM (http://en.wikipedia.org/wiki/Object-relational_mapping).

Si vous ne voulez le faire vous-même comment je ferais ceci:

je suivrais l'ADO et créer une classe pour chaque table que j'ai. Par exemple, je ferais la classe Employé pour la table de mes employés.

Je voudrais créer un générateur de requête comme celle-ci:

QueryBuilder 
    .selectFrom(Employee.class) 
    .equalTo(propery, value) 
    .graterThenOrEqualTo(property, value); 

mes propriétés ressembleraient si:

interface Property<From, To>{ 
    To get(From from); 
} 

donc par exemple:

class EmployeeToId<Employee, Integer>{ 
    public Integer get(Employee emp){ 
     return emp.id; 
    } 
} 

Donc, dans mon exemple précédent:

QueryBuilder 
    .selectFrom(Employee.class) 
    .equalTo(new EmployeeToId(), 15) 
    .build().fetch(); // This returns an Optional<Collection<Employee>>; 

Mon générateur de requêtes aurait un nombre de méthodes telles que:

class QueryBuilder{ 
    public <Entity> SelectBuilder<Entity> selectFrom(Class<Entity> clazz); 
} 

Ceci est juste le jist de celui-ci. Vous pouvez le rendre aussi complexe que vous le souhaitez. Mais pour le faire bien, cela prendra beaucoup de temps, il suffit de demander hibernate ou jooq.

Questions connexes