starter que persistencia mvc español java spring spring-boot

java - que - Aplicación Spring Boot con base de datos de archivos H2



spring boot starter web (1)

Estoy tratando de tener una configuración de base de datos H2 en el arranque de la aplicación de arranque de primavera. He configurado la base de datos en application.properties:

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

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

Una vez que se inicia la aplicación, debe crear la tabla Usuarios si aún no existe e insertar los usuarios en la tabla. Si la tabla ya existe, no quiero que se modifique.

  1. Obtengo una NullPointerException en jdbcTemplate.execute . ¿Cómo puedo inyectar jdbcTemplate ? Todos los ejemplos que he visto requieren que la fuente de datos se cree manualmente, y luego se crea JdbcTemplate. Sin embargo, el origen de datos en este ejemplo parece ser creado en base a los valores de application.properties.
  2. ¿Es este el enfoque correcto para configurar la base de datos (es decir, llamar a CreateH2Database después de iniciar SpringApplication)? ¿Funcionará este enfoque si quiero ejecutar la aplicación como WAR en otro servidor de aplicaciones?

Dado que está utilizando Spring Boot, debe aprovechar sus funciones de inicialización de base de datos. No es necesario implementar su propia implementación.

Todo lo que tiene que hacer es tener los archivos schema.sql y data.sql en la raíz del classpath (lo más probable debajo de /resources ). Spring Boot los detectará automáticamente y ejecutará el primero para crear la base de datos y el segundo para completarlo.

Vea this parte de la documentación de Spring Boot

Si necesita realizar la inicialización condicionalmente (quizás solo al ejecutar pruebas de integración), puede aprovechar los profiles de Spring. Lo que haría en ese caso es que el archivo de propiedades para el perfil de prueba contenga

spring.datasource.initialize=true

mientras que el archivo de propiedades para los otros perfiles contendría

spring.datasource.initialize=false