提交 382b2cc7 编写于 作者: Tyl666's avatar Tyl666

【Liquibase逆向工程】第二版 优化内容

上级 b3937928
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.lite.extensions.domain.Setting;
import cn.ibizlab.core.lite.extensions.domain.SysModel;
import cn.ibizlab.core.lite.extensions.service.LiteCoreService;
import cn.ibizlab.core.lite.service.IDstDataSourceService;
import cn.ibizlab.core.lite.service.impl.DstDataSourceServiceImpl;
import cn.ibizlab.util.domain.LiquibaseProp;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.BasicDataSourceCreator;
......@@ -10,6 +13,7 @@ import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import liquibase.integration.spring.GenerateLiquibaseChangeLog;
import lombok.extern.slf4j.Slf4j;
import cn.ibizlab.core.lite.domain.DstDataSource;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -19,9 +23,12 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Primary;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.*;
import static cn.ibizlab.core.lite.extensions.util.LiteStorage.parseDatasource;
/**
* 实体[数据源] 自定义服务对象
*/
......@@ -34,6 +41,11 @@ public class DstDataSourceExService extends DstDataSourceServiceImpl {
protected Class currentModelClass() {
return com.baomidou.mybatisplus.core.toolkit.ReflectionKit.getSuperClassGenericType(this.getClass().getSuperclass(), 1);
}
@Resource
public LiteCoreService liteCoreService;
@Resource
public GenerateLiquibaseChangeLog generateLiquibaseChangeLog;
/**
* [BuildDS:buildDS] 行为扩展
......@@ -130,5 +142,24 @@ public class DstDataSourceExService extends DstDataSourceServiceImpl {
return true;
}
@Override
@Transactional
public DstDataSource initDS(DstDataSource et) {
DstDataSource ds = get(et.getDsId());
String datasourceMessage = ds.getDsCfg();
Map datasourceMap = parseDatasource(datasourceMessage);
LiquibaseProp lp = new LiquibaseProp();
lp.setUsername(datasourceMap.get("username") == null?"":datasourceMap.get("username").toString());
lp.setPassword(datasourceMap.get("password") == null?"":datasourceMap.get("password").toString());
lp.setUrl(datasourceMap.get("url") == null?"":datasourceMap.get("url").toString());
lp.setDefaultSchema(datasourceMap.get("defaultSchema") == null?"":datasourceMap.get("defaultSchema").toString());
// 调用liquibase逆向工程的逻辑,生成一个xml,并返回一个SysModel对象
SysModel sysModel = generateLiquibaseChangeLog.liquibaseGenerateChangeLog(lp,ds.getDsId());
liteCoreService.syncSysModel(sysModel);
return et;
}
}
package cn.ibizlab.core.lite.service.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Collection;
import java.util.Objects;
import java.util.Optional;
import java.math.BigInteger;
import cn.ibizlab.core.lite.extensions.domain.SysModel;
import cn.ibizlab.core.lite.extensions.service.LiteCoreService;
import liquibase.integration.spring.GenerateLiquibaseChangeLog;
import cn.ibizlab.util.domain.LiquibaseProp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.util.ObjectUtils;
import org.springframework.beans.factory.annotation.Value;
import cn.ibizlab.util.errors.BadRequestAlertException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Lazy;
import cn.ibizlab.core.lite.domain.DstDataSource;
......@@ -23,16 +30,16 @@ import cn.ibizlab.core.lite.filter.DstDataSourceSearchContext;
import cn.ibizlab.core.lite.service.IDstDataSourceService;
import cn.ibizlab.util.helper.CachedBeanCopier;
import cn.ibizlab.util.helper.DEFieldCacheMap;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.ibizlab.core.lite.mapper.DstDataSourceMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.alibaba.fastjson.JSONObject;
import javax.annotation.Resource;
import static cn.ibizlab.core.lite.extensions.util.LiteStorage.parseDatasource;
import org.springframework.util.StringUtils;
/**
* 实体[数据源] 服务对象接口实现
......@@ -46,11 +53,6 @@ public class DstDataSourceServiceImpl extends ServiceImpl<DstDataSourceMapper, D
protected cn.ibizlab.core.lite.service.IMetaEntityService metaentityService;
protected int batchSize = 500;
@Resource
public LiteCoreService liteCoreService;
@Resource
public GenerateLiquibaseChangeLog generateLiquibaseChangeLog;
@Override
@Transactional
......@@ -129,20 +131,7 @@ public class DstDataSourceServiceImpl extends ServiceImpl<DstDataSourceMapper, D
@Override
@Transactional
public DstDataSource initDS(DstDataSource et) {
DstDataSource ds = get(et.getDsId());
String datasourceMessage = ds.getDsCfg();
Map datasourceMap = parseDatasource(datasourceMessage);
LiquibaseProp lp = new LiquibaseProp();
lp.setUsername(datasourceMap.get("username") == null?"":datasourceMap.get("username").toString());
lp.setPassword(datasourceMap.get("password") == null?"":datasourceMap.get("password").toString());
lp.setUrl(datasourceMap.get("url") == null?"":datasourceMap.get("url").toString());
lp.setDefaultSchema(datasourceMap.get("defaultSchema") == null?"":datasourceMap.get("defaultSchema").toString());
// 调用liquibase逆向工程的逻辑,生成一个xml,并返回一个SysModel对象
SysModel sysModel = generateLiquibaseChangeLog.liquibaseGenerateChangeLog(lp,ds.getDsId());
liteCoreService.syncSysModel(sysModel);
//自定义代码
return et;
}
......
......@@ -9,23 +9,15 @@ import cn.ibizlab.core.lite.extensions.domain.MetaEntityModel;
import cn.ibizlab.core.lite.extensions.domain.SysModel;
import cn.ibizlab.util.domain.LiquibaseProp;
import com.alibaba.fastjson.JSON;
import liquibase.CatalogAndSchema;
import liquibase.Liquibase;
import liquibase.configuration.GlobalConfiguration;
import liquibase.configuration.LiquibaseConfiguration;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.diff.output.DiffOutputControl;
import liquibase.diff.output.StandardObjectChangeFilter;
import liquibase.exception.DatabaseException;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.executor.ExecutorService;
import liquibase.integration.ant.type.ChangeLogOutputFile;
import liquibase.integration.commandline.CommandLineUtils;
import cn.ibizlab.core.util.config.LiquibaseGenerateConfiguration;
import liquibase.resource.ResourceAccessor;
import liquibase.structure.DatabaseObject;
import liquibase.util.StringUtils;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
......@@ -51,8 +43,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
public class GenerateLiquibaseChangeLog{
private Set<ChangeLogOutputFile> changeLogOutputFiles = new LinkedHashSet<>();
private String includeObjects;
private String excludeObjects;
private DataSource dataSource;
@Value("${ibiz.filePath:/app/file/}")
......@@ -109,13 +99,11 @@ public class GenerateLiquibaseChangeLog{
public SysModel generateSysModel(String path) {
List<MetaEntityModel> metaEntityModels = new CopyOnWriteArrayList<>();
List<Map> primaryKeys = new CopyOnWriteArrayList<>();
SysModel sysModel = new SysModel();
MetaEntityModel metaEntityModel = null;
List<Map> commonMessage = null;
MetaField metaField = null;
List<Map> column = null;
// Map primaryKey = null;
Map head = null;
Map temp = null;
......@@ -128,13 +116,6 @@ public class GenerateLiquibaseChangeLog{
sysModel.setSystemid((String) commonMessage.get(0).get("author"));
sysModel.setSystemname((String) commonMessage.get(0).get("author"));
}
// for (int k = 0 ; k < commonMessage.size(); k++) {
// // 维护主键组
// primaryKey = (Map) commonMessage.get(k).get("addPrimaryKey");
// if (!ObjectUtil.isEmpty(primaryKey)) {
// primaryKeys.add(primaryKey);
// }
// }
// 第三层 获取实体对象List 在这层还可以放入subEntitys、parentEntitys等关系字段
for (int i = 0;i < commonMessage.size(); i++) {
// createTable主要存储了表明以及字段属性,只要crateTable属性,其余剔除
......@@ -162,7 +143,6 @@ public class GenerateLiquibaseChangeLog{
metaField.setDataType(column.get(j).get("type") == null? "" : fieldToName(column.get(j).get("type").toString()));
metaField.setDataLength(column.get(j).get("type") == null? 0 : fieldToLenth(column.get(j).get("type").toString()));
metaField.setNullable(column.get(j).get("constraints") != null ? 1 : 0);
// metaField.setKeyField(isPrimaryKey(primaryKeys,column.get(j).get("name") == null? "" : column.get(j).get("name").toString()) ? 1 : 0);
metaField.setKeyField(column.get(j).get("primaryKey") != null ? 1 : 0);
metaField.setPhysicalField(1);
metaFields.add(metaField);
......@@ -173,16 +153,6 @@ public class GenerateLiquibaseChangeLog{
}
return sysModel;
}
// public static boolean isPrimaryKey(List<Map> primaryKeys,String primaryKey) {
// boolean flag = false;
// for (int i = 0; i < primaryKeys.size(); i++) {
// if (primaryKey.equals(primaryKeys.get(i).get("columnNames"))) {
// flag = true;
// break;
// }
// }
// return flag;
// }
private static Integer fieldToLenth(String s) {
if(s.contains("(")) {
String newStr = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
......@@ -197,15 +167,6 @@ public class GenerateLiquibaseChangeLog{
}
return s;
}
Class[] snapshotTypes;
private Class[] getTypes(Set<Class<? extends DatabaseObject>> types){
this.snapshotTypes = new Class[types.size()];
int i = 0;
for (Class<? extends DatabaseObject> type : types) {
this.snapshotTypes[i++] = type;
}
return snapshotTypes;
}
public static String ConvertXMLtoJSON(String path) {
InputStream is = null;
......@@ -224,51 +185,6 @@ public class GenerateLiquibaseChangeLog{
return null;
}
public SpringLiquibase.SpringResourceOpener createResourceOpener() {
return new SpringLiquibase().new SpringResourceOpener(getLiquibasePath());
}
public String getLiquibasePath() {
return liquibasePath;
}
private DiffOutputControl getDiffOutputControl() {
DiffOutputControl diffOutputControl = new DiffOutputControl(includeCatalog, includeSchema, includeTablespace, null);
if ((excludeObjects != null) && (includeObjects != null)) {
throw new UnexpectedLiquibaseException("Cannot specify both excludeObjects and includeObjects");
}
if (excludeObjects != null) {
diffOutputControl.setObjectChangeFilter(new StandardObjectChangeFilter(StandardObjectChangeFilter.FilterType.EXCLUDE, excludeObjects));
}
if (includeObjects != null) {
diffOutputControl.setObjectChangeFilter(new StandardObjectChangeFilter(StandardObjectChangeFilter.FilterType.INCLUDE, includeObjects));
}
return diffOutputControl;
}
private String getOutputEncoding(ChangeLogOutputFile changeLogOutputFile) {
String encoding = changeLogOutputFile.getEncoding();
return (encoding == null) ? getDefaultOutputEncoding() : encoding;
}
protected String getDefaultOutputEncoding() {
LiquibaseConfiguration liquibaseConfiguration = LiquibaseConfiguration.getInstance();
GlobalConfiguration globalConfiguration = liquibaseConfiguration.getConfiguration(GlobalConfiguration.class);
return globalConfiguration.getOutputEncoding();
}
private Liquibase createLiquibase(String changeLogFile, ResourceAccessor resourceAccessor) {
Database database =getDataBase();
ExecutorService.getInstance().clearExecutor(database);
database.resetInternalState();
return new Liquibase(changeLogFile, resourceAccessor, database);
}
private CatalogAndSchema buildCatalogAndSchema(Database database) {
return new CatalogAndSchema(database.getDefaultCatalogName(), database.getDefaultSchemaName());
}
@SneakyThrows
public Database getDataBase(){
Connection connection = null;
......@@ -296,10 +212,7 @@ public class GenerateLiquibaseChangeLog{
}
return database;
}
public DataSource getDataSource() {
return dataSource;
}
}
......@@ -109,7 +109,11 @@ ribbon:
ibiz:
enablePermissionValid: true
cacheLevel: L1 #(L1)一级本地caffeine缓存;(L2)caffeine缓存+Redis缓存
generateDs:
catalogName: ""
generateField: tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints
includeCatalog: false
includeTablespace: true
### jobs
jobs:
#admin-address: http://127.0.0.1:40005
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册