数据初始化
在自动创建完表格后,系统通常需要初始化数据,比如用户表、权限表等。
三种初始化方式
方式一:自动匹配 SQL 脚本
单数据源场景
系统默认读取 classpath:sql 目录下的脚本,只会在相关表创建完成时执行一次。
src/main/resources/
└── sql/
├── user.sql # user 表初始化数据
├── role.sql # role 表初始化数据
└── _init_.sql # 所有表创建完成后执行配置项
base-path:修改脚本根目录,默认classpath:sqldefault-init-file-name:修改全局初始化文件名,默认_init_
多数据源场景
src/main/resources/
└── sql/
├── datasource1/
│ ├── user.sql # datasource1 的 user 表
│ └── _init_.sql # datasource1 整库初始化
└── datasource2/
├── order.sql # datasource2 的 order 表
└── _init_.sql # datasource2 整库初始化方式二:手动指定 SQL 脚本
通过 @AutoTable 的 initSql 属性指定 SQL 脚本位置。
java
@AutoTable(
comment = "自定义sql文件初始化数据",
initSql = "classpath:customize_path/InitData.sql"
)
public class InitDataCustomizeFile {
private String name;
}多库适配
initSql 支持 {dialect} 占位符,自动匹配当前数据库类型:
java
@AutoTable(initSql = "classpath:sql/{dialect}/user.sql")
public class User {
// ...
}方式三:Java 方法返回数据
通过 @InitDataList 注解指定 Java 方法返回的数据集合。
java
@Data
@NoArgsConstructor
@AllArgsConstructor
@AutoTable(comment = "用 Java 方法初始化数据")
public class InitDataJavaMethod {
private String name;
@InitDataList
public static List<InitDataJavaMethod> getInitData() {
return Arrays.asList(
new InitDataJavaMethod("张三"),
new InitDataJavaMethod("李四")
);
}
@InitDataList
private static List<InitDataJavaMethod> getMoreData() {
return Arrays.asList(
new InitDataJavaMethod("王五"),
new InitDataJavaMethod("赵六")
);
}
}注意事项
- 必须是静态方法
- 需要
@InitDataList注解标注 - 返回值必须是
List<Entity> - 该方法只能在实体类中定义
执行时机
关键点:
- 初始化数据只在表创建时执行一次
- 表已存在时,不会重复执行
- 通过监听
CreateTableFinishCallback回调触发
