J'essaie d'avoir une configuration de base de données H2 au démarrage de l'application Spring Boot. J'ai configuré la base de données dans application.properties:
spring.datasource.url = jdbc:h2:file:~/testdb
spring.datasource.username = sa
spring.datasource.password = sa
spring.datasource.driverClassName = org.h2.Driver
Le fichier Application.Java:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
CreateH2Database createH2Database = new CreateH2Database();
createH2Database.create();
}
}
CreateH2Database.Java:
public class CreateH2Database {
private Logger log = Logger.getLogger(CreateH2Database.class);
@Autowired
protected JdbcTemplate jdbcTemplate;
public void create() {
log.info("Creating H2 Database");
createUsers();
}
private void createUsers() {
log.info("Creating users table");
jdbcTemplate.execute("create table if not exists users (id serial, first_name varchar(255), last_name varchar(255))");
String[] names = "John Woo;Jeff Dean;Josh Bloch;Josh Long".split(";");
for (String fullname : names) {
String[] name = fullname.split(" ");
log.info("Inserting user record for " + name[0] + " " + name[1] + "\n");
jdbcTemplate.update(
"INSERT INTO users(first_name,last_name) values(?,?)",
name[0], name[1]);
}
}
}
Une fois l'application démarrée, elle doit créer la table Utilisateurs si elle n'existe pas déjà et insérer les utilisateurs dans la table. Si la table existe déjà, je ne veux pas qu'elle soit modifiée.
NullPointerException
sur jdbcTemplate.execute
. Comment puis-je obtenir le jdbcTemplate
injecté? Tous les exemples que j'ai vus nécessitent que la source de données soit créée manuellement, puis le JdbcTemplate est créé. Cependant, la source de données dans cet exemple semble être créée en fonction des valeurs application.properties.CreateH2Database
après le démarrage de SpringApplication)? Cette approche fonctionnera-t-elle si je veux exécuter l'application en tant que WAR sur un autre serveur d'applications?Puisque vous utilisez Spring Boot, vous devez profiter de ses fonctionnalités d'initialisation de base de données. Il n'est pas nécessaire de déployer votre propre implémentation.
Il vous suffit d'avoir les fichiers schema.sql
et data.sql
à la racine du chemin de classe (très probablement sous /resources
). Spring Boot les détectera automatiquement et exécutera la première afin de créer la base de données et la seconde pour la remplir.
Consultez ceci une partie de la documentation Spring Boot
Si vous devez effectuer l'initialisation de manière conditionnelle (peut-être uniquement lors de l'exécution de tests d'intégration), vous pouvez bénéficier de Spring profiles . Dans ce cas, vous feriez en sorte que le fichier de propriétés du profil de test contienne
spring.datasource.initialize=true
tandis que le fichier de propriétés des autres profils contiendrait
spring.datasource.initialize=false