[JAVA] Accédez au h2db intégré de Spring Boot avec jdbcTemplate

1.Tout d'abord

Cette fois, je voudrais expliquer comment utiliser le jdbcTemplate de spring-jdbc pour accéder au h2db intégré de spring boot en tant que DB. Cependant, on ne parle presque pas de h2db, c'est simplement comment utiliser jdbcTemplate. Pour la préparation du h2db intégré, reportez-vous à "Comment utiliser le h2db intégré avec le démarrage à ressort".

Si vous souhaitez accéder à la base de données avec un autre ORMapper au lieu de jdbcTemplate, reportez-vous à l'article suivant.

2. Points d'accès à la base de données par JdbcTemplate

Les points lors de l'accès à la base de données avec JdbcTemplate sont indiqués ci-dessous. S'il s'agit d'un CRUD de base, je pense que le contenu présenté ici est suffisant.

3. Échantillon

3.1. Définition du tableau

Au démarrage du printemps, le fichier schema.sql directement sous le chemin de classe est automatiquement exécuté au démarrage. Décrivez l'instruction CREATE TABLE de la table à utiliser cette fois dans ce fichier. Veuillez vous référer aux directives officielles suivantes pour le type de données de h2db. http://www.h2database.com/html/datatypes.html

src/main/resources/schema.sql


-- file_info table
CREATE TABLE IF NOT EXISTS file_info (
    file_id varchar(100) PRIMARY KEY,
    file_type varchar(100) NOT NULL,
    file_name varchar(200) NOT NULL,
    file_path varchar(200) NOT NULL,
    content_type varchar(100) NOT NULL,
    content_length bigint NOT NULL,
    registered_date timestamp NOT NULL
);

3.2. Classes à cartographier

Définissez la classe à mapper correspondant à la table. Cependant, c'est une classe POJO ordinaire.

FileInfo.java


package com.example.demo.domain.model;

import java.io.Serializable;
import java.sql.Timestamp;

public class FileInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    private String contentType;
    private long contentLength;
    private String fileName;
    private String fileType;
    private String fileId;
    private String filePath;
    private Timestamp registeredDate;

    // constructor,setter,getter omitted
}

3.3. Classe de référentiel

Définissez la classe de référentiel principale pour cet article. Les points sont tels que décrits dans "[2. Points d'accès DB par JdbcTemplate](# 2-db points d'accès par jdbctemplate)".

** Par précaution pour l'implémentation, s'il n'y a aucun résultat de recherche, ʻorg.springframework.dao.EmptyResultDataAccessException` se produira. Cette fois, comme les autres ORMappers, s'il n'y a aucun cas, «null» est renvoyé. ** **

Il est de notre convenance d'encapsuler DataAccessException dans DemoSystemException. Il n'est pas directement lié à l'utilisation de jdbcTemplate.

FileInfoRepository.java


package com.example.demo.domain.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import com.example.demo.domain.common.DemoSystemException;
import com.example.demo.domain.model.FileInfo;

@Repository
public class FileInfoRepository {

    private static final Logger LOGGER = LoggerFactory.getLogger(FileInfoRepository.class);

    private static final String INSERT_SQL = "INSERT INTO file_info ("
            + "file_id, file_type, file_name, file_path, content_type, content_length, registered_date) values ("
            + ":fileId, :fileType, :fileName, :filePath, :contentType, :contentLength, :registeredDate)";

    private static final String DELETE_BY_KEY_SQL = "DELETE FROM file_info WHERE file_id = :fileId";

    private static final String UPDATE_BY_KEY_SQL = "UPDATE file_info SET file_type = :fileType, file_name = :fileName, "
            + "file_path = :filePath, content_type = :contentType, content_length = :contentLength, registered_date = :registeredDate "
            + "WHERE file_id = :fileId";

    private static final String FIND_ONE_SQL = "SELECT file_id, file_type, file_name, file_path, content_type, content_length, registered_date "
            + "FROM file_info WHERE file_id = :fileId";

    private static final String FIND_ALL_SQL = "SELECT file_id, file_type, file_name, file_path, content_type, content_length, registered_date "
            + "FROM file_info ORDER BY file_type, registered_date";

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    public int insert(FileInfo fileInfo) {
        try {
            SqlParameterSource param = new BeanPropertySqlParameterSource(fileInfo);
            return jdbcTemplate.update(INSERT_SQL, param);
        } catch(DataAccessException e) {
            LOGGER.error("DataAccessError : INSERT_SQL param:{}, error:{}", fileInfo, e);
            throw new DemoSystemException("DataAccessError : FileInfoRepository INSERT_SQL", e);
        }
    }

    public int deleteByKey(String fileId) {
        try {
            SqlParameterSource param = new MapSqlParameterSource().addValue("fileId", fileId);
            return jdbcTemplate.update(DELETE_BY_KEY_SQL, param);
        } catch(DataAccessException e) {
            LOGGER.error("DataAccessError : DELETE_BY_KEY_SQL param:{}, error:{}", fileId, e);
            throw new DemoSystemException("DataAccessError : FileInfoRepository DELETE_BY_KEY_SQL", e);
        }
    }

    public int updateByKey(FileInfo fileInfo) {
        try {
            SqlParameterSource param = new BeanPropertySqlParameterSource(fileInfo);
            return jdbcTemplate.update(UPDATE_BY_KEY_SQL, param);
        } catch(DataAccessException e) {
            LOGGER.error("DataAccessError : UPDATE_BY_KEY_SQL param:{}, error:{}", fileInfo, e);
            throw new DemoSystemException("DataAccessError : FileInfoRepository UPDATE_BY_KEY_SQL", e);
        }
    }

    public FileInfo fineOne(String fileId) {
        try {
            SqlParameterSource param = new MapSqlParameterSource().addValue("fileId", fileId);
            return jdbcTemplate.queryForObject(FIND_ONE_SQL, param, fileInfoRowMapper());
        } catch(EmptyResultDataAccessException e) {
            return null;
        } catch(DataAccessException e) {
            LOGGER.error("DataAccessError : FIND_ONE_SQL param:{}, error:{}", fileId, e);
            throw new DemoSystemException("DataAccessError : FileInfoRepository FIND_ONE_SQL", e);
        }
    }

    public List<FileInfo> findAll() {
        try {
            return jdbcTemplate.query(FIND_ALL_SQL, fileInfoRowMapper());
        } catch(EmptyResultDataAccessException e) {
            return null;
        } catch(DataAccessException e) {
            LOGGER.error("DataAccessError : FIND_ALL_SQL error:{}", e);
            throw new DemoSystemException("DataAccessError : FileInfoRepository FIND_ALL_SQL", e);
        }
    }

    private RowMapper<FileInfo> fileInfoRowMapper() {

        return new RowMapper<FileInfo>() {
            @Override
            public FileInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
                
                FileInfo fileInfo = new FileInfo();
                fileInfo.setContentLength(rs.getLong("content_length"));
                fileInfo.setContentType(rs.getString("content_type"));
                fileInfo.setFileId(rs.getString("file_id"));
                fileInfo.setFileName(rs.getString("file_name"));
                fileInfo.setFilePath(rs.getString("file_path"));
                fileInfo.setFileType(rs.getString("file_type"));
                fileInfo.setRegisteredDate(rs.getTimestamp("registered_date"));
                return fileInfo;
            }
        };
    }
}

4. Enfin

Cette fois, j'ai expliqué comment accéder au h2db intégré de spring boot en tant que DB en utilisant jdbcTemplate de spring-jdbc. Pour un accès simple à la base de données, jdbcTemplate peut être suffisant sans installer ORMapper.

Recommended Posts

Accédez au h2db intégré de Spring Boot avec jdbcTemplate
Comment utiliser h2db intégré avec Spring Boot
Une histoire remplie des bases de Spring Boot (résolu)
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Vérifions la sensation de Spring Boot + Swagger 2.0
Télécharger avec Spring Boot
Organisez les différences de comportement de @NotBlank, @NotEmpty et @NotNull avec Spring Boot + Thymeleaf
Paramètres du gestionnaire de ressources lors de la livraison du SPA avec la fonction de ressource statique de Spring Boot
Spécifiez le codage des ressources statiques dans Spring Boot
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Créer Restapi avec Spring Boot (jusqu'à l'exécution de l'application)
Comment démarrer par environnement avec Spring Boot de Maven
Contrôlez le flux de traitement Spring Batch avec JavaConfig.
[Spring Boot] L'histoire selon laquelle le bean de la classe avec l'annotation ConfigurationProperties n'a pas été trouvé
Générer un code à barres avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
À propos de la fonction de Spring Boot en raison de différentes versions
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Introduction de la bibliothèque ff4j qui réalise le basculement de fonctionnalités avec Spring Boot
Utiliser l'authentification de base avec Spring Boot
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Obtenez une instance proxy du composant lui-même dans Spring Boot
Voir le comportement de redirection relative avec le paramètre server.tomcat.use-relative-redirects dans Spring Boot
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Sortie de message (Spring boot)
Obtenez des résultats de validation avec Spring Boot
API RESTful d'autorisation d'accès au démarrage de printemps
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot