java根据实体类建表
·
广告:
信号屏蔽器:守护你的数字生活,为你带来宁静与专注
大多数时候咱们是通过建表之后,可以通过代码生产工具生成实体类。但是遇到实体类经常需要修改的开发阶段,频繁修改数据库就显得很麻烦。这时用实体类生成表就是一个不错的选择!
首先导包
import com.sstx.model.entity.*;
import com.mysql.cj.util.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Component;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;
主方法调用,参数填你所创建的实体类名
public static void main(String[] args) throws IOException {
createTableSql(DashEleLocation.class);
}
下面是方法对应的主要代码
/**
* 根据类文件生成创表sql语句
*
* @param clazz 实体类
* @return 创表sql
*/
public static String createTableSql(Class<?> clazz) {
String filePath = getPathFromClass(clazz);
BufferedReader reader = null;
StringBuilder sql = new StringBuilder();
List<List<String>> result = new ArrayList<>();
try {
reader = new BufferedReader(new FileReader(filePath));
String line;
int lineNUm = 0;
String keyName = null;
String tableName = "";
String annotation = null;
String columnEnName = null;
String columnType = null;
List<List<String>> columns = new ArrayList<>();
//解析类文件
while ((line = reader.readLine()) != null) {
if (line.contains("import")) {
continue;
}
if (line.contains("//") && !line.contains("///")) {
if (line.split("//").length<2) {
continue;
}
annotation = line.split("//")[1];
if(StringUtils.isNullOrEmpty(annotation)){
continue;
}
String[] split = line.split("private");
if(line.contains("public")){
split = line.split("public");
}
if(split[0].contains("//")){
continue;
}
String s = split[1].split(" ")[1];
switch (s) {
case "Date":
case "DateTime":
columnType = "datetime";
break;
case "String":
columnType = "varchar(100)";
break;
case "BigDecimal":
columnType = "decimal(30,6)";
break;
case "int":
case "Integer":
columnType = "int";
break;
case "Double":
columnType = "double(30,2)";
break;
case "Boolean":
columnType = "TINYINT(1)";
break;
}
}
if (line.contains("@TableName")) {
tableName = line.split("\"")[1];
}
// 处理每一行的内容
if (line.contains("@TableId")) {
if(!line.contains("\"")){
keyName = "id";
columnEnName = "id";
}else {
keyName = line.split("\"")[1];
columnEnName = line.split("\"")[1];
}
}
if (line.contains("TableField")&&!line.contains("false")&&!line.contains("//")) {
columnEnName = line.split("\"")[1];
}
if (annotation != null && columnEnName != null && columnType != null) {
List<String> oneColumn = new ArrayList<>();
oneColumn.add(columnEnName);
oneColumn.add(columnType);
oneColumn.add(annotation);
result.add(oneColumn);
annotation = null;
columnEnName = null;
columnType = null;
}
}
//生成sql
sql.append("drop table if exists ").append(tableName).append(";").append("\n");
sql.append("CREATE TABLE ").append(tableName).append("(").append("\n");
for (int i = 0; i < result.size(); i++) {
List<String> strings = result.get(i);
sql.append("\t").append("`").append(strings.get(0)).append("`").append(" ").append(strings.get(1));
sql.append(" ").append("COMMENT").append(" ").append("\"").append(strings.get(2)).append("\"");
if(i==result.size()-1&&keyName==null){
sql.append("\n");
}else{
sql.append(",");
sql.append("\n");
}
}
if(keyName!=null){
sql.append("\tPRIMARY KEY ").append("(").append(keyName).append(")").append("\n");
}
sql.append(")");
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println(sql);
return sql.toString();
}
生产结果展示:
直接复制白色的建表语句,进入数据库执行即可!
源自 sz-sstx.com
更多推荐
所有评论(0)