import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/***
*
* @author Brandon Leaf
* @date 2021/1/20 16:01
* @description
* 生成器
*/
public class Gener {
private final Map, String> typeMap = new HashMap<>();
/**
* 初始化类型映射表
*/
private void initDefaultTypeMap() {
typeMap.put(String.class, "VARCHAR2(100 BYTE)");
typeMap.put(Long.class, "NUMBER");
typeMap.put(Double.class, "NUMBER(*,6)");
typeMap.put(Integer.class, "NUMBER");
}
public Gener() {
if (typeMap.isEmpty()) {
initDefaultTypeMap();
}
}
/**
*
* @param customTypeMap 自定义映射表
*/
public Gener(Map, String> customTypeMap) {
typeMap.putAll(customTypeMap);
}
/**
*
* @param classList 类列表
* @param tablePrefix 表前缀
* @return create sql
*/
public String genCreateSql(List> classList, String tablePrefix) {
StringBuilder sb = new StringBuilder("-- =====entity to create sql=====\n");
for (Class> c : classList) {
Field[] declaredFields = c.getDeclaredFields();
List fieldList = new ArrayList<>();
for(Field f : declaredFields){
String type = typeMap.get(f.getType());
if(type!=null){
fieldList.add(f);
}
}
if(fieldList.isEmpty()){
continue;
}
//title
String tableName = c.getSimpleName();
String sqlTableName = enCodeUnderlined(tableName);
if (tablePrefix != null) {
sqlTableName = tablePrefix.toUpperCase() + sqlTableName.toUpperCase();
}
sb.append("-- =====").append(tableName).append("=====").append(sqlTableName).append("=====\n\n\t");
sb.append("CREATE TABLE \"").append(sqlTableName).append("\" (\n\t");
//todo columns
for (int i = 0; i < fieldList.size(); i++) {
Field f = fieldList.get(i);
String type = typeMap.get(f.getType());
String name = f.getName();
sb.append("\"").append(enCodeUnderlined(name).toUpperCase()).append("\" ").append(type);
if (i != (fieldList.size() - 1)) {
sb.append(" ,\n\t");
}
}
sb.append("\n\t);\n\n");
//todo remark
}
return sb.toString();
}
// 首字母转小写
public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0)))
return s;
else
return Character.toLowerCase(s.charAt(0)) +
s.substring(1);
}
// 大写字母前面加上下划线并转为全小写
public static String enCodeUnderlined(String s) {
char[] chars = toLowerCaseFirstOne(s).toCharArray();
StringBuilder temp = new StringBuilder();
for (char aChar : chars) {
if (Character.isUpperCase(aChar)) {
temp.append("_");
}
temp.append(Character.toLowerCase(aChar));
}
return temp.toString();
}
/**
* demo
*/
public static void main(String[] args) {
Gener gener = new Gener();
String s = gener.genCreateSql(
List.of(Test1.class,
Test2.class,
Test3.class
)
, "TEST_");
//打印sql
System.out.println(s);
}
}