背景
提供一个可以自动执行sql脚本的工具类,放在项目中,可以用于初始化sql脚本,支持dm,mysql等各种数据库,只要你的数据库连接正常。
注意事项
不同数据库中的语句分隔符不一样,如果sql脚本在数据库客户端能够执行,在脚本中不能执行,很有可能是分隔符的问题。
使用说明
sql脚本位置:resources/init/dm/init.sql;resources/init/mysql/init.sql
配置参数
db:
init:
db-type: dm ## dm,mysql
enabled: true ## 是否启用初始化脚本
file-names: init.sql,init_function.sql ## 初始化脚本文件名,多个文件名用逗号分隔
具体代码
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
/**
* @author zhuxuanyong
* @date 2024/01/31
* 自动初始化sql脚本
*/
@Data
@Component
public class InitSqlConfig implements InitializingBean {
@Value("${db.init.enabled:false}")
private boolean enabled;
@Value("${db.init.db-type}")
private String dbType;
@Value("${db.init.file-names}")
private String fileNames;
@Autowired
private DataSource dataSource;
@Override
public void afterPropertiesSet() {
if (enabled && StrUtil.isNotEmpty(dbType) && StrUtil.isNotEmpty(fileNames)) {
String[] split = fileNames.split(",");
for (String fileName : split) {
String sqlPath = "init/" + dbType + "/" + fileName;
if (fileName.contains("function")) {
this.initFunctionSql(sqlPath);
} else {
this.initSql(sqlPath);
}
}
}
}
private void initSql(String sqlPath) {
System.out.println("---------->初始化脚本,开始执行-->" + sqlPath);
try {
Connection conn = DataSourceUtils.getConnection(dataSource);
ClassPathResource resource = new ClassPathResource(sqlPath);
EncodedResource er = new EncodedResource(resource, "utf-8");
ScriptUtils.executeSqlScript(conn, er);
System.out.println("---------->初始化脚本,执行完成-->" + sqlPath);
} catch (Exception e) {
System.out.println("---------->初始化脚本,执行失败-->" + sqlPath + "\n" + e);
}
}
private void initFunctionSql(String sqlPath) {
System.out.println("---------->初始化脚本,开始执行-->" + sqlPath);
try {
Connection conn = DataSourceUtils.getConnection(dataSource);
ClassPathResource resource = new ClassPathResource(sqlPath);
EncodedResource er = new EncodedResource(resource, "utf-8");
ScriptUtils.executeSqlScript(conn, er, false, false, "--", ";/", "/*", "*/");
System.out.println("---------->初始化脚本,执行完成-->" + sqlPath);
} catch (Exception e) {
System.out.println("---------->初始化脚本,执行失败-->" + sqlPath + "\n" + e);
}
}
}
联系作者
如果有任何疑问,请邮件联系作者。
zhuxuanyong@163.com