java实体类转换为表结构Sql语句及属性名驼峰命名转换

用途:用于拉取git的代码,但是项目中没有提供对应实体类的表结构创建sql语句,及java实体类属性名转换为驼峰命名

package com.mypro.testmodule.entity;

import com.mypro.common.domain.Stu;
import com.mypro.testmodule.entity.testen.Equip;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @Author: lsx
 * @Date: 2023/10/17/17:34
 * @Description:用于java实体类生成对应的创建表的sql语句或者属性名转换为驼峰形式
 */
public class EntityTr {
    public static void main(String[] args) {
        List<Object> list=new ArrayList<>();
        Stu stu = new Stu();
        Equip equip = new Equip();
        list.add(stu);
        list.add(equip);
        //生成实体类各个属性名的对应的驼峰命名静态属性   tableName >> public static String TABLE_NAME = "table_name";
        testReflect(list);
        //生成实体类的sql表创建语句  CREATE TABLE `DefaultName`  (id  int(1)  DEFAULT NULL ,na_me  varchar(50) DEFAULT NULL ,age  int(1)  DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
        transferToSql(list);
    }

    //java实体类生成所有属性的静态驼峰命名值字段   tableName 》 public static String TABLE_NAME = "table_name";
    public static void testReflect(List<Object> entityList) {
        //循环需要生成静态驼峰属性命名值的实体类集合
        for (Object entity:entityList){
            StringBuilder builder = new StringBuilder();
            for (Field field : entity.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                //转换字段名称
                String fieldName = transToUnderScore(field.getName());
                builder.append("public static String "+fieldName.toUpperCase()+" = "+"\""+fieldName.toLowerCase()+"\";\n");
            }
            //打印输出值
            System.out.println(builder.toString());
            //不同实体类属性静态驼峰命名分隔符
            System.out.println("========================");
        }
    }


    public  static void transferToSql(List<Object>entityList){
       //空格符
        String em=" ";
        //换行符
        String en="\n";
        StringBuilder builder = new StringBuilder();
        //循环遍历集合
        for (Object entity:entityList){
            //实体类属性数量
            int length = entity.getClass().getDeclaredFields().length;
            int i=1;
            for (Field field : entity.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                if (i==1){
                    String tableName="entity_defaultName";
                    if ("tableName".equals(field.getName())){
                        try {
                            tableName = field.get(entity).toString();
                        } catch (IllegalAccessException e) {
                            System.out.println("表名称字段类型错误");
                            break;
                        }
                    }
                    builder.append("CREATE TABLE `"+tableName+"`  (");
                    if (!"entity_defaultName".equals(tableName)){
                        //实体类第一个属性为表名称字段,则不为此字段生成对应的字段sql
                        i++;
                        continue;
                    }
                }
                //获取java实体类各个属性的ApiModelProperty注解,用于创建sql表时添加对应字段的备注信息
                ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
                builder.append(transToUnderScore(field.getName()).toLowerCase()).append(em);
                String sqlClass = javaClassToSql(field);
                if (sqlClass.startsWith("false")){
                    System.out.println(field.getName()+"实体类属性,mysql数据库没有对应的类型,请修改或者手动添加类型映射");
                    break;
                }
                builder.append(" "+sqlClass);
                builder.append(" DEFAULT NULL ");
                //是否为最后一个属性
                boolean end=i==length?false:true;
                if (!Objects.isNull(annotation)){
                    builder.append("COMMENT '").append(annotation.value()).append("'");
                }
                if (end){
                    builder.append(",");
                }
                i++;
            }
            builder.append(" )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;");
            //不同实体类sql语句分隔符
            builder.append(en+"#========================"+en);

        }
        System.out.println(builder.toString());

    }

  /**
   *字段名称驼峰命名转换   javaName->java_name
   */
    public static String transToUnderScore(String fieldName){
        char[] chars = fieldName.toCharArray();
        //创建用于存储字段中存在的大写字母list集合
        List<Character> characters = new ArrayList<>();
        for (char c:chars){
            int a=(int)c;
            if (a>=65&&a<=90){
                //判断char是否是大写字母A-Z   A对应65 Z对应90
                characters.add(Character.valueOf(c));
            }
        }
        for (Character a:characters){
            //替换字段名称中对应的大写字母为  _字母格式   javaName >>  java_Name
            fieldName = fieldName.replace(a.toString(), "_" + a.toString());
        }
        return fieldName;
    }

    /**
     *实体类属性值类型对应的sql属性,使用者可自行修改各个属性的字段长度等信息
     */
    public static   String javaClassToSql( Field field) {
        Class<?> type = field.getType();
        String restr="false";
       if (type ==Integer.class||type==int.class){
           restr="int(1) ";
       }
       if (type ==  Long.class||type==long.class){
           restr="bigint(10)";
       }
       if (type ==  BigDecimal.class){
           restr="decimal(16,2)";
       }
       if (type == Double.class||type==double.class){
           restr="double(14,2)";
       }
       if (type ==  Float.class||type==float.class){
           restr="float(14.2)";
       }
       if (type ==   Date.class||type == LocalDateTime.class){
           restr="datetime";
       }
       if (type ==  String.class){
           restr="varchar(50)";
       }
       if (type ==Character.class||type==char.class){
           restr="char(20)";
       }
       return restr;
    }


}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值