工具类:输入想要连接的数据库名和表名生成实体类

输入连接的数据库名和表名生成实体类

编写了一个工具类,可以方便的直接用表名生成完整的实体类,先看看测试的效果

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工具类编写

package utils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Scanner;

public class TableUtils
{
    //该对象用于存放表字段转换成属性的字符串
    static StringBuilder objStr = new StringBuilder();
    //该对象用于存放对应的getter、setter字符串
    static StringBuilder gSMethod = new StringBuilder();
    //该对象用于存放toString字符串
    static StringBuilder tSMethod = new StringBuilder("\n\t@Override\n\tpublic String toString() {\n\t\treturn ");
    //连接数据库的方法
    public static Connection Conn(String tableName)
    {
        String url="jdbc:mysql://localhost:3306/"+tableName+"?userUnicode=true&characterEncoding=utf8";
        String user="";//你的数据库用户
        String m="";//你的数据库密码
        Connection connection = null;
        try
        {
            connection =  DriverManager.getConnection(url,user,m);
            System.out.println("\n==============数据库连接成功==============");
            return connection;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("\n============连接失败,请查看错误信息============");
            return connection;
        }
    }

    //转换表字段到字符串的方法
    public static void getTableField(Connection conn,String fromName)
    {
        PreparedStatement pst = null;
        try
        {
            objStr.append("public class ").append(fromName).append("{");
            tSMethod.append("\"").append(fromName).append("{\"").append("+\n\t\t");
            String sql = "select * from "+fromName;
            pst = conn.prepareStatement(sql);
            ResultSetMetaData rsMd = pst.executeQuery().getMetaData();

            for(int i = 0; i < rsMd.getColumnCount(); i++)
            {
                String fieldType = rsMd.getColumnTypeName(i + 1);
                String fieldName = rsMd.getColumnName(i + 1);
                System.out.print((i+1)+"."+"字段名称是:"+fieldName+" ");
                //首字母大写
                String upF = fieldName.substring(0,1).toUpperCase()
                        + fieldName.substring(1);
                /*根据字段的数据类型,设置属性的数据类型(不知能否直接获取java类型,感觉可优化)
                 、getter、setter方法和toString方法
                 */
                switch (fieldType)
                {
                    case "INT":
                        System.out.println("字段类型是:"+"int");
                        objStr.append("\n\tprivate ").append("int ").append(fieldName).append(";");
                        //get
                        gSMethod.append("\n\tpublic int get").append(upF).append("() {\n\t\treturn ")
                                .append(fieldName).append(";\n\t}");
                        //set
                        gSMethod.append("\n\tpublic void set").append(upF).append("(").append("int ")
                                .append(fieldName).append(") {\n\t\tthis.").append(fieldName)
                                .append(" = ").append(fieldName).append(";\n\t}");
                        break;

                    case "VARCHAR":
                        System.out.println("字段类型是:"+"String");
                        objStr.append("\n\tprivate ").append("String ").append(fieldName).append(";");
                        //get
                        gSMethod.append("\n\tpublic String get").append(upF).append("() {\n\t\treturn ")
                                .append(fieldName).append(";\n\t}");
                        //set
                        gSMethod.append("\n\tpublic void set").append(upF).append("(").append("String ")
                                .append(fieldName).append(") {\n\t\tthis.").append(fieldName)
                                .append(" = ").append(fieldName).append(";\n\t}");
                        break;
                }
                /*
                获取表结构的方法
                "java类型:rsMd.getColumnClassName(i + 1)
                数据库类型:"+rsMd.getColumnTypeName(i + 1)
                字段名称:"+rsMd.getColumnName(i + 1)
                字段长度:"+rsMd.getColumnDisplaySize(i + 1)
                */

                //toString
                if(i!=0)
                {
                    tSMethod.append("\", ").append(fieldName).append("=\"").append(" + ")
                            .append(fieldName).append(" + \n\t\t");
                }
                else
                {
                    tSMethod.append("\"").append(fieldName).append("=\"").append(" + ")
                            .append(fieldName).append(" + \n\t\t");
                }
            }
            //使toString字符串结束
            tSMethod.append("'").append("}").append("'").append(";").append("\n\t}");
            //在属性后,需要添加getter、setter、toString
            objStr.append("\n\n//getter setter方法").append(gSMethod)
                    .append("\n\n//toString方法").append(tSMethod);
            //最后添加大括号,使实体类字符串结束
            objStr.append("\n}");
            System.out.println("===========================================");
            System.out.println("该表生成的实体类字符串如下:\n"+objStr);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            System.out.println("\n===============您输入的表名可能不存在===============");
        }
        //最后需要释放资源
        finally
        {
            try
            {
                if (conn!=null)
                {
                    conn.close();
                }
                if (pst!=null)
                {
                    pst.close();
                }
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    }

    //使用io流,将字符串写入文件输出到磁盘上的方法
    public static void StrToObject(String path,String fromName)
    {
        FileOutputStream fileOutputStream = null;
        try
        {   //该变量用于记录java文件夹的位置,以便获取实体类对应的软件包位置
            int packNum = 0;
            StringBuilder packName = new StringBuilder("package ");
            String [] arr = path.split("\\\\");
            for (int i = 0; i < arr.length; i++)
            {
                if(arr[i].equals("java"))
                {
                    packNum = i+1;
                    break;
                }
            }
            for (int i = packNum; i < arr.length; i++)
            {
                packName.append(arr[i]);
                if(i==arr.length-1)
                {
                    break;
                }
                packName.append(".");
            }

            System.out.println("\n\n该实体类应处于的软件包位置是:"+packName);
            fileOutputStream = new FileOutputStream(path+"\\\\"+fromName+".java");
            fileOutputStream.write(packName.toString().getBytes());
            fileOutputStream.write(";\n".getBytes());
            fileOutputStream.write(objStr.toString().getBytes());

            System.out.println("实体类生成完成,请至对应的输出路径下查看");
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            System.out.println("文件路径指定异常");
        }
        catch (IOException e)
        {
            e.printStackTrace();
            System.out.println("写入异常");
        }
        finally
        {
            try
            {
                if(fileOutputStream!=null)
                {
                    fileOutputStream.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void fromToObject()
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请要连接的数据库名");
        String tableName = sc.next();
        System.out.println("请输入要转化成实体类的表名");
        String fromName = sc.next();
        System.out.println("请输入实体类要存放的路径(绝对路径)");
        String pathName = sc.next();
        //连接数据库获取表字段并转换成字符串
        TableUtils.getTableField(TableUtils.Conn(tableName),fromName);
        //使用io流写入文件到指定位置
        TableUtils.StrToObject(pathName,fromName);
    }
}

更新:2023.6.1
通过

getColumnClassName()

方法拿到数据库对应java里的数据,不需要使用switch语句了
使用lombok注解替换了getter setter toString方法,不需要拼接字符串了,但是需要在maven中加入lombok依赖
将首字母大写封装,新创建了一个将下划线转化为驼峰的方法,实现了转化驼峰命名
如下:

package utils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Scanner;

//使用注解的方式生成,优化属性获取
public class NewTableUtils
{
    //该对象用于存放表字段转换成属性的字符串
    static StringBuilder objStr = new StringBuilder();
    private static Connection Conn(String tableName)
    {
        String url="jdbc:mysql://localhost:3306/"+tableName+"?userUnicode=true&characterEncoding=utf8";
        String user="你的数据库用户名";
        String m="你的数据库密码";
        Connection connection = null;
        try
        {
            connection =  DriverManager.getConnection(url,user,password);
            System.out.println("\n==============数据库连接成功==============");
            return connection;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("\n============连接失败,请查看错误信息============");
            return connection;
        }
    }

    //首字母大写的方法
    private static String upFirstCode(String str)
    {
        return str.substring(0,1).toUpperCase()
                + str.substring(1);
    }

    //下划线命名转化驼峰命名的方法
    private static String humpString(String str)
    {
        StringBuilder finalStr = new StringBuilder();
        String [] arr = str.split("_");
        for (String s : arr)
        {
            String str2 = upFirstCode(s);
            finalStr.append(str2);
        }
        return finalStr.toString();
    }

    //转换表字段到字符串的方法
    private static void getTableField(Connection conn,String fromName)
    {
        PreparedStatement pst = null;
        try
        {   //先写入导包和注解
            objStr.append("import lombok.AllArgsConstructor;\n"+
                            "import lombok.Data;\n"+
                            "import lombok.NoArgsConstructor;\n"+
                            "import lombok.ToString;\n\n"+
                            "@Data\n"+"@AllArgsConstructor\n"+"@NoArgsConstructor\n"+"@ToString\n");
            //添加类名,首字母要大写(无法将非下划线命名的字段或表名设为驼峰,可优化)
            objStr.append("public class ").append(humpString(fromName)).append("{");
            String sql = "select * from "+fromName;
            pst = conn.prepareStatement(sql);
            ResultSetMetaData rsMd = pst.executeQuery().getMetaData();
            //遍历字段的数量的次数
            for(int i = 0; i < rsMd.getColumnCount(); i++)
            {
                //拿到数据库对应的java类型
                String className = rsMd.getColumnClassName(i + 1);
                //根据.分割java类型
                String[] javaType = className.split("\\.");
                //拿到分割后的最后的类型,就是字段的数据类型
                String finalJavaType = javaType[javaType.length - 1];
                String fieldName = humpString(rsMd.getColumnName(i + 1));
                System.out.print((i+1)+"."+"字段名称是:"+fieldName+" ");
                System.out.println("字段类型是:"+finalJavaType);
                objStr.append("\n\tprivate ").append(finalJavaType).append(" ")
                        .append(fieldName).append(";");
                /*
                获取表结构的方法
                "java类型:rsMd.getColumnClassName(i + 1)
                数据库类型:"+rsMd.getColumnTypeName(i + 1)
                字段名称:"+rsMd.getColumnName(i + 1)
                字段长度:"+rsMd.getColumnDisplaySize(i + 1)
                */
            }
            //最后添加大括号,使实体类字符串结束
            objStr.append("\n}");
            System.out.println("===========================================");
            System.out.println("该表生成的实体类字符串如下:\n"+objStr);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            System.out.println("\n===============您输入的表名可能不存在===============");
        }
        //最后需要释放资源
        finally
        {
            try
            {
                if (conn!=null)
                {
                    conn.close();
                }
                if (pst!=null)
                {
                    pst.close();
                }
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    }

    //使用io流,将字符串写入文件输出到磁盘上的方法
    private static void StrToObject(String path,String fromName)
    {
        FileOutputStream fileOutputStream = null;
        try
        {   //该变量用于记录java文件夹的位置,以便获取实体类对应的软件包位置
            int packNum = 0;
            StringBuilder packName = new StringBuilder("package ");
            String [] arr = path.split("\\\\");
            for (int i = 0; i < arr.length; i++)
            {
                if(arr[i].equals("java"))
                {
                    packNum = i+1;
                    break;
                }
            }
            for (int i = packNum; i < arr.length; i++)
            {
                packName.append(arr[i]);
                if(i==arr.length-1)
                {
                    break;
                }
                packName.append(".");
            }

            System.out.println("\n\n该实体类应处于的软件包位置是:"+packName);
            fileOutputStream = new FileOutputStream(path+"\\\\"+humpString(fromName)+".java");
            fileOutputStream.write(packName.toString().getBytes());
            fileOutputStream.write(";\n".getBytes());
            fileOutputStream.write(objStr.toString().getBytes());

            System.out.println("实体类生成完成,请至对应的输出路径下查看");
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
            System.out.println("文件路径指定异常");
        }
        catch (IOException e)
        {
            e.printStackTrace();
            System.out.println("写入异常");
        }
        finally
        {
            try
            {
                if(fileOutputStream!=null)
                {
                    fileOutputStream.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    //暴露给外部的调用方法
    public static void fromToObject()
    {
        System.out.println("请先导入lombok再使用,若还没有导入,\n再输入连接数据库的名称的时候输入" +
                "\n 0exit0 \n来退出");
        Scanner sc = new Scanner(System.in);
        System.out.println("请要连接的数据库名");
        String tableName = sc.next();
        if("0exit0".equals(tableName))
        {
            System.out.println("退出成功");
            System.exit(0);
        }
        System.out.println("请输入要转化成实体类的表名");
        String fromName = sc.next();
        System.out.println("请输入实体类要存放的路径(绝对路径)");
        String pathName = sc.next();
        //连接数据库获取表字段并转换成字符串
        NewTableUtils.getTableField(NewTableUtils.Conn(tableName),fromName);
        //使用io流写入文件到指定位置
        NewTableUtils.StrToObject(pathName,fromName);
    }
}

完整代码

GitHub: https://github.com/OtomiAsuba/TryTableFormToObj

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值