当前位置: 首页 > news >正文

将java Bean转换成数据库Schema

 可以根据java对象 生成 Create table 语句

public class DaoGenUtils {
    public static void genParam(List<String> params) {
        StringBuilder sb = new StringBuilder();
        StringBuilder sb1 = new StringBuilder();
        sb1.append(" where ");
        for (String p : params) {
            sb.append("@Param(" + p + ") " + p + ",");
            sb1.append(p + " = #{" + p + "} and ");
        }
        System.out.println(sb);
        System.out.println(sb1);
    }

    public static void genDataSchema(Class clazz) {

        if (clazz == null) {
            return;
        }
        String tableName = "PN_" + clazz.getSimpleName();
        //获取关联的所有类,本类以及所有父类
        boolean ret = true;
        List<Class> clazzs = new ArrayList<Class>();
        //需要关联父类时候打开这个注释
        while (ret) {
            clazzs.add(clazz);
            clazz = clazz.getSuperclass();
            if (clazz == null || clazz == Object.class) {
                break;
            }
        }
        StringBuilder sb = new StringBuilder();
        sb.append("CREATE TABLE `" + tableName + "` (\n");


        for (int i = 0; i < clazzs.size(); i++) {
            Field[] declaredFields = clazzs.get(i).getDeclaredFields();
            List<Field> declaredFieldsList = Lists.newArrayList(declaredFields);
            declaredFieldsList = declaredFieldsList.stream()
                .collect(Collectors.toList());

            Field[] fields = declaredFieldsList.toArray(new Field[0]);
            int length = fields.length;
            for (int j = 0; j < length; j++) {
                Field field = fields[j];
                int mod = field.getModifiers();
                //过滤 static 和 final 类型
                if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
                    continue;
                }
                field.setAccessible(true);
                String fieldName = field.getName();
                String schemaStr = "`" + fieldName + "` " + getSchemaType(field) + " \n";
                if (j == length-1){
                    schemaStr = schemaStr.replace(",", "");
                }
                sb.append("  " +schemaStr);

            }
        }
        sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n");
        System.out.println(sb);
    }

    private static String getSchemaType(Field field) {

        Class<?> fieldType = field.getType();
        if (fieldType == String.class) {
            return "VARCHAR(50) NOT NULL,";
        } else if (fieldType == Double.class || fieldType == double.class || fieldType == BigDecimal.class) {
            return "BIGDECIMAL(10,2) NOT NULL,";
        } else if (fieldType == Integer.class || fieldType == int.class) {
            if (field.getName().toLowerCase().contains("type") || field.getName().toLowerCase().contains("status")) {
                return "TINYINT(4) NOT NULL,";
            } else {
                return "INT(11) NOT NULL,";
            }
        } else if (fieldType == Date.class) {
            if (field.getName().contains("add")) {
                return "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,";
            } else if (field.getName().contains("update")) {
                return "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,";
            }
            return "timestamp";
        }
        return "VARCHAR(50) NOT NULL,";
    }

    public static void main(String[] args) {
        //genParam(Lists.newArrayList("orderId", "ticketAmount", "speedPackAmount", "convertStatus", "realTicketGroupId", "failType"));
        genDataSchema(GetquestionUrlProcessor.class);
    }
}复制代码

github.com/Windsmild/D…

相关文章:

  • 罗辑思维首席架构师:Go微服务改造实践
  • MVVM
  • 目标检测算法(1)目标检测中的问题描述和R-CNN算法
  • LVS + Keepalived 高可用群集部署
  • 【大数据】MapTask并行度和切片机制
  • WSTMart开源商城
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • 微服务架构eureka集群高可用配置
  • OSS访问控制介绍
  • Swift逆向之函数解码
  • Win2008/2012r2下批量更改域用户密码
  • SSH免密码登录配置
  • 基于kerberos的NFS服务
  • CPP基础
  • vue - for遍历数组
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • css布局,左右固定中间自适应实现
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java|序列化异常StreamCorruptedException的解决方法
  • Laravel 菜鸟晋级之路
  • MySQL主从复制读写分离及奇怪的问题
  • ng6--错误信息小结(持续更新)
  • PAT A1092
  • PHP CLI应用的调试原理
  • QQ浏览器x5内核的兼容性问题
  • Redis学习笔记 - pipline(流水线、管道)
  • Redis中的lru算法实现
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Twitter赢在开放,三年创造奇迹
  • 好的网址,关于.net 4.0 ,vs 2010
  • 记一次删除Git记录中的大文件的过程
  • 让你的分享飞起来——极光推出社会化分享组件
  • 栈实现走出迷宫(C++)
  • 自动记录MySQL慢查询快照脚本
  • 【云吞铺子】性能抖动剖析(二)
  • kubernetes资源对象--ingress
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​MySQL主从复制一致性检测
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)memcache、redis缓存
  • (转)为C# Windows服务添加安装程序
  • *上位机的定义
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 依赖注入的基本用发
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded