Spring Boot 初始化数据

引言

在开发过程中,往往需要在系统启动时预先加载一些初始化数据,例如初始化用户、角色或者配置信息等。Spring Boot提供了多种方式来实现初始化数据的功能,本文将介绍一些常用的方法。

1. 使用SQL脚本初始化数据

Spring Boot允许在启动时执行SQL脚本来初始化数据。通过在src/main/resources目录下创建schema.sqldata.sql文件,可以分别定义数据库的表结构和初始数据。

-- schema.sql
CREATE TABLE IF NOT EXISTS user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  age INT NOT NULL
);

-- data.sql
INSERT INTO user (name, age) VALUES
  ('Alice', 25),
  ('Bob', 30),
  ('Charlie', 35);

Spring Boot会在系统启动时自动执行这些SQL脚本,初始化数据库的表结构和数据。如果希望在每次启动时都执行脚本,可以在application.properties文件中设置spring.jpa.hibernate.ddl-auto的值为none

2. 使用数据初始化器

除了通过SQL脚本来初始化数据,Spring Boot还提供了一种更灵活的方式,即使用数据初始化器。通过实现CommandLineRunner接口,并重写run方法,可以在系统启动时执行自定义的初始化逻辑。

@Component
public class DataLoader implements CommandLineRunner {

  private final UserRepository userRepository;

  public DataLoader(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  @Override
  public void run(String... args) {
    User user1 = new User("Alice", 25);
    User user2 = new User("Bob", 30);
    User user3 = new User("Charlie", 35);

    userRepository.save(user1);
    userRepository.save(user2);
    userRepository.save(user3);
  }
}

在上述代码中,我们通过UserRepository保存了三个用户对象到数据库中。Spring Boot会自动检测并执行实现了CommandLineRunner接口的类的run方法。

3. 使用初始化注解

除了使用数据初始化器外,我们还可以通过在实体类上使用@PostConstruct注解来实现初始化数据的功能。

@Entity
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String name;
  private int age;

  // constructors, getters, setters, etc.

  @PostConstruct
  public void init() {
    User user1 = new User("Alice", 25);
    User user2 = new User("Bob", 30);
    User user3 = new User("Charlie", 35);

    userRepository.save(user1);
    userRepository.save(user2);
    userRepository.save(user3);
  }
}

在上述代码中,我们通过@PostConstruct注解在实体类的init方法上执行初始化逻辑。需要注意的是,这种方式适用于实体类被管理的情况,如通过JpaRepository等保存到数据库的实体类。

总结

本文介绍了三种常用的方法来实现Spring Boot的初始化数据功能。通过SQL脚本、数据初始化器和初始化注解,可以灵活地初始化系统的初始数据。根据实际情况选择合适的方式,可以更好地满足系统的需求。

参考资料

  • [Spring Boot Documentation](
  • [Spring Boot Tutorial](
pie
    title 初始化数据方式分布图
    "SQL脚本" : 50
    "数据初始化器" : 30
    "初始化注解" : 20
gantt
    title 初始化数据甘特图

    section 初始化数据
    SQL脚本     :done,    :2019-01-01, 3d
    数据初始化器 :active,  :2019-01-04, 2d
    初始化注解   :         ,  :2019-01-06, 2d