2017-05-15 3 views
2

Ich bin neu über myBatis und ich muss wo Aussage in meine Abfrage setzen.MyBatis: Dynamic wo Zustand

Mein Mapper ist auf diese Weise definiert:

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>#{whereCondition}</where> 
</select> 

My Dao:

public List<MyTalbe> findMyTableByWhereCondition(String whereCondition) { 
     Map<String, Object> param = new HashMap<String, Object>(); 
     param.put("whereCondition", "m.name = 'Test' and m.surname= 'Test'"); 
     return sqlSession.selectList("findMyTableByWhereCondition", param); 
    } 

Wenn Diese Abfrage auszuführen, i "Invalid relationalen Operator" erhalten. Was ist die beste Vorgehensweise, um diese Art von Anfragen zu bearbeiten? Ich muss es ersetzen über das "wo", denn das könnte sich zu oft ändern und es könnte sogar sehr komplex sein.

Vielen Dank im Voraus

+0

Die Variable 'param' in Ihrem Beispiel wird nicht verwendet. Was ist der 'whereCondition' String, den Sie an' sqlSession.selectList() 'übergeben? –

+0

Ich denke, Sie verwenden die API nicht korrekt. Sehen Sie sich die Beispiele in dieser Frage an: [Mehrere Argumente in ein SELECT übergeben, ohne ein komplexes Objekt zu verwenden] (http://stackoverflow.com/questions/9308210/passing-multiple-arguments-into-a-select-without- using-a-complex-object), das ein Feld/Wert pro Map-Element in der WHERE-Bedingung verwendet. –

+0

@MickMnemonic Aber ich muss alle wo ersetzen Bedingung – Skizzo

Antwort

0

Try ${...} verwenden Parameter verweisen whereCondition: verursachen

standardmäßig mit dem # {} Syntax Mybatis zu generieren:

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>${whereCondition}</where> 
</select> 

Dokument geschrieben PreparedStatement-Eigenschaften und stellen Sie die Werte sicher gegen die PreparedStatement-Parameter ein (z. B.?). Obwohl dies sicherer, schneller und fast immer bevorzugt ist, möchten Sie manchmal einfach eine unveränderte Zeichenfolge in die SQL-Anweisung einfügen. Für ORDER BY könnten Sie beispielsweise Folgendes verwenden:
ORDER BY ${columnName}
Hier wird MyBatis die Zeichenfolge nicht ändern oder die Zeichenfolge nicht ändern.

Hinweis: Verwendung $ wird SQL-Injection-Angriff verursachen, sollten Sie besser Dynamic SQL aus offiziellen doc lesen und versuchen, SQL, so zu konstruieren.