自动初始化数据、sql脚本
需求
在自动创建完表格后,我们的系统通常需要初始化数据,比如用户表,权限表等等。
实现
默认库/表数据初始化有三种方式:
✈️ 方式一:根据名称自动匹配sql脚本
具体配置见:auto-table.recordSql
- 单数据源场景(没有指定数据源的情况)
sql/user.sql
-> 指定user表的脚本(只会在指定表创建完成后执行一次)sql/_init_.sql
-> 表示整个库的相关脚本(只会在库创建后,且所有表创建完成后执行一次)_init_
为默认值,可以通过配置项default-init-file-name更改
- 多数据源场景(有多套数据库,每个库属于一个数据源)
sql
/datasource1/user.sql -> 表示数据源datasource1
下的user
表脚本(只会在指定表创建完成后执行一次)sql
/datasource1.sql -> 表示数据源datasource1
下整个数据库的相关脚本(只会在库创建后,且所有表创建完成后执行一次)
🚄 方式二:手动指定表的sql脚本
通过
@AutoTable
的initSql
属性指定sql脚本位置
java
@AutoTable(comment = "自定义sql文件初始化数据", initSql = "classpath:customize_path/InitDataCustomizeFile.sql")
public class InitDataCustomizeFile {
private String name;
}
多库适配
initSql的值支持当前数据库类型{dialect}
作为参数
示例:
classpath:path/
{dialect}
/user.sql
不同数据库实际存在的文件为:
classpath:path/Mysql/user.sql
classpath:path/Oralce/user.sql
🚤 方式三:通过代码构建数据集合
通过
@InitDataList
注解指定java方法返回的数据集合。
java
@NoArgsConstructor
@AllArgsConstructor
@AutoTable(comment = "用java方法初始化数据")
public class InitDataJavaMethod {
private String name;
@InitDataList
public static List<InitDataJavaMethod> getInitData() {
return Arrays.asList(new InitDataJavaMethod("zhang"), new InitDataJavaMethod("li"));
}
@InitDataList
private static List<InitDataJavaMethod> getInitData2() {
return Arrays.asList(new InitDataJavaMethod("wang"), new InitDataJavaMethod("liu"));
}
}
注意
- 必须是静态方法
- 需要
@InitDataList
注解标注 - 返回值必须是List<Entity>
- 该方法只能在Entity类中定义