2010-11-26 26 views
9
  • See this related question pour Postgres. Pour une raison quelconque, la solution ne fonctionne pas pour moi - la valeur de retour de l'instruction d'insertion est toujours "1".
  • Voir cette autre question pour un XML based solution. Je voudrais faire la même chose sans XML - insérer un enregistrement et trouver le nouvel identifiant généré automatiquement de l'enregistrement que je viens d'inserer.

Je n'ai pas trouvé une annotation correspondant à <selectkey> (voir cette open issue) Comment puis-je procéder?Comment retourner des ID sur des insertions avec mybatis dans mysql avec des annotations

L'examen du code mybatis révèle que INSERT est implémenté via UPDATE et renvoie toujours le nombre de lignes insérées! Donc ... à moins que je manque complètement quelque chose ici, il n'y a aucun moyen de le faire en utilisant l'implémentation actuelle (3.0.3).

Répondre

12

Les instructions <insert>, <update> et <delete> renvoient le nombre de lignes affectées, comme c'est souvent le cas avec les API de base de données.

Si un nouvel ID est généré pour la ligne insérée, il est reflété dans l'objet que vous avez passé en paramètre. Par exemple, si vous appelez mapper.insert (someObject) à l'intérieur de votre méthode d'insertion annotée, après l'insertion, vous pouvez appeler someObject.getId (ou similaire) pour le récupérer. En utilisant les options <insert>, vous pouvez modifier comment (en fournissant une instruction SQL) et quand (avant ou après l'insertion réelle) l'identifiant est généré ou récupéré, et où dans l'objet il est placé.

Il peut être instructif d'utiliser le MyBatis generator pour générer des classes à partir d'un schéma de base de données et de voir comment les insertions et les mises à jour sont gérées. Plus précisément, le générateur produit des classes "exemples" qui sont utilisées comme conteneurs temporaires pour transmettre des données.

1

vous pouvez obtenir vos identifiants générés à partir de sauvegarde des méthodes, permet de dire un haricot avec des propriétés d'identité et le nom,

bean.setName("xxx"); 
mapper.save(bean); 
// here is your id 
logger.debug(bean.getID); 
+0

En supposant que vous utilisiez l'annotation pour select et avec '@Options (useGeneratedKeys = true)' – Lucky

20

En fait, il est possible de le faire, avec l'annotation @Options (à condition que vous utilisez auto_increment ou quelque chose de similaire dans votre base de données):

@Insert("insert into table3 (id, name) values(null, #{name})") 
@Options(useGeneratedKeys=true, keyProperty="idName") 
int insertTable3(SomeBean myBean); 

Notez que la partie n'est pas nécessaire si la propriété clé SomeBean est nommé « id ». Un attribut keyColumn est également disponible, dans les rares cas où MyBatis ne trouve pas la colonne de clé primaire par lui-même. S'il vous plaît noter également qu'en utilisant @Options, vous soumettez votre méthode à certains paramètres par défaut; il est important de consulter le doc (lien ci-dessous - page 60 dans la version actuelle)!

(ancienne réponse) La (très récente) annotation @SelectKey peut être utilisé pour la récupération clés plus complexes (séquences, fonction identité() ...).Voici ce que les MyBatis 3 User Guide (pdf) propose à titre d'exemple:

Cet exemple montre en utilisant l'annotation @SelectKey pour récupérer une valeur à partir d'une séquence avant une insert:

@Insert("insert into table3 (id, name) values(#{nameId}, #{name})") 
@SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) 
int insertTable3(Name name); 

Cet exemple affiche en utilisant l'annotation @SelectKey pour récupérer une valeur d'identité après une insertion:

@Insert("insert into table2 (name) values(#{name})") 
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
int insertTable2(Name name);