Parametermarken in SQL-Anweisungen

Es gibt mehrere verschiedene Marken, die Sie in SQL-Anweisungen verwenden können, um auf Parameter in Methoden zu verweisen, die für Datenbanken ausgeführt werden.

Eine SQL-Anweisung kann die Werte verwenden, die während der Ausführung an die Parameter der Methode weitergegeben werden, die die Anweisung verwendet. SQL-Anweisungen kennzeichnen diese Parameter mit Marken. Jede Marke entspricht einem Parameter in einer Methode.

Wenn eine Methode aufgerufen wird, werden die Werte für diese Parameter aus den Argumenten abgerufen, die von der aufrufenden Anwendung bereitgestellt werden, und während der Ausführung der SQL-Anweisung verwendet.

Es gibt mehrere Typen von Marken, die Sie in SQL-Anweisungen verwenden können:

?
Diese Marken entsprechen den Parametern einer Methode nach Position.
  • Werden sie in einer integrierten Methode verwendet, entspricht die nte Marke ? dem (n-1)ten Eintrag in dem Object[], das die Werte aus den Parametern Object... enthält.
  • Werden sie in einer mit Annotationen versehenen Methode verwendet, entspricht die nte Marke ? dem nten Parameter der mit Annotationen versehenen Methode.
      @Select(sql="select DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION from DEPARTMENT where DEPTNO = ?")
      Iterator<Department> getDepartment(String deptno);
      @Update(sql="insert into DEPARTMENT (DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION) values( ?, ?, ?, ?, ?)")
      int createDepartment(String deptno, String deptname, String mgrno, String admrdept, String location);
      @Update(sql="update DEPARTMENT set DEPTNO = ?, DEPTNAME = ?, MGRNO = ?, ADMRDEPT = ?, LOCATION = ? where DEPTNO = ?")
      int updateDepartment(String deptno, String deptname, String mgrno, String admrdept, String location, String deptno_K);
Wenn Sie diesen Typ von Marke verwenden, müssen alle anderen Marken in der SQL-Anweisung auch diesen Typ aufweisen.
?n
Diese Marken (wobei n ein positives ganzzahliges Literal ist) entsprechen den Parametern einer Methode nach Position.
  • Werden sie in einer integrierten Methode verwendet, entspricht ?n dem (n-1)ten Eintrag in dem Object[], das die Werte aus den Parametern Object... enthält.
  • Werden sie in einer mit Annotationen versehenen Methode verwendet, entspricht ?n dem nten Parameter der mit Annotationen versehenen Methode.
       @Select(sql="SELECT * FROM Employee WHERE salary>?1")
       Iterator<Customer> getCustomersInRegion(BigDecimal r);
Sie können dieselbe Ordinalzahlmarke mehrmals in der SQL-Anweisung verwenden.
:Name
Diese Marken sind eine Kurzversion von ?1.Name.
?n.Name
Diese Marken beziehen sich auf Methodenparameter ?n, die sich auf java.util.Map<String>-Objekte oder -Beans beziehen müssen. Name muss auf eine Eigenschaft in einem Objekt java.util.Map<String> oder in einer Bean verweisen.
Wenn der angegebene Parameter java.util.Map<String> ist, hängen die von pureQuery aufgerufenen Methoden von der Verwendung des Parameters ab:
  • Eingabeparameter: pureQuery ruft die Map-Methode Object get(String) auf, um den Wert zur Übergabe an die SQL-Anweisung anzufordern. Der Wert von String im Aufruf der Methode get() ist der Name, der ?n folgt.
  • Ausgabeparameter: pureQuery ruft die Map-Methode Object put(String, Object) auf, um den Wert zurückzugeben, der dem benannten Schlüssel zugeordnet ist. Der Wert des Schlüssels String im Aufruf von put() ist der Name, der ?n folgt.
  • Ein- und Ausgabeparameter: Vor der Ausführung der SQL-Anweisung ruft pureQuery die Map-Methode Object get(String) auf. Nach der Ausführung der SQL-Anweisung ruft pureQuery die Map-Methode Object put(String, Object) auf.

Da die als Schlüssel verwendeten Zeichenfolgen alle aus den Namen in Parametermarken stammen (mit Präfix : oder ?n), wird der Name als Java-Quellenkennung eingestuft und in seiner ursprünglichen Groß-/Kleinschreibung an get() sowie Mutationsmethoden übergeben.

Wenn der angegebene Parameter eine Bean ist, ist der Auflösungsprozess komplexer.
  • Wenn ein Parameter als Eingabeparameter verwendet wird, führt pureQuery den folgenden Prozess aus:
    1. Die Bean-Schnittstelle wird auf eine allgemein zugängliche Methode getXXX() geprüft, wobei der Teil XXX der Kennung aus dem Namen generiert wird, der ?n folgt, nachdem das erste Zeichen dieses Namens in Großbuchstaben umgesetzt wurde. Wenn eine solche Methode vorhanden ist, wird sie zum Anfordern des Werts für Übergabe an die SQL-Anweisung verwendet.
    2. Wird keine Methode getXXX() gefunden, wird die Bean auf eine allgemein zugängliche Eigenschaft geprüft, deren Name mit dem Namen übereinstimmt, der ?n folgt. Wenn eine solche Eigenschaft vorhanden ist, wird direkt auf sie zugegriffen, um den Wert zur Übergabe an die SQL-Anweisung anzufordern.
    3. Wenn keine allgemein zugängliche Eigenschaft gefunden wird, wird die Bean-Schnittstelle auf eine allgemein zugängliche Methode Object get(String) geprüft. Wenn eine solche Methode vorhanden ist, wird sie zum Anfordern des Werts für Übergabe an die SQL-Anweisung verwendet. Dabei ist der für den Parameter String übergebene Wert der Name, der ?n folgt.
    4. Wenn keine Methode get(String) gefunden wird, wird ein Fehler zurückgemeldet.
  • Wenn ein Parameter als Ausgabeparameter verwendet wird, führt pureQuery den folgenden Prozess aus:
    1. Die Bean-Schnittstelle wird auf eine allgemein zugängliche Methode setXXX() geprüft, wobei der Teil XXX der Kennung aus dem Namen generiert wird, der ?n folgt, nachdem das erste Zeichen dieses Namens in Großbuchstaben umgesetzt wurde. Wenn eine solche Methode vorhanden ist, wird sie zum Aktualisieren der zugeordneten Eigenschaft des Bean-Parameters verwendet.
    2. Wird keine Methode setXXX() gefunden, wird die Bean auf eine allgemein zugängliche Eigenschaft geprüft, deren Name mit dem Namen übereinstimmt, der ?n folgt. Wenn eine solche Eigenschaft vorhanden ist, wird sie direkt modifiziert, um die zugeordnete Eigenschaft der Bean zu aktualisieren.
    3. Wenn keine allgemein zugängliche Eigenschaft gefunden wird, wird die Bean-Schnittstelle auf eine allgemein zugängliche Methode void set(String, Object) geprüft. Wenn eine solche Methode vorhanden ist, wird sie zum Aktualisieren der zugeordneten Eigenschaft der Bean verwendet. Dabei ist der für den Parameter String übergebene Wert der Name, der ?n folgt.
    4. Wenn keine Methode set(String, Object) gefunden wird, wird ein Fehler zurückgemeldet.
  • Wenn ein Parameter als Eingabe- und Ausgabeparameter verwendet wird, wird der oben beschriebene Parameterauflösungsprozess für die Eingabe vor der Ausführung der SQL-Anweisung ausgeführt, und der oben beschriebene Prozess für die Ausgabe wird nach der Ausführung der SQL-Anweisung ausgeführt.

Da die als Schlüssel verwendeten Zeichenfolgen alle aus den Namen in Parametermarken stammen (mit Präfix : oder ?n), wird der Name als Java-Quellenkennung eingestuft und in seiner ursprünglichen Groß-/Kleinschreibung an die Methoden get(String) und set(String) übergeben.

Maps und Beans werden nicht nur als Quelle von Parametern verwendet, sondern können auch aus Zeilen erstellt werden, die durch eine Abfrage ausgewählt werden. Wenn pureQuery Maps oder Beans aus Zeilen erstellt, sind die Zeichenfolgewerte, die für die Schlüssel in den Methoden get(String), set(String, Object) und put(String, Object) verwendet werden, klein geschriebene SQL-Quellenkennungen (aus den Beschriftungen ausgewählter Spalten). Wenn Sie die optionalen Methoden get(String) oder set(String, Object) einer Bean bzw. die Map-Methoden get(String) und put(String, Object) implementieren oder verwenden, müssen Sie die Groß-/Kleinschreibung der als Schlüssel verwendeten Kennungen beachten.


Feedback