java 实体类 生成 create sql


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<Class<?>, 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<Class<?>, String> customTypeMap) {
        typeMap.putAll(customTypeMap);
    }


    /**
     *
     * @param classList 类列表
     * @param tablePrefix 表前缀
     * @return create sql
     */
    public String genCreateSql(List<Class<?>> classList, String tablePrefix) {

        StringBuilder sb = new StringBuilder("-- =====entity to create sql=====\n");

        for (Class<?> c : classList) {
            Field[] declaredFields = c.getDeclaredFields();
            List<Field> 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);
    }

}




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。