[JAVA] Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu

1. Zuallererst

Dieses Mal möchte ich erklären, wie Sie mit jdbcTemplate von spring-jdbc auf den integrierten h2db von spring boot als DB zugreifen können. Es wird jedoch fast nicht über h2db gesprochen, sondern lediglich über die Verwendung von jdbcTemplate. Informationen zur Vorbereitung des integrierten h2db finden Sie unter "Verwendung des integrierten h2db mit Spring Boot".

Wenn Sie mit einem anderen ORMapper anstelle von jdbcTemplate auf die Datenbank zugreifen möchten, lesen Sie bitte den folgenden Artikel.

2. Punkte des DB-Zugriffs durch JdbcTemplate

Die Punkte beim Zugriff auf die Datenbank mit "JdbcTemplate" sind unten aufgeführt. Wenn es sich um eine grundlegende CRUD handelt, denke ich, dass die hier gezeigten Inhalte ausreichend sind.

3. Probe

3.1. Tabellendefinition

Beim Spring Boot wird die Datei schema.sql direkt unter dem Klassenpfad beim Start automatisch ausgeführt. Beschreiben Sie die Anweisung CREATE TABLE der Tabelle, die dieses Mal in dieser Datei verwendet werden soll. Informationen zum Datentyp von h2db finden Sie in den folgenden offiziellen Richtlinien. 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 Zuordnende Klassen

Definieren Sie die Klasse, die der Tabelle zugeordnet werden soll. Es ist jedoch eine gewöhnliche POJO-Klasse.

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. Repository-Klasse

Definieren Sie die Haupt-Repository-Klasse für diesen Artikel. Die Punkte sind wie in "[2. DB-Zugriffspunkte von JdbcTemplate](# 2-db-Zugriffspunkte von jdbctemplate)" beschrieben.

** Als Vorsichtsmaßnahme für die Implementierung wird "org.springframework.dao.EmptyResultDataAccessException" angezeigt, wenn 0 Suchergebnisse vorhanden sind. Dieses Mal wird, wie bei anderen ORMappern, bei 0 Fällen "null" zurückgegeben. ** **.

Es ist unsere Bequemlichkeit, "DataAccessException" in "DemoSystemException" zu verpacken. Es hängt nicht direkt mit der Verwendung von jdbcTemplate zusammen.

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. Schließlich

Dieses Mal habe ich erklärt, wie Sie mit jdbcTemplate von spring-jdbc auf den integrierten h2db von spring boot als DB zugreifen können. Für einen einfachen DB-Zugriff kann jdbcTemplate ausreichen, ohne ORMapper zu installieren.

Recommended Posts

Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
Verwendung des eingebauten h2db mit Federstiefel
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Mit Spring Boot herunterladen
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot
Geben Sie die statische Ressourcencodierung in Spring Boot an
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Erstellen Sie Restapi mit Spring Boot (bis zum Ausführen der App)
Booten nach Umgebung mit Spring Boot of Maven
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
[Spring Boot] Die Geschichte, dass die Bean der Klasse mit der Annotation ConfigurationProperties nicht gefunden wurde
Generieren Sie mit Spring Boot einen Barcode
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Einführung der Bibliothek ff4j, die Feature Toggle mit Spring Boot realisiert
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Erstellen Sie eine App mit Spring Boot 2
Hot Deploy mit Spring Boot-Entwicklung
Datenbankverknüpfung mit doma2 (Spring Boot)
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Siehe das relative Umleitungsverhalten mit der Einstellung server.tomcat.use-relative-redirects in Spring Boot
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erstellen Sie eine Anfrage-App mit Spring Boot
Nachricht erlöschen (Spring Boot)
Erhalten Sie Validierungsergebnisse mit Spring Boot
Spring Boot Access Authorization RESTful API
(Intellij) Hallo Welt mit Spring Boot
Erstellen Sie eine App mit Spring Boot
Google Cloud Platform mit Spring Boot 2.0.0
Ich habe GraphQL mit Spring Boot ausprobiert
[Java] LINE-Integration mit Spring Boot