Récemment, en raison des besoins commerciaux dans un système de commerce électronique, je dois revenir à l'ID de produit après avoir inséré des informations sur le produit. Au début, j'ai rencontré des pièges, j'ai donc pris des notes ici pour l'empêcher d'être oubliée à l'avenir.
Obtenez la clé primaire insérée comme le code suivant
Utilisateur utilisateur = nouveau utilisateur (); user.setUsername ("Chenzhou"); user.setpassword ("xxxx"); user.SetComment ("Testez la fonction d'insertion de données pour retourner la clé primaire"); System.out.println ("La clé principale avant l'insertion est:" + user.getUserId ()); userdao.insertAndGetId (user); // insérer l'opération System.out.println ("La clé principale après l'insertion est:" + user.getUserId ());Après avoir interrogé des informations en ligne, j'ai constaté qu'il y avait environ deux façons.
Méthode 1:
Dans le fichier de mappage de la classe d'entité "* MAPPER.XML" est écrit comme ceci:
<insert id = "insertandGetId" useGeneratedKeys = "true" keyproperty = "userId" ParameterType = "com.chenzhou.mybatis.user"> Insérer dans l'utilisateur (nom d'utilisateur, mot de passe, commentaire) (# {username}, # {mot de passe}, # {comment}) </sersert>Conseils:
useGeneratedKeys = "true" signifie définir l'auto-croissance pour la clé primaire
KeyProperty = "UserId" signifie attribuer l'ID de croissance au champ UserId dans la classe d'entité.
paramètreType = "com.chenzhou.mybatis.user" Cette propriété pointe vers la classe d'entité de paramètre passée
Voici un rappel qu'il n'y a pas d'attribut ResultimeType dans <NERSERD> </SERTER>, alors ne l'ajoutez pas au hasard.
L'Uerid dans la classe d'entité doit avoir le Getter () et Setter (); méthode
Comme j'avais déjà configuré l'auto-croissance du champ lors de la construction de tables dans la base de données MySQL, j'ai finalement choisi la deuxième méthode.
La deuxième méthode:
Également dans le fichier de mappage "* mapper.xml" de la classe d'entité, mais il doit être écrit comme ceci:
<! - Insérer un produit -> <insert id = "insertproduct" ParameterType = "domain.model.productbean"> <selectKey resultType = "java.lang.long" order = "After" Keyproperty = "productid"> SELECT LAST_INST_ID () </lectKe> INSERT INTO INTER dans le T_Product (ProductName, ProductDesrcible, MerchantId) Values (# {ProductName}, # {ProductDesrcible}, # {MerchantId}); </sère>Conseils:
Il n'y a pas d'attribut ResultType dans <NERSERD> </SERTERD>, mais il y a une balise <lectRekeKe> </ECGLSEY>.
Order = "After" signifie que l'instruction INSERT est d'abord exécutée, puis l'instruction de requête est exécutée.
Peut être réglé avant ou après.
S'il est défini sur AVANT, il sélectionnera d'abord la clé primaire, définira le KeyProperty, puis exécutera l'instruction INSERT.
Si vous êtes défini sur After, exécutez d'abord l'instruction INSERT, puis l'élément SelectKey - similaire à la base de données Oracle, vous pouvez intégrer des appels de séquence dans l'instruction INSERT, comme dans Oracle Database.
KeyProperty = "UserId" signifie attribuer l'ID de croissance au champ UserId dans la classe d'entité.
SELECT LAST_INSERT_ID () signifie que l'ID d'auto-croissance de l'enregistrement qui vient d'être inséré est interrogé dans la syntaxe MySQL.
L'Uerid dans la classe d'entité doit avoir le Getter () et Setter (); méthode
Pour atteindre les exigences, ce qui précède est suffisant.
Si vous êtes intéressé ici, continuez à m'écouter sur une éventuelle erreur dans Mybatis.
Pourquoi la modification de la méthode d'addition dans MyBatis a-t-elle une valeur de retour, bien qu'elle invite que la base de données d'insertion soit réussie et que les données insérées peuvent être lues, mais lorsque vous ouvrez la base de données, vous ne pouvez pas voir les données insérées?
Si vous souhaitez insérer et retourner la clé principale lors de la mise en œuvre des exigences ci-dessus, n'oubliez pas de ne pas écrire de cette façon.
@Override public long insertproduct (ProductBean ProductBean) {// TODO Méthode générée automatique Stub SQLSession Session = MyBatisJDBCutil.Currentession (); ProductIdAo productIdao = session.getMapper (productIdao.class); // ici * .class // il doit correspondre à la couche d'interface de DAO Retour ProductIda.InsertProduct (ProductBean); }Pourquoi?
Parce que si vous écrivez comme ci-dessus, le retour de l'ID de clé primaire que vous souhaitez après l'exécution n'est pas le nombre de lignes affectées après l'exécution de l'instruction de la base de données.
De plus, après l'exécution, vous constaterez que l'invite réussit dans l'insertion, et vous pouvez également lire les données insérées avec le code, mais il y a toujours un seul enregistrement.
De plus, lorsque vous ouvrez la base de données, vous constaterez qu'aucune donnée n'a été insérée avec succès dans la base de données.
J'ai été déprimé ici pendant longtemps et j'ai finalement découvert le point clé.
La différence entre avoir une valeur de retour et ne pas avoir de valeur de retour est:
La valeur de retour est uniquement pour accéder au mode de lecture seule à la base de données, et il n'y aura pas de modification des données de la base de données, telles que diverses méthodes de requête.
S'il n'y a pas de valeur de retour, la base de données sera accessible en mode lecture et écriture, et les données de la base de données seront modifiées, telles que la suppression et l'ajout.
De plus, selon Personal Compreising, MyBatis doit d'abord le mettre en cache à une collection de type session construite lors de l'exécution de l'instruction INSERT, puis appelez le pilote sous-jacent pour fonctionner et modifier la base de données.
session.Commit (); Mybatisjdbcutil.closesession ();
Les deux instructions ci-dessus ne sont pas renvoyées, ce qui signifie que seulement après l'exécution de ces deux instructions, ils seront vraiment exécutés et insérés dans la base de données et modifieront les données dans la base de données.
Au contraire, s'il y a une valeur de retour, ces deux instructions ne sont pas exécutées, donc l'instruction d'addition n'est exécutée que dans la session construite par elle-même, mais elle n'est pas soumise à la base de données, il n'y a donc pas d'enregistrement dans la base de données.
Cela explique pourquoi après avoir modifié la méthode d'addition dans MyBatis pour avoir une valeur de retour, bien qu'elle invite que la base de données soit insérée avec succès, vous ne pouvez pas voir les données insérées lorsque vous ouvrez la base de données.
La méthode de l'insertion de l'insertion dans MyBatis ne doit pas avoir de valeur de retour, car écrire comme celui-ci est correct.
@Override public void insertProduct (ProductBean ProductBean) {// TODO Méthode générée automatique Stub SqlSession Session = MyBatisJdBcutil.Currentession (); ProductIdao ProductIdaO = Session.getMapper (productIdao.class); // ici * .class // Il doit correspondre à la couche d'interface de Dao productIda.InsertProduct (ProductBean); session.Commit (); Mybatisjdbcutil.closesession (); }Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.