Mybatis Mapping Properties alle colonne del database durante l'inserimento e l'aggiornamento (utilizzando le annotazioni)

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

  •  27-10-2019
  •  | 
  •  

Domanda

Sto appena iniziando a imparare Mybatis e mi chiedo, quando creo domande di inserto o aggiornamento, c'è un modo per rendere i nomi delle proprietà un po 'più amichevoli al refactoring? Spiegherò in modo più dettagliato:

Ho costanti in tutte le mie classi di dominio che possono essere utilizzate per fare riferimento ai nomi delle proprietà. Secondo me, riduce gli errori di battitura e rende un po 'più facile il refactoring.

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

Quando creo un'istruzione Mybatis Select usando le annotazioni, posso fare qualcosa del genere:

@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);

Se faccio rifacimento del mio oggetto di dominio (CustomerDetail) e cambio i nomi delle proprietà, finisce per essere abbastanza semplice.

Tuttavia, quando creo un'istruzione Mybatis Insert usando le annotazioni, devo fare qualcosa del genere:

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

In questo caso, se refactor il mio oggetto di dominio (CustomerDetail) e cambio i nomi delle proprietà, è molto più soggetto a errori. C'è un modo per usare le mie costanti senza ricorrere a un mucchio di concatenazione delle corde? È qualcosa con cui dovrei persino preoccuparmi?

Come principiante totale, mi aspettavo che le annotazioni @Insert e @Update imitano la struttura dell'annotazione @select. Ad esempio (Nota, i seguenti non sono annotazioni mybatis valide):

@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);

Ho perso qualche opzione che avrebbe lo stesso effetto del mio campione sopra? In alternativa, è possibile per me testare le mappature mybatis per garantire che nessuno stia usando i nomi delle proprietà che non esistono nei miei oggetti di dominio? I test possono essere una soluzione migliore poiché si applicherebbe anche alle mappature a base di XML. Pensieri?

È stato utile?

Soluzione

È qualcosa con cui dovrei persino preoccuparmi?

Non credo. Capisco la tua preoccupazione e vedo come una tale caratteristica possa essere vantaggiosa per te, specialmente all'inizio dello sviluppo quando Pojo tende a cambiare così spesso.

Non credo che i tuoi campi di oggetti verranno refactorti abbastanza da giustificare l'investimento necessario per fornire questa funzionalità.

Ti suggerisco di leggere il tag @param in Guida per l'utente di Mybatis. Non è esattamente quello che stai cercando qui, ma è un modo per disaccoppiarsi i nomi dei campi di oggetti alle variabili Mybatis SQL Map. Nella mia mente, prenderei il tuo approccio oltre passando in singoli feildi con un @param.

Per quanto riguarda il test unitario delle tue mappe SQL, sono abbastanza certo che se usi un'espressione OGNL che non ha un metodo GET corrispondente nell'oggetto otterrai eccezioni. cioè se usi #{somefield} e l'oggetto che passa non ha un metodo getomefield (), allora ottieni eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top