Java 反向生成实体类工具

上一篇有 Java 中反向生成实体类思路和步骤 教程,是跟着老师讲的做的,这次是完全自己做的,作为一个工具类,展示如下


操作数据库的工具类:DaoUtil

Java 中操作数据库的工具类

反向生成实体类工具类: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 "";
    }

}

发表评论