[JAVA] Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen

Einführung

Der Autor ist noch ein Anfängeringenieur, der 2018 in das Unternehmen eingetreten ist.

Das Niveau des Artikels ist also nicht sehr hoch,

Ich möchte die Punkte belassen, nach denen ich süchtig war, als ich Code für zukünftige Junioren im Geschäft schrieb! !!

→ Wenn du es trotzdem verlassen willst, möchte ich es in Qiita schreiben! !! Ich dachte und postete es.

Hintergrund Ich war süchtig nach dieser Zeit

Dies ist die Geschichte, als ich mit Spring + MyBatis Backend-Entwicklung machte.

N Objekte, die von der verantwortlichen Funktion aus der Anfrage gesendet wurden,

Nachdem ich die Logik durchlaufen hatte, habe ich mit MyBatis mehrere Elemente aktualisiert.

Was ist vorher mein Batis?

Bevor wir über diese Zeit sprechen, lassen Sie uns leicht über My Batis sprechen.

MyBatis ist ein OR-Mapper-Framework, das SQL in XML beschreibt.

Auch wenn der Entwickler sich nicht die Mühe macht, SQL in den OR-Mapper zu schreiben Einige sind garantiert normale CRUD-Verarbeitung,

MyBatis wagt es, komplizierte Verknüpfungen durch Handschrift von SQL durchzuführen. Sie können spezielle SQL-Anweisungen wie UPSERT-Anweisungen Java-Objekten zuordnen. Wenn Anweisungen, foreach usw. in den SQL-Teil geschrieben werden können und dynamisches SQL generiert werden kann.
Beispiel) Die INSERT-Anweisung kann wie folgt geschrieben werden.

Java-Datei


public interface UserRepository{
	public int insertUser(List<User> userList);
}

XML-Datei


<insert id="insertUser" parameterType="java.util.List">
   INSERT INTO users( 
   		  user_id
   		, user_name
   		, user_mail
   )
   VALUES
   <foreach item="user" collection="list" open="" separator="," close="">
     (
          #{userId, jdbcType=BIGINT}
        , #{userName, jdbcType=VARCHAR}
        , #{userEmail, jdbcType=VARCHAR}
     )
   </foreach>
 </insert>

Füllen Sie im obigen Fall das Benutzerobjekt mit dem Wert, den Sie registrieren möchten. Indem Sie sie in eine Liste aufnehmen und an den OR-Mapper übergeben, können mehrere INSERTs mit einer Abfrage erstellt werden. Diese einmalige Ausgabe ist gut, und Sie können die Anzahl der Zugriffe auf die Datenbank reduzieren, ohne die Leistung zu beeinträchtigen.

Süchtig nach Update

Lassen Sie uns Update in einer Schleife mit dem obigen Kleber drehen! Ich bin süchtig danach.

Veranstaltung

Insbesondere beim Schreiben der folgenden SQL. (Java wird weggelassen)

XML-Datei


<update id ="updateUser" parameterType= "java.util.List" >
     <foreach collection ="itemList" item="item" separator= ";">
          update users
           <set>
                user_name = #{userName, jdbcType=VARCHAR}
              , user_email = #{userEmail, jdbcType=VARCHAR}
           </set >
          WHERE user_id = #{userId, jdbcType=VARCHAR}
     </foreach>
</update >

Angenommen, Sie möchten "Ah" und "Ii" mit dem obigen SQL aktualisieren. Die von diesem ausgegebene Abfrage sieht folgendermaßen aus:

SQL ausgegeben


update users
  set
    user_name = 'ah ah',
    user_email = '[email protected]'
where user_id = '001';
update users
  set
    user_name = 'Gut',
    user_email = '[email protected]'
where user_id = '002';

Auf den ersten Blick sieht es gut aus, aber wenn Sie tatsächlich versuchen, es zu verarbeiten, tritt ein Fehler auf. Wenn dieses ausgegebene SQL jedoch direkt an die Tabelle gesendet wird, wird der Prozess normal beendet.

Ursache

Dies ist in Bezug auf Mybatis oder Java-Methoden (zumindest für mich) sinnvoll.

Als Verhalten von Java werde ich eine Methode namens updateUser aufrufen. Unter diesen werden n Abfragen ausgegeben, um auf die Datenbank zuzugreifen.
Zu diesem Zeitpunkt wird die Anzahl der von einer Abfrageausgabe verarbeiteten Fälle als Rückgabewert an die aufrufende Klasse zurückgegeben. Im Fall der obigen Update-Anweisung werden also mehrere Abfragen mit einem Methodenaufruf ausgegeben Ein Fehler tritt auf, wenn Sie versuchen, mehrere Rückgabewerte zurückzugeben.

Warum Insert foreach kann

Wie ich in dem Abschnitt geschrieben habe, in dem ich über My Batis gesprochen habe, im Fall der Insert-Anweisung ** Da mehrere Prozesse durch Ausgeben einer einzelnen Abfrage ausgeführt werden ** Auch wenn Sie zwei Fälle mit einem Methodenaufruf registrieren Nur der Rückgabewert ist "2" und die Anzahl der Rückgabewerte ist eins, sodass der Prozess normal endet.

So führen Sie eine Schleife mit Update durch

Wenn die Datenbank UPSERT-Anweisungen wie mySQL verwenden kann, beschreiben Sie DUPLICATE KEY und schreiben Sie es. Es kann mit UPSERT gelöst werden.

UPSERT-Verarbeitungsbeispiel


<insert id="upsertUser" parameterType="java.util.List">
    INSERT INTO users ( 
          user_id
        , user_name
        , user_mail
   )
   VALUES
   <foreach item="user" collection="list" open="" separator="," close="">
     (
        #{userId, jdbcType=BIGINT},
        #{userName, jdbcType=VARCHAR},
        #{userEmail, jdbcType=VARCHAR},
     )
   </foreach>
   ON DUPLICATE KEY UPDATE
     user_name = VALUES(userName),
     user_email = VALUES(userEmail)
 </insert>

Mit der obigen SQL wird eine INSERT-Anweisung einmal von dem zu aktualisierenden Objekt einmal ausgegeben. Für INSERT-Anweisungen, die zur Laufzeit zu einer eindeutigen Vertragsverletzung führen würden Der Prozess wechselt zu der Update-Anweisung, die unter ON DUPLICATE KEY UPDATE beschrieben ist. Wenn daher n Aktualisierungsobjekte an diesen Prozess übergeben werden, ** Infolgedessen können mehrere Aktualisierungen vorgenommen werden, indem eine einzelne Abfrage ausgegeben wird **, und der Vorgang wird normal ausgeführt.

abschließend

Vielen Dank für das Lesen bis zum Ende. Wenn Sie etwas Seltsames finden, weisen Sie bitte darauf hin. Außerdem werde ich weiterhin Artikel veröffentlichen, daher sind Ratschläge zum Schreiben willkommen!

Recommended Posts

Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Ich war süchtig nach RXTX mit Sierra
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich war süchtig danach, sbt zu starten
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich war süchtig nach Laradock + VSCode + xdebug
Was ich mit der Redmine REST API süchtig gemacht habe
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Ein Hinweis, als ich süchtig danach war, Ubuntu auf WSL1 in WSL2 zu konvertieren
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Dinge, die ich in My Batis Personal Summary vergesse
Ich möchte die Protokollausgabe unter Android vereinfachen
Die CSV-Datei, die ich herunterladen konnte, wurde plötzlich auf der Seite angezeigt.
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich möchte das JDK auf meinem Mac-PC installieren
Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Technische Ursachen und Gegenmaßnahmen für die Punkte, denen ich mit der ersten Android-App und Kotlin verfallen war
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Sondervortrag über Multiskalensimulation: Ich habe versucht, den 5. zusammenzufassen
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
Sondervortrag über Multi-Scale-Simulation: Ich habe versucht, den 8. zusammenzufassen
Ich möchte die deaktivierte Option abhängig von der Bedingung zu f.radio_button hinzufügen
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Sondervortrag über Multi-Scale-Simulation: Ich habe versucht, den 7. zusammenzufassen
Ich konnte die Docker + Laravel + MySQL App für Heroku bereitstellen!
Ich habe versucht, die Methode zu erklären
Android Memo-I war süchtig nach Erlaubnis
Durch die Überprüfung der Funktionsweise von Java unter Linux konnte ich die Kompilierung und Hierarchie verstehen.
Ich war süchtig danach, MySQL 8.0 mit einem 5.7-Gefühl zu berühren. My.cnf-Konfigurationsproblem
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
[Active Admin] Ich möchte die Standardverarbeitung zum Erstellen und Aktualisieren anpassen
Es war ein Leben, in dem ich den thread-sicheren assoziativen Zähler zurücksetzen wollte