2016-11-10 3 views
0

Ich habe gesehen, Links auf die Lösung, aber am wichtigsten ist How to use Annotations with iBatis (myBatis) for an IN query? , aber auch dies bietet keine Lösung für Oracle-Treiber.Wie IN-Klausel mit Mybatis Annotation innerhalb SQL-Provider

public String getEmployees(Map<String, Object> params){ 

//Value hold by params params={empId={123,345,667,888}} 

StringBuilder sql=new StringBuilder(); 
sql.append("Select * from employee where emp_id in (#{empId}"); 

Mybatis ersetzen die Werte aus den Parametern. Aber wenn der Wert ersetzt wird, wird die Abfrage etwas darunter.

Select * from employee where emp_id in ('123,345,667,888'); 

, die eine ungültige Abfrage ist als Mybatis die einfachen Anführungszeichen in der Abfrage hinzugefügt.

Wie sollte ich dieses Problem beheben? Ich kann die Werte nicht verketten, um SQL Injection zu verhindern.

Antwort

1

Die akzeptierte Antwort in How to use Annotations with iBatis (myBatis) for an IN query? gibt eine Lösung, die für Postgres funktioniert, eine Zeichenfolgedarstellung der Liste/des Arrays wird übergeben und von der Datenbank konvertiert. Oracle unterstützt dies nicht. Die Liste muss wiederholt werden, um jeden Wert zu binden.

Meiner Meinung nach, was Sie suchen, ist Dynamic SQL, erklärt von LordOfThePigs in der nächsten Antwort. Angepasst an diesem Fall wäre:

@Select({"<script>", 
     "SELECT *", 
     "FROM employee", 
     "WHERE emp_id IN", 
      "<foreach item='emp' collection='empId'", 
      "open='(' separator=', ' close=')'>", 
      "#{emp}", 
      "</foreach>", 
     "</script>"}) 
List<Employee selectEmployees(Map<String, Object> params); 

@SelectProvider bietet in Java gebaut SQL-Zeichenfolge. Bindende Parameter werden jedoch viel mühsamer.

+0

@Auswählen (" ") In meinem Fall ist es auch Arbeit. – zhuguowei

Verwandte Themen