自动初始化数据、sql脚本
需求
在自动创建完表格后,我们的系统通常需要初始化数据,比如用户表,权限表等等。
实现
默认库/表数据初始化有三种方式:
✈️ 方式一:根据名称自动匹配sql脚本
具体配置见:auto-table.init-data
- 单数据源场景(系统只有一个数据源,大部分系统都是这个情况)
系统默认读取
classpath:sql
目录(支持配置项base-path更改)下的脚本,且只会在相关表创建完成时执行一次(监听了表创建的回调)- 例如
user
表对应的脚本文件是classpath:sql/user.sql
classpath
是资源根目录,在这里理解为src/main/resources目录即可
- 特殊文件
classpath:sql/_init_.sql
会在数据库表都创建完成之后执行一次_init_
为默认值,可以通过配置项default-init-file-name更改
- 例如
- 多数据源场景(有多套数据库,每个库属于一个数据源)
多数据源场景相比较单数据源,
classpath:sql
目录后紧跟了一个数据源名称,用以区分不同数据源下的脚本sql/datasource1/user.sql
-> 表示数据源datasource1
下的user
表脚本sql/datasource1.sql
-> 表示数据源datasource1
下整个数据库的相关脚本sql/datasource1/_init_.sql
-> 同样表示数据源datasource1
下整个数据库的相关脚本,其中_init_
受default-init-file-name配置影响 ^2.5.7
🚄 方式二:手动指定表的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类中定义