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.
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.
JdbcTemplate
qui définit la partie paramètre avec? ʻAnd
NamedParameterJdbcTemplate qui définit la partie paramètre avec
: nom de paramètre`.NamedParameterJdbcTemplate
qui est hautement lisible@ Repository
est ajoutée.NamedParameterJdbcTemplate
dans la classe du référentiel avec @ Autowired
etc.@ Value
: nom de paramètre
BeanPropertySqlParameterSource
.MapSqlParameterSource
.,
DELETE, ʻUPDATE
utilise la méthode ʻupdate de
jdbcTemplate`SELECT
, utilisez RowMapper
pour mapper le résultat à une classe spécifiqueSELECT
pour obtenir une ligne utilise la méthode queryForObject
de jdbcTemplate
SELECT
pour obtenir plusieurs lignes utilise la méthode query
de jdbcTemplate
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
);
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
}
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;
}
};
}
}
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