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.
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.
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.
Lassen Sie uns Update in einer Schleife mit dem obigen Kleber drehen! Ich bin süchtig danach.
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.
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.
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.
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.
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