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.
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.
NamedParameterJdbcTemplate
zu verwenden, das gut lesbar istNamedParameterJdbcTemplate
in die Repository-Klasse mit @ Autowired
usw.: Parametername
definiertBeanPropertySqlParameterSource
zu definieren.SELECT
SQL-Anweisung RowMapper
, um das Ergebnis einer bestimmten Klasse zuzuordnenSELECT
, um eine Zeile zu erhalten, verwendet die queryForObject
-Methode von jdbcTemplate
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
);
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
}
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;
}
};
}
}
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