上一篇有 Java 中反向生成实体类思路和步骤 教程,是跟着老师讲的做的,这次是完全自己做的,作为一个工具类,展示如下
操作数据库的工具类:DaoUtil 类
反向生成实体类工具类:ReverseGeneration
运行的时候执行测试方法 test()
方法即可
package com.ssm.util;
import org.junit.Test;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 反向生成实体类
*/
public class ReverseGeneration {
// 数据库名
private final String dbName = "dts";
private final DBUtil db = new DBUtil(dbName, "root", "123456");
@Test
public void test() {
// 代码模板
final String template = getTemplateText();
// 查找所有数据库中的表
List<String> list = queryAllTables();
for (String table : list) {
// 类名
String className = table.substring(0, 1).toUpperCase() + table.substring(1);
// 查找表结构
List<Map> structureList = queryTablesStructure(table);
// 转为 Java 成员变量代码
String attributeList = converToAttribute(structureList);
// 替换模板代码
final String code = template.replace("#{className}", className)
.replace("#{attributeList}", attributeList)
.replace("#{packagePath}", "com.ssm.bean");
// 文件路径
final String filePath = "src/main/java/com/ssm/bean/";
// 生成 Java 文件
generateJavaFile(filePath + className, code);
}
}
/**
* 获取数据库中所有表名
*/
public List<String> queryAllTables() {
String sql = "SELECT\n" +
" distinct TB.TABLE_NAME tableName -- 表名\n" +
"FROM\n" +
" INFORMATION_SCHEMA.TABLES TB\n" +
"Where TB.TABLE_SCHEMA = '" + dbName + "' -- 数据库名";
List<Map> list = db.query(sql);
List<String> nameList = new ArrayList<>();
for (Map map1 : list) {
nameList.add(map1.get("tableName").toString());
}
return nameList;
}
/**
* 查询表结构
*/
public List<Map> queryTablesStructure(String tableName) {
String sql = "SELECT TABLE_SCHEMA, -- 表名\n" +
" COLUMN_NAME, -- 字段名\n" +
" DATA_TYPE, -- 字段类型\n" +
" COLUMN_COMMENT -- 字段注释\n" +
"FROM INFORMATION_SCHEMA.COLUMNS\n" +
"WHERE TABLE_NAME='" + tableName + "' AND TABLE_SCHEMA='" + dbName + "';";
return db.query(sql);
}
/**
* 转为属性
*/
public String converToAttribute(List<Map> list) {
StringBuilder sb = new StringBuilder();
for (Map map : list) {
// 名称
String name = (String) map.get("COLUMN_NAME");
// 类型
String type = (String) map.get("DATA_TYPE");
// 注释
String comment = (String) map.get("COLUMN_COMMENT");
sb.append("\tpublic ");
sb.append(converToJavaType(type));
sb.append(" ");
sb.append(name);
sb.append(";\n");
}
return sb.toString();
}
/**
* 生成 Java 文件
*/
public void generateJavaFile(String fileName, String code) {
// 判断后缀名,如果没有 .java 则自动加上
int index = fileName.lastIndexOf(".");
String fileType = "";
if (index > -1) {
fileType = fileName.substring(fileName.lastIndexOf("."));
}
if (!".java".equals(fileType)) {
fileName += ".java";
}
// 生成文件
try (PrintStream ps = new PrintStream(fileName)) {
ps.println(code);
System.out.println("保存成功!");
} catch (IOException e) {
System.out.println("保存出错!");
e.printStackTrace();
}
}
/**
* sql 类型转换为 Java 类型
*/
public String converToJavaType(String sqlType) {
String type;
switch (sqlType) {
case "int":
type = "Integer";
break;
case "varchar":
case "text":
case "longtext":
type = "String";
break;
case "double":
type = "Double";
break;
case "float":
type = "Float";
break;
case "timestamp":
case "datetime":
case "date":
case "time":
type = "Date";
break;
default:
type = "Object";
break;
}
return type;
}
/**
* 读取模板文本
*/
public String getTemplateText() {
try (
final InputStream is = new FileInputStream("src/main/java/com/ssm/util/entityTemplate.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
) {
StringBuilder builder = new StringBuilder();
String line = reader.readLine(); // 读取第一行
while (line != null) { // 如果 line 为空说明读完了
builder.append(line); // 将读到的内容添加到 buffer 中
builder.append("\n"); // 添加换行符
line = reader.readLine(); // 读取下一行
}
return builder.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}