1.界面化执行脚本优点
-
传统执行脚本
1.人为维护数据脚本和结构脚本时,由于多人共同在一个文件中维护,容易造成脚本缺失2.准确性低:每个迭代上新条目过多时,也会容易造成出的脚本得不到更好的验证
3.对于多个租户的话,一些特殊化、基础脚本需要出N条,那麽人为去执行效率慢 -
界面化执行脚本
1.研发只需要按照一定的规则,将脚本使用git的方式放到代码中即可
2.测试在测每个条目时,都会在界面操作一下数据和结构脚本,这样脚本会极大程度得到验证
3.脚本不易丢失
4.执行脚本效率高
2.设计
首先需要设计两张表,数据脚本对应表+结构脚本对应表
1.数据脚本对应表
2.结构化脚本对应表
对应代码获取可执行的脚本:
public List<Map<String,Object>> getDataSql(RootSqlDataVO dataVO) throws CrmMessageException {
log.info("获取数据SQL开始");
URL url = this.getClass().getClassLoader().getResource("sql-data");
if(url == null) {
return null;
}
File rootDir = new File(url.getPath());
List<File> resultFiles = new ArrayList<File>();
log.info("文件列表初始化");
final String lastVersionBak = dataVO.getVersion();
if(lastVersionBak == null || lastVersionBak.length() == 0) {
log.info("lastversion为空:"+lastVersionBak);
addFile(resultFiles,rootDir);
}
else {
log.info("lastversion不为空:"+lastVersionBak);
addFile(resultFiles,rootDir,new FileFilter() {
@Override
public boolean accept(File pathname) {
return lastVersionBak.compareTo(pathname.getName().substring(0,22)) < 0;
}
});
}
if(resultFiles.size() == 0) {
throw new CrmMessageException("已经是最新版本,无需升级");
}
Collections.sort(resultFiles,new Comparator<File>(){
@Override
public int compare(File f1, File f2) {
String fileTs1 = f1.getName().substring(0,22);
String fileTs2 = f2.getName().substring(0,22);
return fileTs1.compareTo(fileTs2);
}
});
List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
for(int i=0,len=resultFiles.size();i<len;i++) {
Map<String,Object> item = new HashMap<String,Object>();
String filePath = resultFiles.get(i).getAbsolutePath();
filePath = "..." + filePath.substring(filePath.indexOf("classes")+"classes".length());
item.put("name", filePath);
result.add(item);
}
return result;
}
执行脚本:
@Transactional
public RootSqlDataVO dataSqlUp(Long id,String lastVersion) throws CrmMessageException {
if(id == null) {
//执行s下全部文件,并插入root_d
Date time = new Date();
//1、获取sql-struct下全部文件
URL url = this.getClass().getClassLoader().getResource("sql-data");
if(url == null) {
return null;
}
File rootDir = new File(url.getPath());
List<File> resultFiles = new ArrayList<File>();
addFile(resultFiles,rootDir);
Collections.sort(resultFiles,new Comparator<File>(){
@Override
public int compare(File f1, File f2) {
String fileTs1 = f1.getName().substring(0,22);
String fileTs2 = f2.getName().substring(0,22);
return fileTs1.compareTo(fileTs2);
}
});
//查询全部租户ID
Map<String,Object> tenantParam = new HashMap<String,Object>();
tenantParam.put("isInit", 2);
List<SysTenantVO> tenantVOs = dao.selectVoList(SysTenantVO.class, "selectSysTenants",tenantParam);
excuteFiles(tenantVOs,resultFiles);
//获取版本号
String version = resultFiles.get(resultFiles.size()-1).getName().substring(0,22);
RootSqlDataVO dataVO = new RootSqlDataVO();
dataVO.setLastModifyTime(time);
dataVO.setTenantId(0L);
dataVO.setVersion(version);
//为已经初始化的租住生成租户脚本版本数据
generateTeanantData(tenantVOs,dataVO);
return dao.save(dataVO);
}
else {
//执行lastModifyTime以后的全部脚本,并更新root_d
Date time = new Date();
//1、获取sql-struct下全部文件
URL url = this.getClass().getClassLoader().getResource("sql-data");
if(url == null) {
return null;
}
File rootDir = new File(url.getPath());
List<File> resultFiles = new ArrayList<File>();
final String lastVersionBak = lastVersion;
if(lastVersionBak == null || lastVersionBak.length() == 0) {
log.info("lastversion为空:"+lastVersionBak);
addFile(resultFiles,rootDir);
}
else {
log.info("lastversion不为空:"+lastVersionBak);
addFile(resultFiles,rootDir,new FileFilter() {
@Override
public boolean accept(File pathname) {
return lastVersionBak.compareTo(pathname.getName().substring(0,22)) < 0;
}
});
}
if(resultFiles.size() == 0) {
throw new CrmMessageException("已经是最新版本,无需升级");
}
log.info("当前版本:"+ lastVersionBak);
Collections.sort(resultFiles,new Comparator<File>(){
@Override
public int compare(File f1, File f2) {
String fileTs1 = f1.getName().substring(0,22);
String fileTs2 = f2.getName().substring(0,22);
return fileTs1.compareTo(fileTs2);
}
});
//查询全部租户ID
Map<String,Object> tenantParam = new HashMap<String,Object>();
tenantParam.put("isInit", 2);
List<SysTenantVO> tenantVOs = dao.selectVoList(SysTenantVO.class, "selectSysTenants",tenantParam);
excuteFiles(tenantVOs,resultFiles);
//获取版本号
String version = resultFiles.get(resultFiles.size()-1).getName().substring(0,22);
RootSqlDataVO dataVO = new RootSqlDataVO();
dataVO.setId(id);
dataVO.setLastModifyTime(time);
dataVO.setTenantId(0L);
dataVO.setVersion(version);
//批量更新查询到的租户的版本号
Map<String,Object> sqlDataParam = new HashMap<String,Object>();
sqlDataParam.put("version", version);
sqlDataParam.put("lastModifyTime", time);
List<Long> tenantIds = new ArrayList<Long>();
for(int i=0,len=tenantVOs.size();i<len;i++) {
tenantIds.add(tenantVOs.get(i).getId());
}
sqlDataParam.put("tenantIds", tenantIds);
dao.updateSql(RootSqlDataVO.class, "updateByBatch",sqlDataParam);
return super.updateVO(dataVO);
}
}
脚本规范: