用途:拉取git代码,项目中缺少表创建语句,手动设计表添加字段太过繁琐,可以通过此代码利用java实体类自动分析成员变量值类型,输出实体类的表创建语句。

功能实现思路:创建空list集合,将所需要生成sql语句的实体类添加至集合中,循环集合,利用反射原理,获取实体类成员变量字段集合,并通过field的getAnnotation方法查看字段是否有ApiModelProperty注解,有此注解的话获取注解的value值,作为表字段的备注信息,转换类属性class类型为mysql的字段类型,输出表创建sql语句。

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: sky

* @Date: 2023/12/6/11:50

* @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;

   }

 

 

}