首页 > 数据库 >java类转mysql表创建语句

java类转mysql表创建语句

时间:2023-11-22 11:14:09浏览次数:38  
标签:java String dataTypeMap sqlSb name mysql append 类转

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 {
        // 映射Java数据类型到MySQL字段数据类型
        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)"); // 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数组
            Field[] fields = clz.getDeclaredFields();
            //获取实体类的Table注解表名
            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(" ");
                        //java 数据类型转换成 MySQL 字段数据类型
                        String societySqlType = societyMysql(type);
                        sqlSb.append(societySqlType);
                        intFiledFilter(name, societySqlType, sqlSb);
                        //判断该字段是否是Id主键
                        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;
    }

}

标签:java,String,dataTypeMap,sqlSb,name,mysql,append,类转
From: https://www.cnblogs.com/eangaie/p/17848503.html

相关文章

  • MySQL-重置主键自动递增值-从头开始
    如果你想要重置MySQL数据库中的AUTO_INCREMENT值并让它从头开始增加新的ID,请按照以下步骤进行操作:首先,确定你要修改的表格名和要修改的字段名。例如,假设你有一个名为“users”的表格,并且该表格中的主键字段名为“id”。然后,执行以下SQL命令来更改该字段的当前自动递增计数器:ALT......
  • mysql无法登陆,报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (
    问题描述在使用命令行登录MySQL时出现了下述问题: 出错原因usingpassword:NO:表示输入没有输入密码就尝试登陆了usingpassword:YES:表示输入了密码,但密码错误 解决方案:修改密码1.修改mysql配置文件my.cnf。在 [mysqld]增加skip-grant-tables 无密码进入mys......
  • 【MySQL】配置文件
    #Disablingsymbolic-linksisrecommendedtopreventassortedsecurityrisks#symbolic-links=0#Settingsuserandgroupareignoredwhensystemdisused.#Ifyouneedtorunmysqldunderadifferentuserorgroup,#customizeyoursystemdunitfilefor......
  • Java报表开发工具总结
    Java报表工具,首先可以分成两大类:纯Java报表工具,和支持Java的报表工具。支持Java的报表工具支持Java的报表工具.其实就是非Java的报表工具,但是可以在Java程序中调用,这样的产品很多,总的讲一大类是采用独立报表服务器的,如Bo/CrystalReport,Brio,Cognos等等;另一大类是在前端有控件的,......
  • MySql 中 DATEDIFF() 用法
    DATEDIFF函数用于计算两个日期之间的差值,并以天数返回结果。它的语法如下:DATEDIFF(end_date,start_date)其中,end_date和start_date是要计算差值的结束日期和起始日期。以下是一个示例,计算两个日期之间的天数差值:SELECTDATEDIFF('2023-11-21','2023-11-01')ASdays_di......
  • 大数据开发要学什么java还是python?
    在大数据开发领域,Java和Python都是备受青睐的编程语言。它们分别具有各自独特的特点和优势,在大数据处理方面也有不同的应用场景。以下是对Java和Python在大数据开发中的应用、优势以及学习建议的详细描述。Java在大数据开发中的应用和优势1.应用场景Hadoop生态圈:Java广泛......
  • 【Java】乡镇卫生院、社区卫生服务中心云HIS源码
    云HIS采用云端SaaS服务的方式提供,用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医院机构的主要工作流程,能够与监管系统有序对接,并能满足系统后期扩展的需要。一、医保数据上传医保数据上传是将......
  • MySQL8.0新特性
    MySql8的其他新特性1.MySQL8新特性概述MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQLOptimizer优化器进行了改进。不仅在速度上得到了改善,还为......
  • 本地MinIO存储服务Java远程调用上传文件
    MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO。它的优点包括高性能、高可用性、易于部署和管理、支持多租户等。Cpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的......
  • java注解
    一、java注解用于为java代码提供元数据。提供数据来解释程序代码。注解并非所解释的代码的一部分,不直接影响代码执行。所有注解会自动继承java.lang.annotation这个接口,所以不能再去继承别的接口或类。 解析一个类/方法的注解有2种方式:1、编译期的直接扫描编译器在对jav......