Sql-生成器
背景
在工作当中,会遇到上线前需要初始化数据或上线后线上数据不正确、数据需要清洗等,对于复杂的场景需要写脚本来支持,对于简单的场景往往是写 sql 人工执行,数据的来源往往是某个文件,通过文件解析成对应的 sql,时间一长,每次发生这种事情就会产生不必要的工作量,所以本项目把解析、生产对应的 sql,抽象成对应工具库,提高开发效率
工作当中都有哪些痛点
- 线上数据不正确,需要更改成正确的
- 业务甩给开发一个文件,让线上的数据和文件中某些数据保持一致
- 上线前,需要初始化一批业务数据或需要修复一批数据,和本次上线的功能兼容
平常是如何解决的
写个 Sql 生成类,解析文件,生成 sql,这个过程会产生几个问题:
- 每次需要重新写代码,反复测试
- 耗费时间
- 代码得不到复用
本方案是如何解决的
抽象 Sq l 生成过程,其中为资源的加载、解析、数据格式化、展示,这几个部分可以独立扩展。
使用指南
Maven:
<dependency>
<groupId>com.github.rrsunhome</groupId>
<artifactId>excelsql-generate</artifactId>
<version>2.1.0</version>
</dependency>
Builder API 使用
如果没有解析配置,以下几行代码就可以满足
SqlGeneratorBuilder.newBuilder()
.classPath("order-v1.xlsx")
.configureSqlFormatStrategy() // 配置 Sql 格式化策略
.propertyPlaceholder() // 基于属性占位符格式化
.propertyPlaceholderSql("insert into table(a,b,c) values({0},{1},{2});") // {cellIndex} cellIndex 为列下标
.autoAddDoubleQuotes() // 自动添加 ''
.buildFormat()
.build()
.execute()// 执行
.outputView(); // 输出到视图,默认控制台
加载步骤:
- 资源路径 : classPath、本地 file
- 资源解析配置: 默认对数据不做任何处理,可以为
- 数据格式化策略: 基于属性占位符格式化,其中 { } 大括号中下标为纵坐标
- 数据输出结果:默认展示到控制台,可以扩展
- 具体构建过程可以参以下代码部分
Builder API 代码部分
public class SqlGeneratorBuilder {
private Resource resource;
private BaseParserConfig parserConfig;
private FileParser fileParser;
private RowFormatterStrategyBuilder outputSqlFormatBuilder;
public static SqlGeneratorBuilder newBuilder() {
return new SqlGeneratorBuilder();
}
public SqlGeneratorBuilder resource(Resource resource) {
this.resource = resource;
return this;
}
public SqlGeneratorBuilder filePath(String path) {
this.resource = new FileSystemResource(path);
return this;
}
public SqlGeneratorBuilder classPath(String path) {
this.resource = new ClassPathResource(path);
return this;
}
public SqlGeneratorBuilder parserConfig(BaseParserConfig parserConfig) {
this.parserConfig = parserConfig;
return this;
}
public SqlGeneratorBuilder resourceParser(FileParser fileParser) {
this.fileParser = fileParser;
return this;
}
public RowFormatterStrategyBuilder configureSqlFormatStrategy() {
RowFormatterStrategyBuilder outputSqlFormatBuilder = new RowFormatterStrategyBuilder(this);
this.outputSqlFormatBuilder = outputSqlFormatBuilder;
return outputSqlFormatBuilder;
}
public SqlGenerator build() {
String extension = resource.getExtension();
if (fileParser == null) {
fileParser = FileParserFactory.INSTANCE.findFileParser(extension);
}
if (fileParser == null) {
throw new RuntimeException("Resource parser cannot be empty.");
}
if (parserConfig == null) {
parserConfig = fileParser.getDefaultParserConfig();
}
if (!parserConfig.getClass().equals(fileParser.getDefaultParserConfig().getClass())) {
throw new RuntimeException("Incorrect parser configuration type.");
}
return new DefaultSqlGenerator(resource, parserConfig, fileParser, outputSqlFormatBuilder.build());
}
}
\
网友评论