[Java] Convertit le code DB en valeur de code à l'aide d'énum

Il s'agit d'un exemple qui convertit le code d'état enregistré dans la base de données en une valeur de code côté Java. Cela élimine le besoin de créer un maître qui définit la signification du code d'état. Le cadre est Spring Boot.

environnement

Aperçu

Le code de statut de l'étudiant (valeur entière) enregistré dans la table des étudiants est converti en la valeur de code correspondante à l'aide d'énumération côté Java.

Diagramme ER

image.png

Code d'état et valeur de code

Code d'état Valeur de code
1 Étudiant
2 En congé
3 diplômé

Diagramme de configuration du package

enum-sample
     |
    src/main/java
     |----jp.co.high_school
     |               |---- app
     |               |     |---- controller
     |               |     |---- response
     |               |
     |               |---- domain
     |               |      |---- service
     |               |      |---- repository
     |               |      |---- model
     |               |  
     |               |---- constant
     |
    src/main/resources
     |----application.yml

Code source

  1. DDL

Table des étudiants


CREATE TABLE `students` (
  `student_id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT 'Carte d'étudiant',
  `student_name` varchar(300) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Nom d'étudiant',
  `sex` tinyint(4) DEFAULT NULL COMMENT 'sexe',
  `school_year` tinyint(4) DEFAULT NULL COMMENT 'Année scolaire',
  `class` tinyint(4) DEFAULT NULL COMMENT 'classe',
  `student_status` tinyint(4) DEFAULT NULL COMMENT 'Statut d'étudiant',
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='étudiant';

2. Classe constante

Définissez et utilisez enum dans la classe constante. Vous pouvez créer une énumération en tant que classe, mais je l'ai définie dans la classe en supposant que le nombre augmentera. En faisant cela, vous pouvez gérer plusieurs énumérations avec un fichier de classe.

Constant.java


package jp.co.high_school.constant;

import java.util.stream.Collectors;
import java.util.stream.Stream;

import lombok.Getter;

/**
 *Classe constante
 * @author CHI-3
 * @Version 1.0
 */
public class Constant {

        /**
         * StudentStatus
         *Statut d'étudiant
         */
        @Getter
        public static enum StudentStatus {

            In(1, "Étudiant"),
            Rest(2, "En congé"),
            Out(3, "diplômé");

            private StudentStatus(int key, String value) {
                this.key = key;
                this.value = value;
            }


            private int key;

            private String value;

            //Renvoie toutes les valeurs de code
            public static Stream<StudentStatus> stream(){
                return Stream.of(StudentStatus.values());
            }

            //Renvoie la valeur de code qui correspond au code récupéré
            public static String getStatusValue(Byte code) {
            	return Stream.of(StudentStatus.values()).filter(v -> v.getKey() == code).map(v -> v.getValue()).collect(Collectors.joining());
            }

        }


        //Non utilisé cette fois: décrit comme la preuve que plusieurs énumérations peuvent être définies dans une classe
        /**
         * Grade
         *Grades
         */
        @Getter
        public static enum Grade{

            //Excellent, bon, acceptable sont les exigences minimales-sam, pas possible est la meilleure condition
            Excellent(1, "Yu", 90),
            Good(2, "Bien", 75),
            Passing(3, "Oui", 60),
            Failing(4, "Impossible", 59);


            private Grade(int key, String value, int order) {
                this.key = key;
                this.value = value;
                this.order = order;
            }

            private int key;

            private String value;

            private int order;

        }

}

3. Classe d'entité

Cette fois, il a été généré automatiquement à partir de la base de données à l'aide des outils Hibernate d'Eclipse.

Student.java


package jp.co.high_school.domain.model;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the students database table.
 *
 */
@Entity
@Table(name="students")
@NamedQuery(name="Student.findAll", query="SELECT s FROM Student s")
public class Student implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="student_id")
	private Integer studentId;

	@Column(name="class")
	private Byte class_;

	@Column(name="school_year")
	private Byte schoolYear;

	private Byte sex;

	@Column(name="student_name")
	private String studentName;

	@Column(name="student_status")
	private Byte studentStatus;

	//bi-directional one-to-one association to Grade
	@OneToOne(mappedBy="student")
	private Grade grade;

	public Student() {
	}

	public Integer getStudentId() {
		return this.studentId;
	}

	public void setStudentId(Integer studentId) {
		this.studentId = studentId;
	}

	public Byte getClass_() {
		return this.class_;
	}

	public void setClass_(Byte class_) {
		this.class_ = class_;
	}

	public Byte getSchoolYear() {
		return this.schoolYear;
	}

	public void setSchoolYear(Byte schoolYear) {
		this.schoolYear = schoolYear;
	}

	public Byte getSex() {
		return this.sex;
	}

	public void setSex(Byte sex) {
		this.sex = sex;
	}

	public String getStudentName() {
		return this.studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public Byte getStudentStatus() {
		return this.studentStatus;
	}

	public void setStudentStatus(Byte studentStatus) {
		this.studentStatus = studentStatus;
	}

	public Grade getGrade() {
		return this.grade;
	}

	public void setGrade(Grade grade) {
		this.grade = grade;
	}

}

4. Classe de référentiel

En spécifiant le numéro d'étudiant, les informations de l'étudiant correspondant sont acquises.

StudentRepository.java


package jp.co.high_school.domain.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import jp.co.test_shop.domain.model.Student;

/**
 *Classe de référentiel de manipulation de table des étudiants
 * @author CHI-3
 * @Version 1.0
 */
@Repository
public interface StudentRepository extends JpaRepository<Student, Integer>{

	/**
	 *méthode findByStudentId
	 *Obtenez l'étudiant correspondant à la carte d'étudiant
	 * @param studentId
	 * @retour étudiant
	 */
	public Student findByStudentId(Integer studentId);

}

5. Classe de service

Convertit le code de statut d'étudiant de l'étudiant acquis en code de statut correspondant et le renvoie.

StudentInformationService.java


package jp.co.high_school.domain.service;

import java.util.Optional;

import org.springframework.stereotype.Service;

import jp.co.test_shop.constant.Constant.StudentStatus;
import jp.co.test_shop.domain.model.Student;
import jp.co.test_shop.domain.repository.StudentRepository;
import lombok.RequiredArgsConstructor;

/**
 *Classe de service pour l'acquisition d'informations sur les étudiants
 * @author CHI-3
 * @version 1.0
 */
@Service
@RequiredArgsConstructor
public class StudentInformationService {

	private final StudentRepository studentRepository;

	/**
	 *méthode getStatus
	 *Obtenir le statut d'étudiant (valeur de code) de l'étudiant cible
	 * @param studentId ID étudiant
	 * @retourner le statut d'étudiant (valeur de code)
	 */
	public String getStatus(Integer studentId) throws Exception{

		Student student = studentRepository.findByStudentId(studentId);
		
		//Soulevez une exception si aucun étudiant n'est associé à la carte d'étudiant
		Optional.ofNullable(student).orElseThrow(Exception::new);
		
		String status = null;
		/*Code d'état → Valeur de code correspondante: commentaire en raison du changement de description par flux
		for(StudentStatus ss:StudentStatus.values()){
			if(ss.getKey() == student.getStudentStatus()) {
				status = ss.getValue();
				break;
			}
		}
		*/
		
		//Code d'état → Valeur de code correspondante
		status = StudentStatus.getStatusValue(student.getStudentStatus());

		return status;

	}

}


6. Classe de contrôleur

Formate et renvoie la valeur de code obtenue par la classe Service.

StudentInformationController.java


package jp.co.high_school.app.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import jp.co.test_shop.app.response.StudentStatusResponse;
import jp.co.test_shop.domain.service.StudentInformationService;
import lombok.RequiredArgsConstructor;

/**
 *Classe de contrôleur pour l'acquisition d'informations sur les étudiants
 * @author CHI-3
 * @Version 1.0
 */
@RestController
@RequiredArgsConstructor
public class StudentInformationController {

	private final StudentInformationService studenInformationService;

	/**
	 *méthode getStatus
	 *Obtenez le statut d'étudiant
	 * @param studentId ID étudiant
	 * @return Response entity (valeur du code d'état + état HTTP)
	 */
	@GetMapping("/student-information/{studentId}")
	public ResponseEntity<StudentStatusResponse> getStatus(@PathVariable("studentId") Integer studentId){
		String status = studenInformationService.getStatus(studentId);
		StudentStatusResponse studentStatusReponse = StudentStatusResponse.builder().status(status).build();
		return new ResponseEntity<>(studentStatusReponse, HttpStatus.OK);
	}

}

7. Classe de réponse

StudentStatusResponse.java


package jp.co.high_school.app.response;

import lombok.Builder;
import lombok.Getter;

/**
 *Classe de réponse sur le statut d'étudiant
 *Utilisé pour façonner le statut d'étudiant
 * @author CHI-3
 * @Version 1.0
 */
@Getter
@Builder
public class StudentStatusResponse {

	private String status;

}

Contrôle de fonctionnement

Cette fois, nous vérifierons le fonctionnement dans l'environnement local.

Table des étudiants

student_id student_name sex school_year class student_status
1 Étudiant 1 1 2 1

Si la table des élèves a le contenu ci-dessus, le fait d'appuyer sur l'API (en utilisant Advanced Rest Client) renverra le résultat suivant. La valeur du code (pendant la fréquentation scolaire) correspondant au code d'état (1) est correctement prise.

Méthode GET
URL http://localhost:8080/student-information/1

image.png

modifier l'historique

--2020 / 07/13: Code d'état → Modifier la description du processus pour acquérir la valeur de code correspondante et la configuration du package de la classe constante

À la fin

Utiliser enum semble rendre la gestion des maîtres (DB) et des constantes (Java) beaucoup plus facile. Je veux bien l'utiliser.

référence

Recommended Posts

[Java] Convertit le code DB en valeur de code à l'aide d'énum
[Android] Convertir le code Java Android en Kotlin
Convertir l'énumération Java et JSON vers et depuis Jackson
Exemple de code pour convertir List en List <String> dans Java Stream
Convertir un fichier csv en fichier d'enregistrement de longueur fixe à l'aide d'énumération
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Connectez-vous à DB avec Java
Comment convertir la base Java
[Java] Convertir ArrayList en tableau
Convertir la carte <K, V1> en carte <K, V2> (Convertir la valeur de la carte)
[Java] Élimination du code de plaque de chaudière à l'aide de Lombok
[Java] Convertir 1 en N liste en carte
[Java] Élimination du code de plaque de chaudière avec Lombok 2
[Java] Essayez de mettre en œuvre à l'aide de génériques
Comment formater enum à l'aide de formatter-maven-plugin (Java)
Exemple de code utilisant Minio de Java
[Java] Convertit un tableau en ArrayList * Attention
Comment utiliser le type enum Java
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
[Java] Type Express Enum sans utiliser le type Enum (énumération)
Exemple de code pour l'implémentation Singleton à l'aide d'énumération
Exemple de code pour la sérialisation et la désérialisation des énumérations Java Enum et JSON dans Jackson
Convertir les paramètres de demande en Enum au printemps
Convertir toutes les applications Android (Java) en Kotlin
[Java] Comment calculer l'âge à l'aide de LocalDate
Convertir l'heure UTC Java en heure JST
ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
[Java] Convertit null du type Object en type String
Connectez-vous de Java à MySQL à l'aide d'Eclipse
Convertir des fichiers SVG en fichiers PNG en Java
[Java] enum (type d'énumération)
[Java] Flux du code source à l'exécution
Upsert du SDK Java vers Azure Cosmos DB
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Comment convertir un contrat de solidité en une classe de contrat Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
En utilisant Gradle avec VSCode, compilez Java → exécutez
Ecrire du code de liaison Selenium Java à l'aide de Silk WebDriver
Convertir les beans imbriqués Java au format aaa.bbb [0] .ccc
Sélectionnez * de Java SDK vers Azure Cosmos DB
CONSEILS relatifs au code Java
Exemple de code Java 02
Exemple de code Java 03
Exemple de code Java 04
[Java] Introduction à Java
Introduction à Java
Exemple de code Java 01
Code de caractère Java
Lancez Docker à partir de Java pour convertir des documents Office en PDF
Convertir JSON et YAML en Java (en utilisant Jackson et SnakeYAML)
<java> Lire le fichier Zip et le convertir directement en chaîne
[Java] [SQL Server] Se connecter à SQL Server 2017 local à l'aide de JDBC pour SQL Server
Prise en main des programmes Java à l'aide de Visual Studio Code
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 3
Sortie de la valeur maximale d'un tableau à l'aide de la sortie standard Java
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 2