package cn.iocoder.yudao.module.erp.utils;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.base.CaseFormat;
import com.google.common.collect.Lists;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.xml.bind.annotation.XmlElement;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URISyntaxException;
import java.util.*;
import java.util.stream.Collectors;
/**
* 通过实体类生成建表语句
*/
public class GenerateSqlFromEntity2 {
//
private static Map<String, String> javaTypeCast = new HashMap<>();
private static Map<String, String> filedMap;
private static Map<String, String> commentMap;
private static String symbol;
private static String space;
static {
space = "\n";
symbol = ",";
filedMap = new LinkedHashMap<>();
commentMap = new LinkedHashMap<>();
javaTypeCast.put("Integer", "INTEGER");
javaTypeCast.put("Short", "tinyint");
javaTypeCast.put("Long", "bigint");
javaTypeCast.put("BigDecimal", "decimal(19,2)");
javaTypeCast.put("Double", "double precision not null");
javaTypeCast.put("Float", "float");
javaTypeCast.put("Boolean", "bit");
javaTypeCast.put("Timestamp", "datetime");
javaTypeCast.put("String", "VARCHAR(255)");
javaTypeCast.put("Date", "datetime");
javaTypeCast.put("LocalDateTime", "datetime");
}
//
public static String createTable(Class clazz) throws IOException {
Field[] fields = null;
fields = clazz.getDeclaredFields();
String param = null;
String column = null;
Class annotationType = null;
XmlElement xmlElement = null;
TableName annotation = (TableName) clazz.getAnnotation(TableName.class);
StringBuilder stb = new StringBuilder(50);
String tableName = annotation.value();
if (tableName == null || tableName.equals("")) {
// 未传表明默认用类名
tableName = clazz.getName();
tableName = tableName.substring(tableName.lastIndexOf(".") + 1);
tableName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, tableName);
}
stb.append("create table ").append(tableName).append(" (\r\n");
Map<String, String> map = getAnnoValue(clazz);
Map<String, String> annoComment = getAnnoComment(clazz);
// ArrayList<Object> counter = Lists.newArrayList();
map.entrySet().stream().forEach(op -> {
// counter.add(op.getKey());
// symbol = counter.size() - 1 == map.entrySet().size() - 1 ? "" : symbol;
String str = op.getKey().equals("id") ? " NOT NULL AUTO_INCREMENT COMMENT '主键 ( "+annoComment.get(op.getKey())+" )' " : " COMMENT '"+annoComment.get(op.getKey())+"' ";
stb.append("`"+op.getKey()+"`" +" " + javaTypeCast.get(op.getValue()).concat(str).concat(symbol));
stb.append("\r\n");
});
String sql = null;
sql = stb.toString();
// 去掉最后一个逗号
// int lastIndex = sql.lastIndexOf(",");
// sql = sql.substring(0, lastIndex) + sql.substring(lastIndex + 1);
// sql = sql.substring(0, sql.length() - 1)
Schema schema = (Schema)clazz.getAnnotation(Schema.class);
String description = schema.description();
if(description.equals("")){
description ="";
}
sql = sql+
"PRIMARY KEY (`id`) USING BTREE"
+ ") ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '"+description+"';\r\n";
return sql;
}
// main
public static void main(String[] args) throws IOException, ClassNotFoundException, URISyntaxException {
// List<Class> classList = GetClass.getClassList("cn.iocoder.yudao.module.erp.dal.dataobject.finance");
// List<Class> classList = GetClass.getClassList("cn.iocoder.yudao.module.erp.dal.dataobject.product");
// List<Class> classList = GetClass.getClassList("cn.iocoder.yudao.module.erp.dal.dataobject.purchase");
// List<Class> classList = GetClass.getClassList("cn.iocoder.yudao.module.erp.dal.dataobject.sale");
List<Class> classList = GetClass.getClassList("cn.iocoder.yudao.module.erp.dal.dataobject.stock");
classList.stream().forEach(obj ->{
try {
String table = createTable(obj);
System.out.println(table);
} catch (IOException e) {
e.printStackTrace();
}
});
// getAnnoValue(ErpFinancePaymentItemDO.class);
}
/**
* 获取注解上的值 以及参数的类型
*
* @param clazz 目标
* @return
*/
public static Map<String, String> getAnnoValue(Class clazz) {
filedMap = new LinkedHashMap<>();
List<Field> fields = Arrays.asList(clazz.getDeclaredFields()).stream().filter(f -> f.getModifiers() != 25).collect(Collectors.toList());
List<Field> base = Arrays.asList(BaseDAO.class.getDeclaredFields());
fields.stream().forEach(opt -> {
String name;
String type = null;
type = opt.getType().getName();
type = type.substring(10);
name = opt.getName();
name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name);
filedMap.put(name, type);
}
);
base.stream().forEach(obj ->{
String name;
String type = null;
type= obj.getType().getName();
type = type.substring(10);
name = obj.getName();
name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name);
filedMap.put(name, type);
});
return filedMap;
}
/**
* 获取Schema上的值 以及参数的类型
*
* @param clazz 目标
* @return
*/
public static Map<String, String> getAnnoComment(Class clazz) {
commentMap = new LinkedHashMap<>();
List<Field> fields = Arrays.asList(clazz.getDeclaredFields()).stream().filter(f -> f.getModifiers() != 25).collect(Collectors.toList());
List<Field> base = Arrays.asList(BaseDAO.class.getDeclaredFields());
fields.stream().forEach(opt -> {
String name;
String comment = null;
Schema annotation = opt.getAnnotation(Schema.class);
comment = annotation.description();
name = opt.getName();
name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name);
commentMap.put(name, comment);
}
);
base.stream().forEach(obj ->{
String name;
Schema annotation = obj.getAnnotation(Schema.class);
String comment = annotation.description();
name = obj.getName();
name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name);
commentMap.put(name, comment);
});
return commentMap;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
可以快速批量的将dao数据模型转化为sql语句,可以用于分析数据结构,可以快速创建未知的数据库业务,解决sql 的创建问题。快速生成sql文件。让数据结构更好更快捷展现在你面前 解决被sql卡主业务的问题。适用于 只有源码没有数据库的大部分情况。
资源推荐
资源详情
资源评论
收起资源包目录
utils.zip (3个子文件)
utils
GenerateSqlFromEntity2.java 7KB
BaseDAO.java 2KB
GetClass.java 2KB
共 3 条
- 1
资源评论
gavin(9527)
- 粉丝: 19
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功