Kürzlich muss ich aufgrund der geschäftlichen Anforderungen in einem E-Commerce-System nach dem Einfügen einer Produktinformation zur Produkt-ID zurückkehren. Am Anfang habe ich einige Fallstricke begegnet, also machte ich mir hier Notizen, um zu verhindern, dass es in Zukunft vergessen wurde.
Holen Sie sich den eingefügten Primärschlüssel wie den folgenden Code
User user = new user (); user.setUserName ("Chenzhou"); user.setPassword ("xxxx"); user.setCompment ("Testen Sie die Funktion des Einfügens von Daten, um den Primärschlüssel zurückzugeben"); System.out.println ("Der Hauptschlüssel vor dem Einfügen lautet:"+user.getUerId ()); userDao.insertandgetId (Benutzer); // Betriebssystem einfügen.out.println ("Der Hauptschlüssel nach dem Einfügen lautet:"+user.getUerId ());Nachdem ich Online -Informationen abfragt hatte, stellte ich fest, dass es ungefähr zwei Möglichkeiten gibt.
Methode 1:
In der Zuordnungsdatei der Entity -Klasse "*mapper.xml" ist wie folgt geschrieben:
<insert id = "insertandgetId" useGeneratedKeys = "true" keyProperty = "userId" parameterType = "com.chenzhou.mybatis.user"> in den Benutzer einfügen (Benutzername, Passwort, Kommentar) Werte (#{Benutzername},#{Passwort},#{comment}) </> </> </>Tipps:
UseGeneratedKeys = "True" bedeutet, das Selbstwachstum für den Primärschlüssel festzulegen
KeyProperty = "UserId" bedeutet, die Wachstums -ID dem Benutzer -ID -Feld in der Entitätsklasse zuzuweisen.
parameterType = "com.chenzhou.mybatis.user" Diese Eigenschaft zeigt auf die bestandene Parameterentitätsklasse
Hier ist eine Erinnerung daran, dass es in <Styps kein Ergebnistyp -Attribut gibt. Fügen Sie es also nicht zufällig hinzu.
Die Uerid in der Entitätsklasse muss den Getter () und Setter () haben; Verfahren
Da ich das Feld selbst beim Erstellen von Tabellen in der MySQL-Datenbank bereits eingerichtet hatte, habe ich schließlich die zweite Methode gewählt.
Die zweite Methode:
Auch in der Zuordnungsdatei "*mapper.xml" der Entitätsklasse, aber sie sollte so geschrieben werden:
<!-ein Produkt einfügen-> <id = "InsertProduct" parameterType = "domain.model.ProductBean"> <selectKey resultType = "java.lang.long" order = "nach" keyproperty = "productId"> last_insert_id () </selectKey> Insert in In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-In-in-In-In-In-in-In-in-in-type-. T_Product (ProductName, ProductDesRcible, MerchantID) Werte (#{productName},#{productDesRcible},#{merchantid}); </einfügen>Tipps:
Es gibt kein Ergebnistyp -Attribut in <Berein> </insert>, aber es gibt ein <SelectKey> </selectKey> Tag.
Order = "After" bedeutet, dass die Einfügeanweisung zuerst ausgeführt wird und dann die Abfrageanweisung ausgeführt wird.
Kann vor oder nach dem Einsatz gesetzt werden.
Wenn Sie zuvor festgelegt sind, wird zunächst die Primärschlüssel ausgewählt, die Schlüsselproperschaft festgelegt und dann die Anweisung Einfügen ausführen.
Wenn Sie nach After festgelegt sind, führen Sie zuerst die Anweisung Insert und dann das SelectKey -Element aus - ähnlich wie in der Oracle -Datenbank, wie in der Oracle -Datenbank Sequenzaufrufe in die Einfügenanweisung einbetten.
KeyProperty = "UserId" bedeutet, die Wachstums -ID dem Benutzer -ID -Feld in der Entitätsklasse zuzuweisen.
Wählen Sie last_insert_id () aus, dass die selbstwachsende ID des gerade eingefügten Datensatzes in die MySQL-Syntax abgefragt wird.
Die Uerid in der Entitätsklasse muss den Getter () und Setter () haben; Verfahren
Um die Anforderungen zu erfüllen, reichen die oben genannten aus.
Wenn Sie hier interessiert sind, hören Sie mir bitte weiter zu einem möglichen Fehler in MyBatis.
Warum hat die Änderung der Additionsmethode in MyBatis einen Rückgabewert, obwohl die Einfügungsdatenbank erfolgreich ist und die eingefügten Daten gelesen werden können. Wenn Sie jedoch die Datenbank öffnen, können Sie die eingefügten Daten nicht sehen?
Wenn Sie bei der Implementierung der oben genannten Anforderungen den Primärschlüssel einfügen und zurückgeben möchten, denken Sie daran, nicht so zu schreiben.
@Override public Long InsertProduct (ProductBean ProductBean) {// Todo automatisch generierte Methode Stub SQLSession Session = myBatisjdbcutil.currentSession (); ProductIdao productIdao = session.getMapper (productIdao.class); // hier *.class // Es muss der Grenzflächenschicht von DAO Return Productidao.insertProduct (ProductBean) entsprechen; }Warum?
Denn wenn Sie wie oben schreiben, ist die Rückgabe der gewünschten primären Schlüssel -ID nach der Ausführung nicht die Anzahl der betroffenen Zeilen, die nach der Ausführung der Datenbankanweisung betroffen sind.
Nach der Ausführung werden Sie feststellen, dass die Eingabeaufforderung erfolgreich im Einfügen ist, und Sie können die eingefügten Daten auch mit dem Code lesen, aber es gibt immer nur einen Datensatz.
Wenn Sie die Datenbank öffnen, werden Sie außerdem feststellen, dass in der Datenbank keine Daten erfolgreich eingefügt wurden.
Ich war hier für lange Zeit deprimiert und entdeckte schließlich den entscheidenden Punkt.
Der Unterschied zwischen einem Rückgabewert und dem Nicht -Rückgabewert beträgt:
Der Rückgabewert besteht nur darin, auf den schreibgeschützten Datenbank-Modus zuzugreifen, und es wird keine Änderung der Datenbankdaten wie verschiedenen Abfragemethoden geändert.
Wenn es keinen Rückgabewert gibt, wird die Datenbank im Les- und Schreibmodus zugegriffen, und die Daten in der Datenbank werden geändert, z. B. Löschen und Addition.
Darüber hinaus sollte MyBatis nach persönlichem Verständnis bei der Ausführung der Einfügenanweisung zuerst in eine konstruierte Sitzungs-ähnliche Sammlung zwischenspeichern und dann den zugrunde liegenden Treiber aufrufen, um die Datenbank zu bedienen und zu ändern.
Session.Commit (); MyBatisjdbcutil.Closession ();
Die beiden oben genannten Aussagen werden nicht zurückgegeben, was bedeutet, dass sie erst nach Ausführung dieser beiden Aussagen wirklich ausgeführt und in die Datenbank eingefügt werden und die Daten in der Datenbank ändern werden.
Im Gegenteil, wenn es einen Rückgabewert gibt, werden diese beiden Aussagen nicht ausgeführt, sodass die Additionsanweisung nur in der Sitzung ausgeführt wird, die von selbst erstellt wurde, aber nicht in die Datenbank übermittelt wird, sodass in der Datenbank keine Aufzeichnung vorliegt.
Dies erklärt, warum nach der Änderung der Additionsmethode in MyBatis einen Rückgaberwert angezeigt wird. Wenn Sie jedoch die Datenbank erfolgreich eingefügt werden, können Sie die eingefügten Daten beim Öffnen der Datenbank nicht sehen.
Die Insertion -Statement -Methode in MyBatis sollte keinen Rückgabewert haben, da das Schreiben wie dieses korrekt ist.
@Override public void InsertProduct (ProductBean ProductBean) {// Todo automatisch generierte Methode Stub SQLSession Session = myBatisjdbcutil.currentSession (); ProductIdao productIdao = session.getMapper (productIdao.class); // hier *.class // Es muss der Grenzflächenschicht von DAO productidao.insertProduct (productBean) entsprechen; Session.Commit (); MyBatisjdbcutil.closesSession (); }Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.