Skip to content

自动初始化数据、sql脚本

需求

在自动创建完表格后,我们的系统通常需要初始化数据,比如用户表,权限表等等。

实现

默认库/表数据初始化有三种方式:

✈️ 方式一:根据名称自动匹配sql脚本

具体配置见:auto-table.init-data

  • 单数据源场景(系统只有一个数据源,大部分系统都是这个情况)

    系统默认读取classpath:sql目录(支持配置项base-path更改)下的脚本,且只会在相关表创建完成时执行一次(监听了表创建的回调)

    1. 例如 user 表对应的脚本文件是 classpath:sql/user.sql
      • classpath 是资源根目录,在这里理解为src/main/resources目录即可
    2. 特殊文件 classpath:sql/_init_.sql 会在数据库表都创建完成之后执行一次
  • 多数据源场景(有多套数据库,每个库属于一个数据源)

    多数据源场景相比较单数据源,classpath:sql目录后紧跟了一个数据源名称,用以区分不同数据源下的脚本

    1. sql/datasource1/user.sql -> 表示数据源datasource1下的user表脚本
    2. sql/datasource1.sql -> 表示数据源datasource1下整个数据库的相关脚本
    3. sql/datasource1/_init_.sql -> 同样表示数据源datasource1下整个数据库的相关脚本,其中_init_default-init-file-name配置影响 ^2.5.7

🚄 方式二:手动指定表的sql脚本

通过@AutoTableinitSql属性指定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"));
    }
}

注意

  1. 必须是静态方法
  2. 需要@InitDataList注解标注
  3. 返回值必须是List<Entity>
  4. 该方法只能在Entity类中定义