MyBatis -Mapping -Eigenschaften zu Datenbankspalten beim Einfügen & Aktualisieren (mit Annotationen)

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

  •  27-10-2019
  •  | 
  •  

Frage

Ich fange gerade an, MyBatis zu lernen und frage mich, dass ich bei der Erstellung von Einfügen oder Aktualisierungsfragen eine Möglichkeit gibt, wie ich die Namensnamen etwas freundlicher machen kann, um das Refactoring zu realisieren? Ich werde ausführlicher erklären:

Ich habe Konstanten in allen meinen Domänenklassen, die verwendet werden können, um Eigenschaftsnamen zu verweisen. Meiner Meinung nach wird Tippfehler gesenkt und das Refactoring etwas einfacher.

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

Wenn ich eine myBatis -Auswahlanweisung mit Anmerkungen erstelle, kann ich so etwas tun:

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

Wenn ich mein Domain -Objekt (CustomerDetail) neu refaktor und Eigenschaftsnamen ändere, ist dies ziemlich einfach.

Wenn ich jedoch eine MyBatis -Einfügungsanweisung mit Anmerkungen erstelle, muss ich so etwas tun:

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

In diesem Fall, wenn ich mein Domain -Objekt (CustomerDetail) neu auffordere und Eigenschaftsnamen ändere, ist dies viel fehleranfälliger. Gibt es eine Möglichkeit, meine Konstanten zu verwenden, ohne auf eine Reihe von String -Verkettung zurückzugreifen? Soll ich mich überhaupt befassen?

Als totaler Neuling erwartete ich, dass die Anmerkungen @Insert und @Update die Struktur der @selektenannotation nachahmen. Beispielsweise (bitte beachten Sie, dass die folgenden keine gültigen MyBatis -Anmerkungen sind):

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

Habe ich Optionen verpasst, die den gleichen Effekt wie meine obige Stichprobe haben würden? Ist es mir alternativ möglich, MyBatis -Zuordnungen für Unit -Tests zu erhalten, um sicherzustellen, dass niemand Eigenschaftennamen verwendet, die in meinen Domänenobjekten nicht vorhanden sind? Das Testen kann eine bessere Lösung sein, da sie auch für XML -basierte Zuordnungen gelten würde. Gedanken?

War es hilfreich?

Lösung

Soll ich mich überhaupt befassen?

Ich glaube nicht. Ich verstehe Ihre Besorgnis und sehe, wie ein solches Feature für Sie von Vorteil sein kann, insbesondere in der Entwicklung, wenn sich Pojos so oft verändert.

Ich glaube nicht, dass Ihre Objektfelder genug neu gestaltet werden, um die Investition zu rechtfertigen, um diese Funktionalität bereitzustellen.

Ich schlage vor, Sie lesen über das @param -Tag in der MyBatis -Benutzerhandbuch. Es ist nicht genau das, wonach Sie hier suchen, aber es ist eine Möglichkeit, Objektfeldnamen für MyBatis SQL -Kartenvariablen zu entkoppeln. In meinen Gedanken würde ich Ihren Ansatz über die Übergabe von individuellen Feilds mit einem @Param verfolgen.

Ich bin mir ziemlich sicher, dass Sie, wenn Sie einen OGNL -Ausdruck verwenden, der keine entsprechende GET -Methode im Objekt hat, eine Ausnahme, wenn Sie einen OGNL -Ausdruck haben, der Ihre SQL -Karten nicht testen. IE, wenn Sie #{sonfield} verwenden und das Objekt, das Sie übergeben, keine Getomefield () -Methode hat, dann erhalten Sie eine Ausnahme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top