Marqueurs de paramètres pour les instructions SQL

Vous pouvez utiliser différents marqueurs dans les instructions SQL pour faire référence aux paramètres dans les méthodes exécutées dans les bases de données.

Une instruction SQL peut utiliser les valeurs transmises lors de l'exécution aux paramètres de la méthode qui utilise l'instruction. Les instructions SQL signalent ces paramètres avec les marqueurs. Chaque marqueur correspond à un paramètre dans une méthode.

Lorsqu'une méthode est invoquée, les valeurs de ces paramètres sont obtenues à partir des arguments fournis par l'application d'invocation et utilisés pendant l'exécution de l'instruction SQL.

Vous pouvez utiliser différents types de marqueur dans les instructions SQL :

?
Ces marqueurs correspondent aux paramètres d'une méthode par position.
  • Lorsqu'il est utilisé dans une méthode intégrée, le marqueur nth ? correspond à l'entrée (n-1)th dans l'objet Object[ ] qui contient les valeurs des paramètres Object....
  • Lorsqu'il est utilisé dans une méthode annotée, le nième ? correspond au paramètre nth de la méthode annotée.
      @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);
Si vous utilisez ce type de marqueur, tous les autres marqueurs de l'instruction SQL doivent être de ce type.
?n
Ces marqueurs, dans lesquels n représente un littéral entier positif, correspondent aux paramètres d'une méthode par position.
  • Lorsqu'il est utilisé dans une méthode intégrée, ?n correspond à l'entrée (n-1)th de l'Object[ ] qui contient les valeurs des paramètres Object....
  • Lorsqu'il est utilisé dans une méthode annotée, ?n correspond au paramètre n de la méthode annotée.
       @Select(sql="SELECT * FROM Employee WHERE salary>?1")
       Iterator<Customer> getCustomersInRegion(BigDecimal r);
Vous pouvez utiliser le même marqueur ordinal plusieurs fois dans l'instruction SQL.
:nom
Ces marqueurs sont une version raccourcie de ?1.nom.
?n.nom
Ces marqueurs se réfèrent aux paramètres de méthode ?n, qui doivent se référer aux objets ou aux beans java.util.Map<String>. nom doit se référer à une propriété dans un objet ou un bean java.util.Map<String>.
Si le paramètre identifié est java.util.Map<String>, les méthodes invoquées par pureQuery dépendent du mode d'utilisation du paramètre :
  • Paramètre d'entrée : pureQuery invoque la méthode Object get(String) de Map pour acquérir la valeur à transmettre à l'instruction SQL. La valeur de String dans l'appel à la méthode get() est le nom qui suit ?n.
  • Paramètre de sortie : pureQuery invoque la méthode Object put(String, Object) de Map pour retourner la valeur associée à la clé nommée. La valeur de la clé String dans l'appel à put() est le nom qui suit ?n.
  • Paramètre d'entrée et paramètre de sortie : avant l'exécution de l'instruction SQL, pureQuery invoque la méthode Object get(String) de Map. Après l'exécution de l'instruction SQL, pureQuery invoque la méthode Object put(String, Object) de Map.

Etant donné que les éléments Strings qui sont utilisés comme clés proviennent tous des noms figurant dans les marqueurs de paramètre (avec ou sans or ?n comme préfixe), le nom est considéré comme un identificateur de source Java et est transmis aux méthodes get() et mutator dans sa casse d'origine.

Si le paramètre identifié est un bean, le processus de résolution est plus complexe.
  • Si un paramètre est utilisé comme paramètre d'entrée, pureQuery procède comme suit :
    1. L'interface de bean est examinée pour une méthode getXXX() publique où la partie XXX de l'identificateur est générée à partir du nom qui suit ?n après avoir inscrit en majuscule le premier caractère de ce nom. Si ce genre de méthode existe, elle est utilisée pour acquérir la valeur à transmettre à l'instruction SQL.
    2. Si aucune méthode getXXX() n'est disponible, le bean est examiné pour une propriété publique dont le nom correspond au nom qui suit ?n. Si ce genre de propriété existe, vous y accédez directement pour acquérir la valeur à transmettre à l'instruction SQL.
    3. Si aucune propriété publique n'est disponible, l'interface de bean est examinée pour une méthode Object get(String) publique. Si ce genre de méthode existe, elle est utilisée pour acquérir la valeur à transmettre à l'instruction SQL, où la valeur transmise pour le paramètre String est le nom qui suit ?n.
    4. Si aucune méthode get(String) n'est disponible, un rapport d'erreur est généré.
  • Si un paramètre est utilisé comme paramètre de sortie, pureQuery procède comme suit :
    1. L'interface de bean est examinée pour une méthode setXXX() publique où la partie XXX de l'identificateur est générée à partir du nom qui suit ?n après avoir inscrit en majuscule le premier caractère de ce nom. Si ce genre de méthode existe, elle est utilisée pour mettre à jour la propriété associée du paramètre de bean.
    2. Si aucune méthode setXXX() n'est disponible, le bean est examiné pour une propriété publique dont le nom correspond au nom qui suit ?n. Si ce genre de propriété existe, elle est modifiée directement pour mettre à jour la propriété associée du bean.
    3. Si aucune propriété publique n'est disponible, l'interface de bean est examinée pour une méthode void set(String, Object) publique. Si ce genre de méthode existe, elle est utilisée pour mettre à jour la propriété associée du bean, où la valeur transmise pour le paramètre String est le nom qui suit ?n.
    4. Si aucune méthode set(String, Object) n'est disponible, un rapport d'erreur est généré.
  • Si un paramètre est utilisé à la fois comme paramètre d'entrée et comme paramètre de sortie, le processus de résolution du paramètre décrit ci-dessus pour l'entrée est exécuté avant l'exécution de l'instruction SQL et le processus décrit ci-dessus pour la sortie est exécuté après l'exécution de l'instruction SQL.

Ici encore, étant donné que les éléments Strings qui sont utilisés comme clés proviennent tous des noms des marqueurs de paramètre (avec ou sans or ?n comme préfixe), le nom est considéré comme un identificateur de source Java et est transmis aux méthodes get(String) et set(String) dans sa casse d'origine.

Les mappes et les beans ne sont pas utilisés seulement comme sources de paramètres, mais peuvent aussi être construits à partir de lignes sélectionnées par une requête. Lorsque pureQuery construit des mappes ou des beans à partir de lignes, les valeurs de chaîne utilisées pour les légendes dans les méthodes get(String), set(String, Object) et put(String, Object) sont des identifiants de source SQL (extraits des étiquettes de certaines colonnes) et apparaissent en minuscules. Si vous implémentez ou utilisez les méthodes get(String) ou set(String, Object) facultatives d'un bean ou les méthodes get(String) et put(String, Object) d'une mappe, vous devez tenir compte de la casse des identificateurs utilisés comme clés.


Commentaires