[JAVA] Ich habe UPSERT mit PostgreSQL ausprobiert.

Einführung

Wenn Sie eine DB-Operation ausführen, "Aktualisieren Sie, ob diese Daten eingefügt wurden oder in einer EINZIGARTIGEN Einschränkung gefangen sind." Ansonsten möchte ich EINFÜGEN " Zu dieser Zeit habe ich mit Java verzweigt. Wenn Sie jedoch PostgreSQL verwenden, können Sie dies anscheinend gleichzeitig tun. Also habe ich es versucht.

Übrigens gibt es auf anderen Websites ziemlich viele Informationen, die nur mit SQL implementiert werden können. Deshalb werde ich dieses Mal die Methode mit MyBatis anwenden. Das ändert sich jedoch nicht viel.

Die Umgebung ist wie folgt IDE:Eclipse </>:Java8,SpringBoot <DB-bezogen (Hauptzeile)>: PostgreSQL, MyBatis

Umgebung

Spring Boot und My Batis selbst sowie die Zusammenarbeit mit PostgreSQL sind nicht die Hauptpunkte, daher werde ich sie bis zu einem gewissen Grad weglassen. Diesmal ist Gradle.

Gradle (Auszug)

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'org.postgresql:postgresql'
	annotationProcessor 'org.projectlombok:lombok'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

application.properties (Auszug)

<!-- Postgres property -->
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/hrm
spring.datasource.username=*****
spring.datasource.password=*****

Bereiten Sie einen Tisch vor

Bereiten Sie eine Tabelle in PostgreSQL vor. Dieses Mal ist Schema öffentlich.

PostgreSQL

create table tableName (
		id serial primary key,
		user_id integer not null,
		date_id integer not null,
		is_working smallint,
		);

		alter table tableName add constraint user_date unique(user_id, date_id);

Hier ist ein Beispiel für diese Anwendung. Angenommen, Sie haben eine Anwendung, die die Aufgabenliste eines Benutzers verwaltet und prüft, ob der Benutzer eine Aufgabe abgeschlossen hat. Fügen Sie 1 für is_working ein, wenn die Aufgabe erfolgreich ist, und 0 für Updates für einen Monat. Wenn Sie die Aufgabenverwaltung rückwirkend bearbeiten möchten oder sich herausstellt, dass die Aufgabe des Vortages am 2. September nicht abgeschlossen wurde, Ich muss is_working am 1. September aktualisieren. Unter der Annahme, dass der Wert, den Sie wie am 1. September aktualisieren möchten, der Wert, den Sie wie am 2. September neu registrieren möchten, oder der Fall, dass mehrere Benutzer vorhanden sind, wird die obige SQL zu diesem Zeitpunkt als user_id bezeichnet. Die Einschränkung wird nur festgelegt, wenn die date_id übereinstimmt.

Sie müssen lediglich die Werte von HTML an Controller und Mapper übergeben und die Upsert-Syntax in Mapper schreiben.

Mapper (Auszug)

<insert id="upsert">
	insert into ${tableName} (
	user_id,
	date_id,
	is_working
	)
	values (
	#{user_id},
	#{date_id},
	#{is_working}
	)
	ON CONFLICT (user_id, date_id)
	do update set
	is_working = #{is_working}
</insert>

Nur das.

wichtiger Punkt

Existiert das Wort Upsert beim Schreiben der Syntax in Mapper nicht in MyBatis? Zum, Sie werden Einfügen oder Aktualisieren schreiben. Wenn Sie den Konfliktnamen nicht richtig schreiben, funktioniert er nicht. Achten Sie also darauf, keinen Fehler zu machen.

Irgendein anderer Weg?

Es scheint eine andere Spezifikationsmethode zu geben, die ** DONOTHING ** und INDEX verwendet.

Wenn es DONOTHING ist, hier Für andere detaillierte Zwecke halte ich die Website hier für nützlich.

Zusammenfassung

Ich habe viele Möglichkeiten gesehen, SQL direkt einzugeben, aber es gab nicht viele, die tatsächlich codiert wurden. Ich habe versucht, es als Referenz zusammenzufassen. Es ist jedoch möglicherweise für keine Methode relevant, nicht auf MyBatis beschränkt, da sich die SQL-Syntax nicht ändert. Die Beschreibung ist dieselbe, solange Sie die Parameter an Dao übergeben können.

Ich denke, dass es besser organisiert ist als das Schreiben in die if-Anweisung, daher möchte ich es aktiv in der PostgreSQL-Umgebung verwenden.

Recommended Posts

Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe DI mit Ruby versucht
Ich habe BIND mit Docker ausprobiert
Ich habe Angular Tutorial + SpringBoot + PostgreSQL ausprobiert
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe es mit Spring versucht.
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe versucht, Tomcat zu setzen
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, ein automatisches Backup mit angenehmem + PostgreSQL + SSL + Docker zu erstellen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe auch Web Assembly mit Nim und C ausprobiert
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe Eclipse MicroProfile OpenAPI mit WildFly Swarm ausprobiert
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Gradle auf Heroku zu beginnen
[Ich habe es versucht] Spring Tutorial
Ich habe versucht, Autoware auszuführen
Ich habe versucht, Gson zu benutzen
Ich habe sofort QUARKUS ausprobiert
Ich habe versucht, TestNG zu verwenden
Ich habe Spring Batch ausprobiert
Ich habe versucht, Galasa zu benutzen
Ich habe versucht, node-jt400 (Programme)
Ich habe versucht, node-jt400 (ausführen)
Ich habe versucht, node-jt400 (Transaktionen)
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, mit Spring Data JPA zu beginnen
[Maschinelles Lernen] Ich habe die Objekterkennung mit Create ML [Objekterkennung] ausprobiert.
Ich habe versucht, Animationen mit der Blazor + Canvas-API zu zeichnen
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.