package com.aunt.utils;
import com.aunt.bean.entity.LogUser;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.collect.Lists;
import net.bytebuddy.description.annotation.AnnotationDescription;
import org.apache.commons.lang3.StringUtils;
import javax.xml.bind.annotation.XmlElement;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;
/**
* 通过实体类生成建表语句
*/
public class GenerateSqlFromEntity2 {
//
private static Map<String, String> javaTypeCast = new HashMap<>();
private static Map<String, String> filedMap;
private static String symbol;
private static String space;
static {
space = "\n";
symbol = ",";
filedMap = new HashMap<>();
javaTypeCast.put("Integer", "INTEGER");
javaTypeCast.put("Short", "tinyint");
javaTypeCast.put("Long", "bigint");
javaTypeCast.put("BigDecimal", "decimal(19,2)");
javaTypeCast.put("Double", "double precision not null");
javaTypeCast.put("Float", "float");
javaTypeCast.put("Boolean", "bit");
javaTypeCast.put("Timestamp", "datetime");
javaTypeCast.put("String", "VARCHAR(255)");
javaTypeCast.put("Date", "datetime");
}
//
public static String createTable(Class clazz) throws IOException {
Field[] fields = null;
fields = clazz.getDeclaredFields();
String param = null;
String column = null;
Class annotationType = null;
XmlElement xmlElement = null;
TableName annotation = (TableName) clazz.getAnnotation(TableName.class);
StringBuilder stb = new StringBuilder(50);
String tableName = annotation.value();
if (tableName == null || tableName.equals("")) {
// 未传表明默认用类名
tableName = clazz.getName();
tableName = tableName.substring(tableName.lastIndexOf(".") + 1);
}
stb.append("create table ").append(tableName).append(" (\r\n");
Map<String, String> map = getAnnoValue(clazz);
ArrayList<Object> counter = Lists.newArrayList();
map.entrySet().stream().forEach(op -> {
counter.add(op.getKey());
symbol = counter.size() - 1 == map.entrySet().size() - 1 ? "" : symbol;
stb.append(op.getKey() + " " + javaTypeCast.get(op.getValue()).concat(symbol));
stb.append("\r\n");
});
String sql = null;
sql = stb.toString();
// 去掉最后一个逗号
int lastIndex = sql.lastIndexOf(",");
sql = sql.substring(0, lastIndex) + sql.substring(lastIndex + 1);
sql = sql.substring(0, sql.length() - 1)
+ ") ENGINE = INNODB DEFAULT CHARSET= utf8;\r\n";
return sql;
}
// main
public static void main(String[] args) throws IOException {
System.err.println(createTable(LogUser.class));
// getAnnoValue(LogUser.class);
}
/**
* 获取注解上的值 以及参数的类型
*
* @param clazz 目标
* @return
*/
public static Map<String, String> getAnnoValue(Class clazz) {
List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
fields.stream().forEach(opt -> {
String value;
String name = null;
name = opt.getType().getName();
name = name.substring(10, name.length());
TableId tableId = opt.getAnnotation(TableId.class);
if (tableId == null) {
TableField tableField = opt.getAnnotation(TableField.class);
value = tableField.value();
} else {
value = opt.getName();
}
filedMap.put(value, name);
}
);
return filedMap;
}
}
最后效果
create table t_user (
birthday VARCHAR(255),
last_login_time bigint,
city VARCHAR(255),
sex VARCHAR(255),
del INTEGER,
register_time bigint,
password VARCHAR(255),
province VARCHAR(255),
phone VARCHAR(255),
idcard VARCHAR(255),
nickname VARCHAR(255),
id VARCHAR(255),
email VARCHAR(255)
) ENGINE = INNODB DEFAULT CHARSET= utf8;
简单的demo