提交 a2509a4d authored 作者: 黄承天's avatar 黄承天

[数据模型]增加修改表功能

上级 2c0fad42
......@@ -10,6 +10,7 @@ import com.tykj.workflowcore.model_layer.entity.vo.*;
import com.tykj.workflowcore.model_layer.entity.*;
import com.tykj.workflowcore.model_layer.service.ModelService;
import com.tykj.workflowcore.model_layer.utils.CreateTableUtil;
import com.tykj.workflowcore.model_layer.utils.SqlUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
......@@ -32,19 +33,19 @@ import javax.persistence.Entity;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Id;
import javax.persistence.criteria.*;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static com.tykj.workflowcore.model_layer.utils.ClassTypeLength.setLength;
import static com.tykj.workflowcore.model_layer.utils.CreateTableUtil.*;
import static com.tykj.workflowcore.model_layer.utils.HqlUtil.createQuery;
import static java.util.Objects.isNull;
/**
......@@ -365,7 +366,7 @@ public class ModelImpl implements ModelService {
@Override
public List<Map<String, Object>> findAllByName(String name) {
if (name != null && name != "") {
String sql="select * from "+name;
String sql = "select * from " + name;
return jdbcTemplate.queryForList(sql);
}
return null;
......@@ -380,6 +381,7 @@ public class ModelImpl implements ModelService {
}
return null;
}
@Override
public List<TableInfo> listAllEntities() {
return tableInfoDao.findAll();
......@@ -388,89 +390,88 @@ public class ModelImpl implements ModelService {
@Override
public void updateTable(UpdateTableInfoVO updateTableInfoVO) {
// tableInfo和columnInfo变化
//tableInfo和columnInfo变化
//查询到TableInfo和ColumnInfo
Integer dbId = updateTableInfoVO.getDbId();
TableInfo tableInfo = tableInfoDao.findById(dbId).orElseThrow(() -> new RuntimeException("未找到该id的表信息"));
tableInfo.setUpdatedTime(new Date());
TableVO tableVO = updateTableInfoVO.getTableVO();
String xml = createTable(tableVO);
//重新存xml
tableInfo.setXml(xml);
tableInfoDao.save(tableInfo);
//原来的字段信息
Specification spec = (Specification) (root, criteriaQuery, criteriaBuilder) -> {
Predicate predicate = criteriaBuilder.equal(root.get("dbId"), dbId);
return predicate;
};
List<ColumnInfo> all = columnInfoDao.findAll(spec);
//删除columnInfo
columnInfoDao.deleteInBatch(all);
TableInfo tableInfo = tableInfoDao.getOne(dbId);
tableInfo.setUpdatedTime(new Date());
List<ColumnInfo> columnInfos = columnInfoDao.findAll(spec);
//新的字段信息
List<ColumnInfo> columnInfosForSave = tableVO.getDataList().stream()
.map(columnVO -> columnInfo(tableInfo.getId(), tableInfo.getModelName(), columnVO))
.collect(Collectors.toList());
//根据ColumnInfo集合得出表实际改动的sql语句集合
List<String> sqls = getTableSqls(tableInfo.getModelName(), columnInfos, columnInfosForSave);
//执行sql语句
for (String sql : sqls) {
jdbcTemplate.execute(sql);
TableVO tableVO = updateTableInfoVO.getTableVO();
List<ColumnVO> dataList = tableVO.getDataList();
String xml = createTable(tableVO);
//重新存xml
tableInfo.setXml(xml);
tableInfoDao.save(tableInfo);
}
//重新保存字段信息
columnInfoDao.deleteInBatch(columnInfos);
columnInfosForSave.forEach(columnInfo -> columnInfoDao.save(columnInfo));
}
for (ColumnVO columnVO : dataList) {
/**
* 对象类型转换
* ColumnVo -> ColumnInfo
*/
private ColumnInfo columnInfo(Integer dbId, String dbName, ColumnVO columnVO) {
ColumnInfo columnInfo = new ColumnInfo();
columnInfo.setId(columnVO.getId());
columnInfo.setFieldName(columnVO.getFieldName());
columnInfo.setFieldType(columnVO.getFieldType());
columnInfo.setFieldLength(columnVO.getFieldLength());
columnInfo.setFieldTitle(columnVO.getFieldTitle());
setLength(columnInfo, columnVO.getFieldType());
columnInfo.setDbName(tableInfo.getModelName());
columnInfo.setDbId(tableInfo.getId());
columnInfoDao.save(columnInfo);
columnInfo.setFieldLength(columnVO.getFieldLength());
columnInfo.setDbId(dbId);
columnInfo.setDbName(dbName);
return columnInfo;
}
// #################### tableInfo和columnInfo变化结束 ###################
// 对应表真实变化
// 遍历新数据和原来数据对比=> 少了加 多了删
}
/**
* 修改列名
*
* @param tableName
* @param oldColumnName
* @param newColumnName
* 根据ColumnInfo集合得出表实际改动的sql语句集合
* 根据ColumnInfo的id来匹配字段变化
*/
private void UpdateColumnName(String tableName, String oldColumnName, String newColumnName) {
// ALTER TABLE stu rename column name to name2;
if (""!=tableName&&tableName!=null){
jdbcTemplate.execute(" ALTER TABLE " + tableName + " rename column " + oldColumnName + " to " + newColumnName + ";");
private List<String> getTableSqls(String table, List<ColumnInfo> origin, List<ColumnInfo> current) {
List<String> result = new ArrayList<>();
for (ColumnInfo columnInfo : current) {
ColumnInfo originColumnInfo = origin.stream()
.filter(columnInfo1 -> Objects.equals(columnInfo.getId(), columnInfo1.getId()))
.findAny()
.orElse(null);
if (isNull(originColumnInfo)) {
String sql = SqlUtil.addColumn(table, columnInfo.getFieldName(), columnInfo.getFieldType(), columnInfo.getFieldLength());
result.add(sql);
} else {
String sql = SqlUtil.updateColumn(table, originColumnInfo.getFieldName(), columnInfo.getFieldName(), columnInfo.getFieldType(), columnInfo.getFieldLength());
result.add(sql);
}
else {
log.info("列名:{}或者新列名:{}不合法!",oldColumnName,newColumnName);
}
for (ColumnInfo originColumnInfo : origin) {
boolean noneMatch = current.stream()
.noneMatch(columnInfo1 -> Objects.equals(originColumnInfo.getId(), columnInfo1.getId()));
if (noneMatch) {
String sql = SqlUtil.deleteColumn(table, originColumnInfo.getFieldName());
result.add(sql);
}
/**
* 删除一列
* @param tableName
* @param columnName
*/
private void delOneColumn(String tableName, String columnName) {
// ALTER TABLE fab2 DROP test1;
jdbcTemplate.execute("ALTER TABLE " + tableName + " DROP " + columnName + ";");
}
/**
* 增加一列
* @param tableName
* @param columnName
* @param type
*/
private void addOneColumn(String tableName, String columnName, String type) {
// alter table fab2 add test1 varchar(10) not Null;
jdbcTemplate.execute(" alter table "+tableName+" add "+columnName+" "+type);
for (String s : result) {
System.out.println(s);
}
return result;
}
}
package com.tykj.workflowcore.model_layer.utils;
import com.tykj.workflowcore.model_layer.entity.vo.QueryCondition;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Objects;
/**
* @author HASEE
* @author C
*/
@Slf4j
public class HqlUtil {
public static String createQuery(String tableName, List<QueryCondition> conditions) {
......
package com.tykj.workflowcore.model_layer.utils;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* @author C
*/
@Slf4j
public class SqlUtil {
/**
* java类型对应sql类型Map
*/
private static final Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "int");
TYPE_MAP.put("java.lang.Long", "bigint");
TYPE_MAP.put("java.lang.Short", "smallint");
TYPE_MAP.put("java.lang.Float", "float");
TYPE_MAP.put("java.lang.Double", "double");
TYPE_MAP.put("java.lang.BigDecimal", "numeric");
TYPE_MAP.put("java.lang.Character", "char(1)");
TYPE_MAP.put("java.lang.String", "varchar");
TYPE_MAP.put("java.lang.Byte", "tinyint");
TYPE_MAP.put("java.lang.Boolean", "bit");
TYPE_MAP.put("java.lang.Class", "varchar");
TYPE_MAP.put("java.util.Date", "date");
TYPE_MAP.put("java.util.Calendar", "timestamp");
TYPE_MAP.put("java.util.Locale", "varchar");
TYPE_MAP.put("java.util.TimeZone", "varchar");
TYPE_MAP.put("java.util.Currency", "varchar");
TYPE_MAP.put("java.sql.Date", "date");
TYPE_MAP.put("java.sql.Time", "time");
TYPE_MAP.put("java.sql.Timestamp", "timestamp");
TYPE_MAP.put("java.sql.Clob", "clob");
TYPE_MAP.put("java.sql.Blob", "blob");
}
/**
* 修改表名的SQL语句
*
* @param table 原表名
* @param newTable 新表名
* @return SQL语句
*/
public static String renameTable(String table, String newTable) {
return String.format("rename table %s to %s;", table, newTable);
}
/**
* 增加单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @param type 字段类型
* @param length 字段长度
* @return SQL语句
*/
public static String addColumn(String table, String name, String type, Integer length) {
type = TYPE_MAP.get(type);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& !Strings.isNullOrEmpty(name)
&& nonNull(type);
StringBuilder result = new StringBuilder();
if (hasValue) {
//基本部分
result.append(String.format("ALTER TABLE %s ADD COLUMN %s %s", table, name, type));
//字段长度
if (nonNull(length)) {
result.append(String.format("(%s)", length));
}
result.append(";");
return result.toString();
} else {
log.error("表名或字段名不能为空");
throw new RuntimeException("表名或字段名不能为空");
}
}
/**
* 修改表的单个字段的SQL语句
*
* @param table 表名
* @param name 旧字段名
* @param newName 新字段名
* @param newType 字段类型
* @param newLength 字段长度
* @return SQL语句
*/
public static String updateColumn(String table, String name, String newName, String newType, Integer newLength) {
newType = TYPE_MAP.get(newType);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& nonNull(newType);
StringBuilder result = new StringBuilder();
if (hasValue) {
if (isNull(newName)) {
result.append(String.format("ALTER TABLE %s MODIFY %s %s", table, name, newType));
} else {
result.append(String.format("ALTER TABLE %s CHANGE COLUMN %s %s %s", table, name, newName, newType));
}
if (nonNull(newLength)) {
result.append(String.format("(%s)", newLength));
}
} else {
log.error("参数缺失");
}
result.append(";");
return result.toString();
}
/**
* 删除单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @return SQL语句
*/
public static String deleteColumn(String table, String name) {
return String.format("ALTER TABLE %s DROP %s;", table, name);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论