2012-08-14 6 views
6

Ich habe eine SQL in einer Mybatis Mapper-Datei geschrieben, die so etwas wie diese:Zugang public static final String in Mybatis SQL in Mapper Dateien

<select id="somesql"> 
    select a,b,c from tbl_name where d = ? 
</select> 

Der Platzhalter Wert für d sollte eine Konstante deklariert wird in eine Datei Constants.java wie genannt:

public static final String d = "d_value"; 

wie ersetze ich den Platzhalter mit dem Wert, ohne tatsächlich einen Parameter in dem <select> Konstrukt vorbei? Ich habe versucht, #{com.pkg.name.Constants.d}, aber es hat nicht funktioniert.

Keine harte Codierung !!!

Antwort

2

Mit dem Out-of-the-Box-Verhalten von MyBatis, soweit ich weiß, können Sie nicht.

Sie könnten versuchen, ein interceptor for the ParameterHandler zu schreiben und den Wert dort zu injizieren, aber dies kann nicht immer möglich sein, da man nur mit zwei Methoden, die auf den Parameter-Handler spielen kann:

  • getParameterObject die die Parameter zurückgibt, war an die Abfrage gesendet (kann eine Konstante, ein String, eine Map, ein benutzerdefiniertes Objekt oder sogar Null sein, wie es in Ihrem Beispiel der Fall ist, wenn Sie keinen Parameter senden)
  • setParameters wo ich denke, Sie könnten versuchen setze den Parameter, wenn du weißt, wo er sich auf der vorbereiteten Anweisung befindet (was meistens nicht der Fall ist).

Mein Vorschlag ist, es als Parameter an Ihre Abfrage zu übergeben. Die Interceptor-Funktionen von MyBatis sind nicht sehr gut dokumentiert, so dass Sie möglicherweise nicht von Anfang an die richtige Arbeitskombination erhalten, und Sie können mehr Ärger bekommen, als es wert ist.

3
<select id="getConvenienceStoreList" resultType ="Store"> 
    SELECT * FROM Store 
    WHERE type = ${@[email protected]_STORE} 
    ORDER BY id 
    LIMIT #{start}, #{limit} 
</select> 

Referenz: http://qiita.com/ApplePedlar/items/12dc389cc32f3db5557a

+0

Eigentlich funktioniert das !! Beachten Sie jedoch, dass der Wert "so wie er ist" eingefügt wird, kein Escaping, keine Anführungszeichen. Wenn Sie es also nicht für Zahlen verwenden, müssen Sie zumindest Anführungszeichen hinzufügen. –

+0

Tatsächlich ersetzen wir dadurch alle übergebenen Parameter in Mappern, abgesehen von der Tatsache, dass wir nicht nur STATIC FINAL-Konstanten verwenden, sondern auch einige statische Methoden direkt aufrufen können: ${@foo.product.constant.StoreType @getWhereClausule()} – kensai

Verwandte Themen