java自动生成entity文件

网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表).

为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件,修改下配置后就可以使用了,传送门

1.把字段抽象为一个类

/**
 * 字段信息表
 */
class FieldMeta {
    private String fieldName;    //字段名
    private String fieldDataType;   //字段类型
    private int fieldLength;    //字段长度
    private String fieldComment;    //字段备注

    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldDataType() {
        if(fieldDataType.equalsIgnoreCase("bit")){
            return "boolean";
        }else if(fieldDataType.equalsIgnoreCase("tinyint")){
            return "byte";
        }else if(fieldDataType.equalsIgnoreCase("smallint")){
            return "short";
        }else if(fieldDataType.equalsIgnoreCase("int")){
            return "int";
        }else if(fieldDataType.equalsIgnoreCase("bigint")){
            return "long";
        }else if(fieldDataType.equalsIgnoreCase("float")){
            return "float";
        }else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")
                || fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")
                || fieldDataType.equalsIgnoreCase("smallmoney")){
            return "double";
        }else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")
                || fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")
                || fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT")){
            return "String";
        }else if(fieldDataType.equalsIgnoreCase("datetime")){
            return "Date";
        }else if(fieldDataType.equalsIgnoreCase("image")){
            return "Blod";
        }
        return fieldDataType;
    }
    public void setFieldDataType(String fieldDataType) {
        if(fieldDataType.equalsIgnoreCase("bit")){
            this.fieldDataType = "boolean";
        }else if(fieldDataType.equalsIgnoreCase("tinyint")){
            this.fieldDataType = "byte";
        }else if(fieldDataType.equalsIgnoreCase("smallint")){
            this.fieldDataType = "short";
        }else if(fieldDataType.equalsIgnoreCase("int")){
            this.fieldDataType = "int";
        }else if(fieldDataType.equalsIgnoreCase("bigint")){
            this.fieldDataType = "long";
        }else if(fieldDataType.equalsIgnoreCase("float")){
            this.fieldDataType = "float";
        }else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")
                || fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")
                || fieldDataType.equalsIgnoreCase("smallmoney")){
            this.fieldDataType = "double";
        }else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")
                || fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")
                || fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT")
                || fieldDataType.equalsIgnoreCase("TIMESTAMP")){
            this.fieldDataType = "String";
        }else if(fieldDataType.equalsIgnoreCase("datetime") || fieldDataType.equalsIgnoreCase("date")){
            this.fieldDataType = "Date";
        }else if(fieldDataType.equalsIgnoreCase("image")){
            this.fieldDataType = "Blod";
        }else {
            this.fieldDataType = fieldDataType;
        }
    }

    public int getFieldLength() {
        return fieldLength;
    }
    public void setFieldLength(int fieldLength) {
        this.fieldLength = fieldLength;
    }

    public String getFieldComment() {
        return fieldComment;
    }
    public void setFieldComment(String fieldComment) {
        this.fieldComment = fieldComment;
    }

}

2.通用方法,jdbc的创建与关闭,首字母大写方法.

   /**
     * 功能:将输入字符串的首字母改成大写
     * @param str
     * @return
     */
    private String upFirstChar(String str) {
        if (str!=null&&str.length()>0) {
            char[] ch = str.toCharArray();
            if(ch[0] >= ‘a‘ && ch[0] <= ‘z‘){
                ch[0] = (char)(ch[0] - 32);
            }
            return new String(ch);
        }
        return null;
    }

    /**
     * 获取jdbc连接
     */
    private Connection getJdbcCon(){
        try {
            Class.forName(DRIVER);
            return DriverManager.getConnection(URL,NAME,PASS);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 关闭所有资源
     */
    private void closeAll(ResultSet resultSet,PreparedStatement preparedStatement,Connection connnection,CallableStatement callableStatement) {
        // 关闭结果集对象
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        // 关闭PreparedStatement对象
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        // 关闭CallableStatement 对象
        if (callableStatement != null) {
            try {
                callableStatement.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        // 关闭Connection 对象
        if (connnection != null) {
            try {
                connnection.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
    }

3.生成类,生成字段,生成方法

   /**
     * 生成类主题框架
     */
    public String genFrame(List<FieldMeta> fmls,String tableName){
        StringBuilder sb = new StringBuilder();
        //package空间
        sb.append("package "+this.packagePath+";\r\n\r\n");
        // 判断是否导入工具包
        if (f_util) {
            sb.append("import java.util.Date;\r\n");
        }
        if (f_sql) {
            sb.append("import java.sql.*;\r\n");
        }
        // 注释部分
        sb.append("/**\r\n");
        sb.append(" * 名   称:" + tableName + "\r\n");
        sb.append(" * 描   述:\r\n");
        sb.append(" * 作   者:" + this.authorName + "\r\n");
        sb.append(" * 时   间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) + "\r\n");
        sb.append(" * --------------------------------------------------" + "\r\n");
        sb.append(" * 修改历史" + "\r\n");
        sb.append(" * 序号    日期    修改人     修改原因 "+ "\r\n");
        sb.append(" * 1" + "\r\n");
        sb.append(" * **************************************************" + "\r\n");
        sb.append(" */\r\n");
        // 实体部分
        sb.append("public class " + upFirstChar(tableName) + "{\r\n");
        //字段部分
        genAttrs(sb, fmls);
        //方法部分
        genMethods(sb, fmls);
        sb.append("}\r\n");
        return new String(sb);
    }
    /**
     * 功能:生成所有属性
     */
    private void genAttrs(StringBuilder sb,List<FieldMeta> fmls) {
        for (int i = 0; i < fmls.size(); i++) {
            sb.append("\t");
            sb.append("private " + fmls.get(i).getFieldDataType() + " "
                    + fmls.get(i).getFieldName() + ";");
            sb.append("\t/*"+fmls.get(i).getFieldComment()+"\tlen: "+fmls.get(i).getFieldLength()+"*/\r\n");
        }
        sb.append("\r\n");
    }
    /**
     * 功能:生成所有方法
     */
    private void genMethods(StringBuilder sb,List<FieldMeta> fmls){
        for (int i = 0; i < fmls.size(); i++) {
            sb.append("\tpublic void set"+upFirstChar(fmls.get(i).getFieldName())+"("+fmls.get(i).getFieldDataType()+" "+fmls.get(i).getFieldName()+"){\r\n");
            sb.append("\t\tthis."+fmls.get(i).getFieldName()+"="+fmls.get(i).getFieldName()+";\r\n");
            sb.append("\t}\r\n");
            sb.append("\tpublic "+fmls.get(i).getFieldDataType()+" get"+upFirstChar(fmls.get(i).getFieldName())+"(){\r\n");
            sb.append("\t\treturn "+fmls.get(i).getFieldName()+";\r\n");
            sb.append("\t}\r\n");
            sb.append("\r\n");
        }
        sb.append("");
    }

4.其他方法,写入文件方法,获取所有表名方法

    /**
     * 写入文件
     */
    private void wirteToFile(String content,String packagePath,String tableName){
        PrintWriter pw = null;
        BufferedWriter bw = null;
        File dir = new File("");    //根据空文件获取项目路径
        //entity文件父文件夹全路径
        String dirpath = dir.getAbsolutePath() + "\\src\\"+packagePath.replace(".", "\\");
        File parentDir = new File(dirpath);
        if (!parentDir.exists()) {    //判断是否存在该路径
            parentDir.mkdirs();     //不存在则创建
        }
        String filePath = dirpath+"\\"+upFirstChar(tableName)+".java";    //java文件路径
        File file = new File(filePath);
        try {
            if (!file.exists()) {    //判断是否存在java文件
                file.createNewFile();    //不存在则创建
            }else {
                System.out.print("表     "+tableName+"   的entity实体已存在于:");
            }
            pw = new PrintWriter(file);
            bw = new BufferedWriter(pw);
            bw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                if (bw!=null) {
                    bw.close();
                }
                if (pw!=null) {
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(filePath);
    }

    //获取所有表名
    private String[] getAllTables(){
        List<String> stringList = new ArrayList<String>();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        con = getJdbcCon();
        String sql = "show tables";
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                stringList.add(rs.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            closeAll(rs, ps, con, null);
        }
        return stringList.toArray(new String[stringList.size()]);
    }

5.执行

private String packagePath = "com.qy.entity";    //指定实体生成所在包的路径
    //表名以","分隔;若为"*"则生成所有表的entity文件
    private String tableNames = "*";    

    private String authorName = "邱宇";    //作者名字
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/protocol";
    private static final String NAME = "qy";
    private static final String PASS = "199526";

    private boolean f_util = false;  // 是否需要导入包java.util.*
    private boolean f_sql = false;  // 是否需要导入包java.sql.*

    public static void main(String[] args) {
        new CreateEntity();
    }

    public CreateEntity(){

        String[] tables = null;
        if (this.tableNames=="*") {
            tables = getAllTables();
        }else {
            tables = this.tableNames.split(",");
        }
        for (int i = 0; i < tables.length; i++) {
            new CreateEntity(tables[i]);
            f_util = false;
            f_sql = false;
        }
    }

    public CreateEntity(String tableName){
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        DatabaseMetaData dbmd = null;
        //ResultSetMetaData rsmd= null;
        List<FieldMeta> fmls = new ArrayList<FieldMeta>();
        String sql= "select * from "+tableName;
        try {
            con=getJdbcCon();
            dbmd = con.getMetaData();
            rs = dbmd.getColumns(con.getCatalog(), null, tableName, null);
            while (rs.next()) {
                FieldMeta fm = new FieldMeta();
                fm.setFieldName(rs.getString("COLUMN_NAME"));
                if (rs.getString("TYPE_NAME").equalsIgnoreCase("datetime")
                        || rs.getString("TYPE_NAME").equalsIgnoreCase("date")) {
                    f_util = true;
                }
                if (rs.getString("TYPE_NAME").equalsIgnoreCase("image")
                        || rs.getString("TYPE_NAME").equalsIgnoreCase("text")) {
                    f_sql = true;
                }
                fm.setFieldDataType(rs.getString("TYPE_NAME"));
                fm.setFieldLength(Integer.parseInt(rs.getString("COLUMN_SIZE")));
                fm.setFieldComment(rs.getString("REMARKS").replace("\r\n", "  "));   //注释中的换行改为空格
                fmls.add(fm);
            }
            /* 从resultSet读取的ResultSetMetaData没有注释等详细信息
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            rsmd = rs.getMetaData();
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
                FieldMeta fm = new FieldMeta();
                fm.setFieldName(rsmd.getColumnName(i+1));
                if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("datetime")) {
                    f_util = true;
                }
                if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("image")
                        || rsmd.getColumnTypeName(i+1).equalsIgnoreCase("text")) {
                    f_sql = true;
                }
                fm.setFieldDataType(rsmd.getColumnTypeName(i+1));
                fm.setFieldLength(rsmd.getColumnDisplaySize(i+1));
                //fm.setFieldComment(fieldComment);
                fmls.add(fm);
            }*/

        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            if (con!=null) {
                closeAll(rs, ps, con, null);
            }
        }
        //生成内容
        String content = genFrame(fmls,tableName);
        //System.out.println(content);
        //写入到文件
        wirteToFile(content,this.packagePath,tableName);
    }

源码

时间: 2024-09-28 22:53:32

java自动生成entity文件的相关文章

Java Itext 生成PDF文件

利用Java Itext生成PDF文件并导出,实现效果如下: PDFUtil.java package com.jeeplus.modules.order.util; import java.io.OutputStream; import java.math.BigDecimal; import java.net.URL; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Arr

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

新版本ADT创建Android项目无法自动生成R文件解决办法

本人使用的是ADT是Version 23.0.2,支持Android 6.0之后的系统环境,最高版本23,在创建Android项目的时候,每次创建项目选择“Compile With”低于6.0版本的时候,都无法自动生成R文件,这个时候MainActivity文件报错,反复点击项目后执行“Clean”后,错误无法解 决,按照之前不生成R文件的办法解决不了,那怎么办呢?先分析错误产生的原因. 案例参考:新版本ADT创建Android项目无法自动生成R文件解决办法 | TeachCourse

Makefile自动生成头文件依赖

前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖. CC = gcc CFLAGS = -Wall -O INCLUDEFLAGS = LDFLAGS = OBJS = seq.o TARGETS = test_seq .PHONY:all all : $(TARGETS) test_seq:test_seq.o $(OBJS) $(CC) -o

程序自动生成dump文件

作用 可以再程序崩溃后保留崩溃现场,方便事后查找程序的崩溃原因. 前提是奔溃程序所对应的代码和PDB文件都是匹配的(发布程序的时候,保留源代码和PDB文件). 代码示例 原理是使用DbgHelp的自定义未处理异常来保留崩溃现场到文件的,使用直接包含该头文件,然后再main函数的开始就调用EnableAutoDump函数. // pro_dump.h // 包含本文件是用来处理程序崩溃时自动生成dump文件的 // 生成的dump文件在程序的工作目录下 // 文件名格式是:年月日_时分秒.dmp

程序自动生成Dump文件()

前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了mini dump文件格式后,完全可以程序自动生成Dump文件. 本文主要讨论以下内容: 1.  运行原理 2.  程序修改 3.  注意事项 一.   运行原理 当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter(

RHEL6下packagekit自动生成repo文件

RHEL6中增加了一个新的包管理器packagekit. PackageKit 支持将 yum.conary.apt.box.pacman/alpm 等作为后端 然而在实际使用过程中发现一个问题 我将ISO挂载作为YUM源,在安装包后,会在/etc/yum.repo.d/目录下自动生成一个packagekit-media.repo文件 文件中所指定的源是失效的,从而导致yum安装包失败,错误提示为: Error: Cannot retrieve repository metadata (repo

make自动生成依赖文件的两种形式

最近编译源文件发现当修改头文件后,make并不会自动把包含此头文件的所有源文件重新编译,而每次都是需要把对应的中间文件清除才能重新编译,非常的麻烦.因此需要make自动对源文件所依赖的头文件进行管理,即make自动生成依赖文件.鉴于本人的刚开始写的博客,很多方面经验不足,比如如何介绍我所用到的知识等,现在只是对我在过程中遇到的问题进行记录,相关的知识可以查看gnu make中文文档,上网等等. 遇到的问题记录如下:1.make在生成依赖文件后并不正确:原因是生成的依赖文件中的目标文件(.d与.o

java自动生成验证码

代码结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="