package cn.eangaie.cloud.wx3562;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
import static java.lang.Character.isUpperCase;
public class EntityToTable {
static List<String> typeList = new ArrayList<>();
public static void main(String[] args) throws ClassNotFoundException {
EntityToTable entityToTable = new EntityToTable();
String packageTitle = "cn.eangaie.cloud.wx3562.entity.";
String packagePath = "E:\\workspace\\kehu\\3562\\wx3562-backend\\cloud-wx3562\\src\\main\\java\\cn\\eangaie\\cloud\\wx3562\\entity";
List<String> tableArr = getTableArr(packagePath);
for (String tb : tableArr) {
String sql = entityToTable.generateTableMysql(packageTitle + tb, true);
Console.log(sql);
}
Console.log("typeList", typeList);
}
private static List<String> getTableArr(String packagePath) {
return FileUtil.listFileNames(packagePath).stream().map(o -> o.substring(0, o.length() - 5)).collect(Collectors.toList());
}
private static final Map<String, String> dataTypeMap = new HashMap<>();
static {
dataTypeMap.put("java.lang.String", "VARCHAR(255)");
dataTypeMap.put("int", "INT");
dataTypeMap.put("java.lang.Integer", "INT");
dataTypeMap.put("long", "BIGINT");
dataTypeMap.put("java.lang.Long", "BIGINT");
dataTypeMap.put("float", "FLOAT");
dataTypeMap.put("java.lang.Float", "FLOAT");
dataTypeMap.put("double", "DOUBLE");
dataTypeMap.put("java.lang.Double", "DOUBLE");
dataTypeMap.put("boolean", "BOOLEAN");
dataTypeMap.put("java.lang.Boolean", "BOOLEAN");
dataTypeMap.put("java.math.BigDecimal", "DECIMAL(10, 2)");
}
public String generateTableMysql(String beanName, boolean isConvert) {
StringBuilder sqlSb = new StringBuilder();
if (null != beanName && !"".equals(beanName)) {
Object obj = null;
try {
obj = Class.forName(beanName).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
Class<?> clz = obj.getClass();
Field[] fields = clz.getDeclaredFields();
TableName tableClass;
tableClass = clz.getAnnotation(TableName.class);
String tableName = tableClass.value();
sqlSb.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append(" ( ");
for (Field field : fields) {
if (!field.isAccessible()) field.setAccessible(true);
String type = field.getType().getTypeName();
if (!type.contains(".") || type.contains("java.")) {
if (!field.getType().equals(List.class)) {
String name = field.getName();
if ("serialVersionUID".equals(name)) continue;
StringBuilder convertName = new StringBuilder();
convertName.append(name);
if (isConvert) {
convertName = new StringBuilder();
for (int i = 0; i < name.length(); i++) {
if (isUpperCase(name.charAt(i))) convertName.append("_");
convertName.append(name.charAt(i));
}
}
name = convertName.toString().toLowerCase(Locale.ROOT);
sqlSb.append(name).append(" ");
String societySqlType = societyMysql(type);
sqlSb.append(societySqlType);
intFiledFilter(name, societySqlType, sqlSb);
if (field.isAnnotationPresent(TableId.class)) {
if ("int".equals(type)) sqlSb.append("AUTO_INCREMENT ");
sqlSb.append("PRIMARY KEY ");
}
sqlSb.append("comment ");
if (field.isAnnotationPresent(ApiModelProperty.class)) {
ApiModelProperty explain = field.getAnnotation(ApiModelProperty.class);
sqlSb.append("'").append(explain.value()).append("',");
} else {
sqlSb.append("'',");
}
}
}
}
if (sqlSb.lastIndexOf(",") == sqlSb.length() - 1) sqlSb = sqlSb.deleteCharAt(sqlSb.length() - 1);
sqlSb.append(");");
}
return sqlSb.toString();
}
private void intFiledFilter(String name, String societySqlType, StringBuilder sqlSb) {
if ("INT".equals(societySqlType)) {
if (name.contains("state") || name.contains("status") || name.contains("flag")|| name.contains("is_")) sqlSb.append("(1)");
}
sqlSb.append(" ");
}
private String societyMysql(String type) {
if (!typeList.contains(type)) typeList.add(type);
String mySQLDataType = dataTypeMap.get(type);
if (mySQLDataType == null) mySQLDataType = "VARCHAR(255)";
return mySQLDataType;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY