Tôi đang cố gắng thiết lập cơ sở dữ liệu H2 khi khởi động ứng dụng khởi động mùa xuân. Tôi đã cấu hình cơ sở dữ liệu trong application.properties:Ứng dụng khởi động mùa xuân với cơ sở dữ liệu tệp H2
spring.datasource.url = jdbc:h2:file:~/testdb
spring.datasource.username = sa
spring.datasource.password = sa
spring.datasource.driverClassName = org.h2.Driver
File 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]);
}
}
}
Một khi ứng dụng được khởi động nó sẽ tạo ra Bảng người dùng nếu nó chưa tồn tại và chèn người dùng vào bảng. Nếu bảng đã tồn tại, tôi không muốn nó được sửa đổi.
- Tôi nhận được
NullPointerException
trênjdbcTemplate.execute
. Làm cách nào để có được tiêmjdbcTemplate
? Tất cả các ví dụ tôi đã thấy yêu cầu nguồn dữ liệu được tạo bằng tay, và sau đó JdbcTemplate được tạo ra. Tuy nhiên, nguồn dữ liệu trong ví dụ này dường như được tạo dựa trên các giá trị application.properties. - Đây có phải là phương pháp đúng để thiết lập cơ sở dữ liệu (tức là gọi
CreateH2Database
sau khi bắt đầu SpringApplication) không? Cách tiếp cận này sẽ hoạt động nếu tôi muốn chạy ứng dụng như một WAR trên một máy chủ ứng dụng khác?
Cảm ơn phản hồi của bạn. Tôi đã thử thêm các tệp 'schema.sql' và' data.sql'. Tuy nhiên, điều này sẽ tải dữ liệu từ 'data.sql' mỗi khi ứng dụng được khởi động. Tôi cần kích hoạt điều này nếu dữ liệu chưa được điền để thêm vào. Có cách nào để xác định các điều kiện như vậy khi khởi động không? – Jerry
Nếu tôi có bài kiểm tra đơn vị và tích hợp và muốn chạy cả hai thì sao? Tại thời điểm này tôi có thể chạy một số bài kiểm tra tích hợp nhưng khi tôi thêm một bài kiểm tra đơn vị nó không thành công và cho tôi biết bảng đã tồn tại. – tObi
@tobi Thật tuyệt vời khi thấy chính xác trường hợp của bạn trông như thế nào. Bạn có thể tạo một câu hỏi mới với tất cả các chi tiết có liên quan và đăng liên kết tại đây không? Cảm ơn – geoand