Skip to content

自动初始化数据、sql脚本

需求

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

实现

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

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

具体配置见:auto-table.recordSql

  • 单数据源场景(没有指定数据源的情况)
    1. sql/user.sql -> 指定user表的脚本(只会在指定表创建完成后执行一次)
      • sql目录支持配置项base-path更改
      • base-path配置,支持多库适配的模式,引入了{dialect}变量
    2. sql/_init_.sql -> 表示整个库的相关脚本(只会在库创建后,且所有表创建完成后执行一次)
  • 多数据源场景(有多套数据库,每个库属于一个数据源)
    1. sql/datasource1/user.sql -> 表示数据源datasource1下的user表脚本(只会在指定表创建完成后执行一次)
    2. sql/datasource1.sql -> 表示数据源datasource1下整个数据库的相关脚本(只会在库创建后,且所有表创建完成后执行一次)

🚄 方式二:手动指定表的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类中定义