web-dev-qa-db-fra.com

Application Spring Boot avec base de données de fichiers H2

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.

  1. Je reçois un 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.
  2. Est-ce la bonne approche pour configurer la base de données (c'est-à-dire appeler un 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?
23
Jerry

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

48
geoand