Generate java entity class according to database table name

The jpa used by the company does not use mybatis. So there is no automatic generation with mybatis. But there are too many fields in some database tables, so I think about it once and for all, and even put up database comments.

The first

The jdbcTemplate+Junit test generation is used here, and the method is variable.

The SpringBoot version is 2.4.4, just add @SpringBootTest. Don't use @RunWith

pom:

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>        </dependency>

Code

package com.shinedata.bims.web; import org.apache.commons.collections.MapUtils;import org.apache.commons.lang3.StringUtils;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper; import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.List;import java.util.Map; /** * @ClassName TestController * @Author yupanpan * @Date 2021/4/12 14:24 */@SpringBootTestpublic class TestController {     @Autowired    private JdbcTemplate jdbcTemplate;     @Test    public void database(){        createEntity("1ceping", "t_evaluation_template_info_copy","com.shinedata.bims.entity",false);    }     /**     *     * @param dataBaseName 数据库名     * @param tableName 表名     * @param packageName 包名     * @param isAddEntitySuffix 类名是否添加Entity后缀 true-添加 false-不添加     */    public void createEntity(String dataBaseName,String tableName,String packageName,boolean isAddEntitySuffix){        String className=tableName;        if(tableName.substring(0,2).equals("t_")){            StringBuilder stringBuilder = new StringBuilder(tableName);            stringBuilder.replace(0, 2, "");            String initialsUpperCase = stringBuilder.substring(0, 1).toUpperCase();            className=initialsUpperCase+stringBuilder.substring(1);        }        className=removeUnderline(className)+(isAddEntitySuffix?"Entity":"");         StringBuffer classBuffer=new StringBuffer();        classBuffer.append("import java.util.Date;\r\n");        classBuffer.append("import java.time.LocalDateTime;\r\n");        classBuffer.append("import com.alibaba.fastjson.JSONObject;\r\n");        classBuffer.append("import java.lang.*;\r\n");        classBuffer.append("import java.math.*;\r\n");        classBuffer.append("import java.sql.*;\r\n");        classBuffer.append("import lombok.Data;\r\n\r\n\r\n");        classBuffer.append("@Data\r\n");        classBuffer.append("public class " + className + " {\r\n\r\n");        List<Map> filedMaps = getFiledMaps(dataBaseName, tableName);        processAllAttrs(classBuffer,filedMaps);        classBuffer.append("}\r\n");        markerBean(className,classBuffer.toString(),packageName);    }     /**     * 创建实体类文件     * @param className 类名(不包含.java文件名后缀) 根据表名首字母大写并去掉开头t_和所有下划线-驼峰命名     * @param content 添加的内容(字段注释等)     * @param packageName 包名(com.xxx.xxx.xxx)     */    public void markerBean(String className, String content, String packageName) {        String folder = System.getProperty("user.dir") + "/src/main/java/" + packageName.replace(".","/") + "/";        File file = new File(folder);        if (!file.exists()) {            file.mkdirs();        }        String fileName = folder + className + ".java";        try {            File newjava = new File(fileName);            FileWriter fw = new FileWriter(newjava);            fw.write("package\t" + packageName + ";\r\n");            fw.write(content);            fw.flush();            fw.close();        } catch (IOException e) {            e.printStackTrace();        }    }     /**     * 解析输出属性     *     * @return     */    private void processAllAttrs(StringBuffer sb,List<Map> filedMaps) {        for (int i = 0; i < filedMaps.size(); i++) {            Map map = filedMaps.get(i);            String fieldType = MapUtils.getString(map, "fieldType");            String fieldName = MapUtils.getString(map, "fieldName");            String fieldComment = MapUtils.getString(map, "fieldComment");            if(StringUtils.isNotBlank(fieldComment)){                sb.append("\t/**\r\n").append("\t* ").append(fieldComment).append("\n").append("\t*/\r\n");            }            sb.append("\tprivate " + fieldType + " " + fieldName + ";\r\n\r\n");        }    }     /**     * 获取表字段信息(列名、类型、注释等)     * @param dataBaseName     * @param tableName     * @return     */    private List<Map> getFiledMaps(String dataBaseName,String tableName) {        String sql="SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA ='"+dataBaseName+"' AND TABLE_NAME = '"+tableName+"'";        List<Map> tableFieldList = jdbcTemplate.query(sql, new RowMapper<Map>() {            @Override            public Map<String,String> mapRow(ResultSet resultSet, int rowNum) throws SQLException {                Map<String,String> fieldMap = new HashMap();                String column_name = resultSet.getString("COLUMN_NAME");                setFieldName(column_name.toLowerCase(),fieldMap);                String data_type = resultSet.getString("DATA_TYPE");                setFieldType(data_type.toUpperCase(),fieldMap);                fieldMap.put("fieldComment",resultSet.getString("COLUMN_COMMENT"));                return fieldMap;            }        });        return tableFieldList;    }      private void setFieldName(String columnName, Map fieldMap) {        fieldMap.put("fieldName",removeUnderline(columnName));    }     /**     * 去下划线     * @param string     * @return     */    public String removeUnderline(String string){        StringBuilder columnNameBuilder=new StringBuilder(string);        if(!string.contains("_")){            return string;        }else {            int i = columnNameBuilder.indexOf("_");            columnNameBuilder.replace(i,i+1, "").replace(i,i+1,columnNameBuilder.substring(i,i+1).toUpperCase());            return removeUnderline(columnNameBuilder.toString());        }    }     private void setFieldType(String columnType,Map fieldMap){        String fieldType="String";        if(columnType.equals("INT")||columnType.equals("INTEGER")){            fieldType="Integer";        }else if(columnType.equals("BIGINT")){            fieldType="Long";        }else if(columnType.equals("DATETIME")){            fieldType="Date";        }else if(columnType.equals("TEXT")||columnType.equals("VARCHAR")||columnType.equals("TINYTEXT")||columnType.equals("LONGTEXT")){            fieldType="String";        }else if(columnType.equals("DOUBLE")){            fieldType="Double";        }else if(columnType.equals("BIT")){            fieldType="Boolean";        }else if(columnType.equals("FLOAT")){            fieldType="Float";        }else if(columnType.equals("DECIMAL")){            fieldType="BigDecimal";        }else if(columnType.equals("DATE")){            fieldType="Date";        }else if(columnType.equals("TIMESTAMP")){            fieldType="LocalDateTime";        }else if(columnType.equals("CHAR")){            fieldType="Char";        }else if(columnType.equals("JSON")){//mysql5.7版本才开始有的            fieldType="JSONObject";        }        fieldMap.put("fieldType",fieldType);    } }

Generated class

I used lombok, so I didn’t bother to get getets.

The second

What I do is generate directly after the main method runs, which is similar with minor differences. No need for Junit, it's more convenient, it's just a tool. Same as the first result

package com.shinedata.bims.web; import org.apache.commons.collections.MapUtils;import org.apache.commons.lang3.StringUtils; import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.*;import java.util.*; /** * @ClassName TableToEntityUtils * @Author yupanpan * @Date 2021/6/8 17:25 */public class TableToEntityUtils {      static final String USER = "root";    static final String PASS = "xxxxxxxxxxx";//    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";    // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";    static final String DB_URL = "jdbc:mysql://xxxxxxxxxxxxxxxxxxxxxxx:3306/1ceping?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true&rewriteBatchedStatements=true";     public static void main(String[] args) throws Exception {        createEntity("1ceping", "t_evaluation_template_info_copy","com.shinedata.bims.entity",false);    }     /**     *     * @param dataBaseName 数据库名     * @param tableName 表名     * @param packageName 包名     * @param isAddEntitySuffix 类名是否添加Entity后缀 true-添加 false-不添加     */    public static void createEntity(String dataBaseName, String tableName, String packageName, boolean isAddEntitySuffix) throws Exception{        String className=tableName;        if(tableName.substring(0,2).equals("t_")){            StringBuilder stringBuilder = new StringBuilder(tableName);            stringBuilder.replace(0, 2, "");            String initialsUpperCase = stringBuilder.substring(0, 1).toUpperCase();            className=initialsUpperCase+stringBuilder.substring(1);        }        className=removeUnderline(className)+(isAddEntitySuffix?"Entity":"");         StringBuffer classBuffer=new StringBuffer();        classBuffer.append("import java.util.Date;\r\n");        classBuffer.append("import java.time.LocalDateTime;\r\n");        classBuffer.append("import com.alibaba.fastjson.JSONObject;\r\n");        classBuffer.append("import java.lang.*;\r\n");        classBuffer.append("import java.math.*;\r\n");        classBuffer.append("import java.sql.*;\r\n");        classBuffer.append("import lombok.Data;\r\n\r\n\r\n");        classBuffer.append("@Data\r\n");        classBuffer.append("public class " + className + " {\r\n\r\n");        List<Map> filedMaps = getFiledMaps(dataBaseName, tableName);        processAllAttrs(classBuffer,filedMaps);        classBuffer.append("}\r\n");        markerBean(className,classBuffer.toString(),packageName);    }     /**     * 创建实体类文件     * @param className 类名(不包含.java文件名后缀) 根据表名首字母大写并去掉开头t_和所有下划线-驼峰命名     * @param content 添加的内容(字段注释等)     * @param packageName 包名(com.xxx.xxx.xxx)     */    public static void markerBean(String className, String content, String packageName) throws Exception {//      这里不使用System.getProperty("user.dir")了。user.dir是根据运行时环境来的        File f2 = new File(TableToEntityUtils.class.getResource("/").getPath());        String homePath=f2.getCanonicalPath().replace("\\target\\classes", "");        String folder = homePath + "/src/main/java/" + packageName.replace(".","/") + "/";        File file = new File(folder);        if (!file.exists()) {            file.mkdirs();        }        String fileName = folder + className + ".java";        try {            File newjava = new File(fileName);            FileWriter fw = new FileWriter(newjava);            fw.write("package\t" + packageName + ";\r\n");            fw.write(content);            fw.flush();            fw.close();        } catch (IOException e) {            e.printStackTrace();        }    }     /**     * 去下划线     * @param string     * @return     */    public static String removeUnderline(String string){        StringBuilder columnNameBuilder=new StringBuilder(string);        if(!string.contains("_")){            return string;        }else {            int i = columnNameBuilder.indexOf("_");            columnNameBuilder.replace(i,i+1, "").replace(i,i+1,columnNameBuilder.substring(i,i+1).toUpperCase());            return removeUnderline(columnNameBuilder.toString());        }    }     /**     * 获取表字段信息(列名、类型、注释等)     * @param dataBaseName     * @param tableName     * @return     */    private static List<Map> getFiledMaps(String dataBaseName, String tableName) {        Connection conn = null;        Statement stmt = null;        List<Map> tableFieldList=new ArrayList<>();        try{            // 注册 JDBC 驱动            Class.forName(JDBC_DRIVER);            conn = DriverManager.getConnection(DB_URL,USER,PASS);            // 执行查询            stmt = conn.createStatement();            String sql= "SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA ='"+dataBaseName+"' AND TABLE_NAME= '"+tableName+"'";            ResultSet rs = stmt.executeQuery(sql);            while (rs.next()) {                Map<String,String> fieldMap = new HashMap();                String column_name = rs.getString("COLUMN_NAME");                setFieldName(column_name.toLowerCase(),fieldMap);                String data_type = rs.getString("DATA_TYPE");                setFieldType(data_type.toUpperCase(),fieldMap);                fieldMap.put("fieldComment",rs.getString("COLUMN_COMMENT"));                tableFieldList.add(fieldMap);            }            rs.close();            stmt.close();            conn.close();        }catch(SQLException se){            // 处理 JDBC 错误            se.printStackTrace();        }catch(Exception e){            // 处理 Class.forName 错误            e.printStackTrace();        }finally{            // 关闭资源            try{                if(stmt!=null){                    stmt.close();                }            }catch(SQLException se2){            }// 什么都不做            try{                if(conn!=null) conn.close();            }catch(SQLException se){                se.printStackTrace();            }        }        return tableFieldList;    }     /**     * 解析输出属性     *     * @return     */    private static void processAllAttrs(StringBuffer sb, List<Map> filedMaps) {        for (int i = 0; i < filedMaps.size(); i++) {            Map map = filedMaps.get(i);            String fieldType = MapUtils.getString(map, "fieldType");            String fieldName = MapUtils.getString(map, "fieldName");            String fieldComment = MapUtils.getString(map, "fieldComment");            if(StringUtils.isNotBlank(fieldComment)){                sb.append("\t/**\r\n").append("\t* ").append(fieldComment).append("\n").append("\t*/\r\n");            }            sb.append("\tprivate " + fieldType + " " + fieldName + ";\r\n\r\n");        }    }     private static void setFieldName(String columnName, Map fieldMap) {        fieldMap.put("fieldName",removeUnderline(columnName));    }     private static void setFieldType(String columnType, Map fieldMap){        String fieldType="String";        if(columnType.equals("INT")||columnType.equals("INTEGER")){            fieldType="Integer";        }else if(columnType.equals("BIGINT")){            fieldType="Long";        }else if(columnType.equals("DATETIME")){            fieldType="Date";        }else if(columnType.equals("TEXT")||columnType.equals("VARCHAR")||columnType.equals("TINYTEXT")||columnType.equals("LONGTEXT")){            fieldType="String";        }else if(columnType.equals("DOUBLE")){            fieldType="Double";        }else if(columnType.equals("BIT")){            fieldType="Boolean";        }else if(columnType.equals("FLOAT")){            fieldType="Float";        }else if(columnType.equals("DECIMAL")){            fieldType="BigDecimal";        }else if(columnType.equals("DATE")){            fieldType="Date";        }else if(columnType.equals("TIMESTAMP")){            fieldType="LocalDateTime";        }else if(columnType.equals("CHAR")){            fieldType="Char";        }else if(columnType.equals("JSON")){//mysql5.7版本才开始有的            fieldType="JSONObject";        }        fieldMap.put("fieldType",fieldType);    }}