2014-07-07 17 views
22

Próbuję mieć konfigurację bazy danych H2 podczas uruchamiania aplikacji rozruchowej. Mam skonfigurowane bazy danych w application.properties:Aplikacja Spring Boot z bazą danych pliku H2

spring.datasource.url = jdbc:h2:file:~/testdb 
spring.datasource.username = sa 
spring.datasource.password = sa 
spring.datasource.driverClassName = org.h2.Driver 

Plik 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]); 
      } 
     } 
    } 

Po uruchomieniu aplikacji należy utworzyć Tabela użytkowników, jeśli jeszcze nie istnieje, i wstaw użytkowników do tabeli. Jeśli tabela już istnieje, nie chcę jej modyfikować.

  1. Dostaję NullPointerException na jdbcTemplate.execute. Jak mogę uzyskać wstrzyknięcie jdbcTemplate? Wszystkie przykłady, jakie widziałem, wymagają ręcznego utworzenia źródła danych, a następnie utworzenia JdbcTemplate. Jednak źródło danych w tym przykładzie wydaje się być tworzone na podstawie wartości application.properties.
  2. Czy to jest prawidłowe podejście do konfiguracji bazy danych (np. Wywołanie CreateH2Database po uruchomieniu SpringApplication)? Czy to podejście zadziała, jeśli chcę uruchomić aplikację jako WAR na innym serwerze aplikacji?

Odpowiedz

46

Ponieważ używasz Spring Boot, powinieneś skorzystać z jego funkcji inicjalizacji bazy danych. Nie ma potrzeby wdrażania własnej implementacji.

Wszystko, co musisz zrobić, to pliki schema.sql i data.sql w katalogu głównym ścieżki klas (najprawdopodobniej pod /resources). Spring Boot automatycznie wykryje te i uruchomi pierwszą, aby utworzyć bazę danych, a druga ją zapełni.

Wyjazd this częścią dokumentacji Wiosna Boot

Jeśli trzeba wykonać inicjalizację warunkowo (chyba tylko przy uruchamianiu testów integracyjnych), można zaletą Wiosna profiles. Co byś zrobił w takiej sytuacji, to mieć plik właściwości dla profilu testowym zawierać

spring.datasource.initialize=true

natomiast plik właściwości dla innych profili zawierałby

spring.datasource.initialize=false

+0

Dzięki za odpowiedź. Próbowałem wcześniej dodać pliki 'schema.sql' i' data.sql'. Jednak spowoduje to załadowanie danych z 'data.sql' przy każdym uruchomieniu aplikacji. Muszę to aktywować, jeśli dane nie zostały wypełnione, aby je dodać. Czy istnieje sposób na określenie warunków takich jak przy starcie? – Jerry

+0

Co, jeśli mam testy jednostkowe i integracyjne i chcę je uruchomić? W tej chwili mogę uruchomić kilka testów integracyjnych, ale kiedy dodaję test jednostkowy, to zawiedzie i mówi mi, że tabela już istnieje. – tObi

+0

@tobi Byłoby miło zobaczyć dokładnie, jak wygląda twoja sprawa. Czy mógłbyś utworzyć nowe pytanie ze wszystkimi istotnymi szczegółami i opublikować link tutaj? Dzięki – geoand

Powiązane problemy