[JAVA] J'ai essayé UPSERT avec PostgreSQL.

introduction

Lors de l'exécution d'une opération de base de données, "Mettre à jour si ces données ont été INSERTées ou sont prises dans une contrainte UNIQUE, Sinon, je veux INSÉRER " A cette époque, j'avais l'habitude de créer des branches avec Java. Mais si vous utilisez PostgreSQL, il semble que vous puissiez le faire en même temps. Alors je l'ai essayé.

Au fait, il y a pas mal d'informations sur d'autres sites pour une implémentation avec uniquement SQL, donc cette fois je vais utiliser la méthode MyBatis. Cela ne change pas grand-chose, cependant.

L'environnement est le suivant IDE:Eclipse </>:Java8,SpringBoot <DB related (ligne principale)>: PostgreSQL, MyBatis

Environnement

Spring Boot et My Batis lui-même, et la coopération avec PostgreSQL ne sont pas les points principaux, je les omettrai donc dans une certaine mesure. Cette fois, c'est Gradle.

Gradle (extrait)

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 (extrait)

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

Préparez une table

Préparez une table dans PostgreSQL. Cette fois, Schema sera public.

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);

Voici un exemple de cette application. Par exemple, supposons que vous ayez une application qui gère la liste de tâches d'un utilisateur et vérifie si l'utilisateur a terminé une tâche. Insérez 1 pour is_working si la tâche est terminée, et 0 sinon pour un mois de mises à jour. Si vous souhaitez modifier la gestion des tâches de manière rétroactive, ou s'il s'avère que la tâche de la veille n'a pas été terminée le 2 septembre, Je dois mettre à jour is_working le 1er septembre. À ce stade, en supposant que la valeur que vous souhaitez mettre à jour comme le 1er septembre, la valeur que vous souhaitez enregistrer nouvellement comme le 2 septembre, ou dans le cas où il y a plusieurs utilisateurs, le SQL ci-dessus est appelé user_id. La contrainte est définie uniquement lorsque date_id correspond.

Tout ce que vous avez à faire est de transmettre les valeurs html à Controller et Mapper et d'écrire la syntaxe upsert dans Mapper.

Mapper (extrait)

<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>

Seulement ça.

point important

Lors de l'écriture de la syntaxe dans Mapper, le mot upsert n'existe-t-il pas dans MyBatis? Pour, Vous écrirez insérer ou mettre à jour. De plus, si vous n'écrivez pas correctement le nom du conflit, cela ne fonctionnera pas, alors faites attention à ne pas faire d'erreur.

Une autre manière?

Il semble y avoir une autre méthode de spécification utilisant ** DONOTHING ** et INDEX.

S'il s'agit d'un DON, ici Pour une autre utilisation détaillée, je pense que le site here est utile.

Sommaire

J'ai vu de nombreuses façons de taper directement SQL, mais il n'y en avait pas beaucoup qui étaient réellement codées. J'ai essayé de le résumer pour référence. Cependant, il peut ne pas être pertinent pour aucune méthode, pas limité à MyBatis, car la syntaxe SQL ne change pas. La description est la même tant que vous pouvez passer les paramètres à Dao.

Je pense qu'il est plus organisé que décrit dans l'instruction if, donc je voudrais l'utiliser activement dans l'environnement PostgreSQL.

Recommended Posts

J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé DI avec Ruby
J'ai essayé BIND avec Docker
J'ai essayé le didacticiel Angular + SpringBoot + PostgreSQL
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé l'analyse morphologique avec MeCab
J'ai essayé la communication UDP avec Java
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
J'ai essayé de personnaliser Slim avec Scaffold
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé Spring.
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai essayé de mettre Tomcat
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé de faire une sauvegarde automatique avec plus agréable + PostgreSQL + SSL + docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai aussi essayé Web Assembly avec Nim et C
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai essayé Eclipse MicroProfile OpenAPI avec WildFly Swarm
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de démarrer avec Gradle sur Heroku
[J'ai essayé] Tutoriel de printemps
J'ai essayé d'exécuter Autoware
J'ai essayé d'utiliser Gson
J'ai essayé QUARKUS immédiatement
J'ai essayé d'utiliser TestNG
J'ai essayé Spring Batch
J'ai essayé d'utiliser Galasa
J'ai essayé node-jt400 (Programmes)
J'ai essayé node-jt400 (exécuter)
J'ai essayé node-jt400 (Transactions)
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de démarrer avec Spring Data JPA
[Apprentissage automatique] J'ai essayé la détection d'objets avec Create ML [détection d'objets]
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
J'ai essayé OCR de traiter un fichier PDF avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai essayé de moderniser une application Java EE avec OpenShift.