Mybatis propriétés cartographiques aux colonnes de base de données lors de l'insertion et la mise à jour (avec annotations)

StackOverflow https://stackoverflow.com/questions/5369884

  •  27-10-2019
  •  | 
  •  

Question

Je viens juste de commencer à apprendre mybatis et je me demande, quand je crée des requêtes d'insertion ou de mise à jour, est-il un moyen que je peux faire des noms de propriété un peu plus convivial refactoring? Je vais vous expliquer plus en détail:

J'ai constantes dans toutes mes classes de domaine qui peuvent être utilisés pour les noms de propriétés de référence. À mon avis, cela réduit les fautes de frappe et rend refactorisation un peu plus facile.

public static final String FIRST_NAME = "firstName";
private String firstName = "";

Lorsque je crée un mybatis sélectionnez instruction à l'aide d'annotations, je peux faire quelque chose comme ceci:

@Select("SELECT ID, FIRST_NAME, LAST_NAME FROM CUSTOMERS WHERE ID = #{id}")
@Results({
    @Result(property = CustomerDetail.ID, column = "ID"),
    @Result(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Result(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
CustomerDetail selectById(final int id);

Si je Refactor mon objet de domaine (CustomerDetail) et modifier leurs noms, il finit par être assez simple.

Cependant, lorsque je crée un insert mybatis instruction à l'aide des annotations, je dois faire quelque chose comme ceci:

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})")
void insertCustomerDetail(final CustomerDetail customerDetail);

Dans ce cas, si je Refactor mon objet de domaine (CustomerDetail) et modifier leurs noms, il est beaucoup plus sujette aux erreurs. Est-il possible que je peux utiliser mes constantes sans avoir recours à un groupe de concaténation de chaîne? Est-ce quelque chose que je devrais même me préoccuper?

En tant que débutant total, j'attendais les annotations @Insert et @Update pour mimer la structure de l'annotation @Select. Par exemple (s'il vous plaît noter, le ci-dessous ne sont pas valides annotations mybatis):

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME)")
@Params({
    @Param(property = CustomerDetail.ID, column = "ID"),
    @Param(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Param(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
void insertCustomerDetail(final CustomerDetail customerDetail);

Ai-je manqué toutes les options qui auraient le même effet que mon exemple ci-dessus? Sinon, est-il possible pour moi d'applications de mybatis de test unitaire pour assurer que personne n'utilise les noms de propriétés qui n'existent pas dans mes objets de domaine? Le test peut être une meilleure solution car elle applique également aux applications basées sur XML. Pensées?

Était-ce utile?

La solution

Est-ce quelque chose que je devrais même préoccupation moi-même avec?

Je ne pense pas. Je comprends votre inquiétude, et je vois comment une telle fonction pourrait être bénéfique pour vous, surtout au début du développement quand de POJO ont tendance à changer si souvent.

Je ne pense pas que vos objets champs seront assez refactorisés pour justifier les investissements nécessaires pour fournir cette fonctionnalité.

Je vous suggère de lire sur la balise @param dans la section mybatis guide utilisateur . Ce n'est pas exactement ce que vous cherchez ici, mais il est un moyen de noms de champs d'objet DECOUPLE à des variables mybatis sql carte. Dans mon esprit, je prendrais votre approche sur le passage dans feilds individuels avec un @param.

En ce qui concerne les tests unitaires vos cartes sql, je suis assez certain que si vous utilisez une expression OGNL qui ne dispose pas d'une méthode get correspondante dans l'objet que vous aurez une exception. i.e. si vous utilisez # {} somefield, et l'objet de votre passage dans ne dispose pas d'une méthode GetSomeField (), vous obtenez exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top