用途:拉取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;
}
}