首先有几点声明:

1、代码是在别人的基础进行改写的;

2、大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人;

3、刚刚毕业,水平有限,肯定有许多不足之处;

4、希望刚刚学习java的同学能有所启发。

//这个是做转换的类,里面的DB只是封装了数据库的连接,大家可以用自己的,随意

package com.tt.util.gen.entity.tool;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import com.tt.util.DB;

public class GenEntityMysql {

private String packageOutPath;// 指定实体生成所在包的路径
    private String authorName;// 作者名字
    private String tablename;// 表名
    private String databasename;// 数据库名
    private List<String> tablenames;// 拿到对应数据库中所有的实体类(实体类需要与其他表明做区分)
    private List<String> colnames; // 列名集合
    private List<String> colTypes; // 列名类型集合
    private boolean f_util = false; // 是否需要导入包java.util.*
    private boolean f_sql = false; // 是否需要导入包java.sql.*

/*
     * 构造函数
     */
    public GenEntityMysql() {

// 使用properties读取配置文件
        Properties prop = new Properties();
        try {
            InputStream genentity = getClass().getResourceAsStream(
                    "/genentity.properties");
            prop.load(genentity);

if (genentity != null) {
                genentity.close();
            }
        } catch (Exception e) {
            System.out.println("file " + "catalogPath.properties"
                    + " not found!\n" + e);
        }
        this.databasename = prop.getProperty("databasename").toString();
        this.tablename = prop.getProperty("tablename").toString();
        this.packageOutPath = prop.getProperty("packageOutPath").toString();
        this.authorName = prop.getProperty("authorName").toString();
    }

// 创建多个实体类
    private void genEntity(List<String> tablenames, Connection conn) {
        // 使用第归生成文件
        for (String tablename : tablenames) {
            this.genEntity(tablename, conn);
        }
    }

// 创建单个实体类
    private void genEntity(String tablename, Connection conn) {
        String sql = "select * from " + tablename;
        PreparedStatement pstmt = null;
        ResultSetMetaData rsmd = null;
        try {
            pstmt = DB.getPStmt(conn, sql);
            rsmd = pstmt.getMetaData();
            int size = rsmd.getColumnCount(); // 统计列
            colnames = new ArrayList<String>();
            colTypes = new ArrayList<String>();

for (int i = 0; i < size; i++) {
                colnames.add(rsmd.getColumnName(i + 1));
                colTypes.add(rsmd.getColumnTypeName(i + 1));

if (colTypes.get(i).equalsIgnoreCase("datetime")) {
                    f_util = true;
                }
                if (colTypes.get(i).equalsIgnoreCase("image")
                        || colTypes.get(i).equalsIgnoreCase("text")) {
                    f_sql = true;
                }
            }
            System.out.println(colnames);
            System.out.println(colTypes);
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } finally {
            DB.close(pstmt);
        }
        // 在内存中生成代码
        String content = parse(tablename);

// 写入到文件中
        try {
            File directory = new File("");
            String outputPath = directory.getAbsolutePath() + "/src/"
                    + this.packageOutPath.replace(".", "/") + "/";
            System.out.println("写出的路径:" + outputPath);
            // 检测路径是否存在,不存在就创建路径
            File path = new File(outputPath);
            if (!path.exists() && !path.isDirectory()) {
                path.mkdir();
                System.out.println(path.exists());
            }
            // 创建文件
            outputPath += initcap(tablename) + ".java";
            File file = new File(outputPath);
            if (!file.exists()) {
                file.createNewFile();
            }
            // 写出到硬盘
            FileWriter fw = new FileWriter(file);
            PrintWriter pw = new PrintWriter(fw);
            pw.println(content);
            pw.flush();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

private void getAllEntityTable(Connection conn, List<String> tablenames) {
        ResultSet rs = null;
        try {
            DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
            /*
             * TABLE_CAT String => 表类别(可为 null)
             * TABLE_SCHEM String => 表模式(可为null)
             * TABLE_NAME String => 表名称
             * TABLE_TYPE String => 表类型
             */
            rs = dmd.getTables(null, null, "%", null);
            while (rs.next()) {
                tablenames.add(rs.getString("TABLE_NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

/**
     *
     * @param tablename
     * @return
     */
    private String parse(String tablename) {
        StringBuffer sb = new StringBuffer();

// 判断是否导入工具包
        if (f_util) {
            sb.append("import java.util.Date;\r\n");
        }
        if (f_sql) {
            sb.append("import java.sql.*;\r\n");
        }
        sb.append("package " + this.packageOutPath + ";\r\n");
        sb.append("\r\n");
        // 注释部分
        sb.append("   /**\r\n");
        sb.append("    * " + tablename + " 实体类\r\n");
        sb.append("    * " + new Date() + " " + this.authorName + "\r\n");
        sb.append("    */ \r\n");
        // 实体部分
        sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");
        processAllAttrs(sb);// 属性
        processAllMethod(sb);// get set方法
        sb.append("}\r\n");

return sb.toString();
    }

/**
     * 功能:生成所有属性
     *
     * @param sb
     */
    private void processAllAttrs(StringBuffer sb) {

for (int i = 0; i < colnames.size(); i++) {
            sb.append("\tprivate " + sqlType2JavaType(colTypes.get(i)) + " "
                    + colnames.get(i) + ";\r\n");
        }

}

/**
     * 功能:生成所有方法
     *
     * @param sb
     */
    private void processAllMethod(StringBuffer sb) {

for (int i = 0; i < colnames.size(); i++) {
            sb.append("\tpublic void set" + initcap(colnames.get(i)) + "("
                    + sqlType2JavaType(colTypes.get(i)) + " " + colnames.get(i)
                    + "){\r\n");
            sb.append("\t\tthis." + colnames.get(i) + "=" + colnames.get(i)
                    + ";\r\n");
            sb.append("\t}\r\n");
            sb.append("\tpublic " + sqlType2JavaType(colTypes.get(i)) + " get"
                    + initcap(colnames.get(i)) + "(){\r\n");
            sb.append("\t\treturn " + colnames.get(i) + ";\r\n");
            sb.append("\t}\r\n");
        }

}

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

return new String(ch);
    }

/**
     * 功能:获得列的数据类型
     *
     * @param sqlType
     * @return
     */
    private String sqlType2JavaType(String sqlType) {

if (sqlType.equalsIgnoreCase("bit")) {
            return "boolean";
        } else if (sqlType.equalsIgnoreCase("tinyint")) {
            return "byte";
        } else if (sqlType.equalsIgnoreCase("smallint")) {
            return "short";
        } else if (sqlType.equalsIgnoreCase("int")) {
            return "int";
        } else if (sqlType.equalsIgnoreCase("bigint")) {
            return "long";
        } else if (sqlType.equalsIgnoreCase("float")) {
            return "float";
        } else if (sqlType.equalsIgnoreCase("decimal")
                || sqlType.equalsIgnoreCase("numeric")
                || sqlType.equalsIgnoreCase("real")
                || sqlType.equalsIgnoreCase("money")
                || sqlType.equalsIgnoreCase("smallmoney")) {
            return "double";
        } else if (sqlType.equalsIgnoreCase("varchar")
                || sqlType.equalsIgnoreCase("char")
                || sqlType.equalsIgnoreCase("nvarchar")
                || sqlType.equalsIgnoreCase("nchar")
                || sqlType.equalsIgnoreCase("text")) {
            return "String";
        } else if (sqlType.equalsIgnoreCase("datetime")) {
            return "Date";
        } else if (sqlType.equalsIgnoreCase("image")) {
            return "Blod";
        }

return null;
    }

/**
     * 出口 TODO
     *
     * @param args
     */
    public static void main(String[] args) {

new GenEntityMysql().start();

}

private void start() {
        // 创建连接
        Connection conn = DB.getConn();

if (databasename != null && !databasename.equals("")
                && tablename != null && !tablename.equals("")) {
            System.out.println("databasename 和 tablename 不能同时存在");
        } else {
            // 如果配置文件中有数据库名字,则可以拿到其中所有的实体类
            if (databasename != null && !databasename.equals("")) {
                // 获取所有实体表名字
                tablenames = new ArrayList<String>();
                getAllEntityTable(conn, tablenames);
                System.out.println(tablenames);
                // 为每个实体表生成实体类
                genEntity(tablenames, conn);
            } else {
                // 为指定实体表生成实体类
                genEntity(tablename, conn);
            }

// 关闭数据库连接
            if (conn != null) {
                DB.close(conn);
            }
        }

}

}

需要一个配置文件,位置随意(你可能需要对代码中路径进行改动),我的放到根目录下 genentity.properties

内容:

packageOutPath=com.tt.model
authorName=\u8D75\u5FD7\u4F1F
tablename=
databasename=test

注意:DB的那个我会再发一份(如果大家需要看的话),因为放到一起太多了,看着会吐,第一次发博客!谢谢大家!

如何通过java反射将数据库表生成实体类?的更多相关文章

  1. symfony 数据库表生成实体、迁移数据库

    从数据库表生成实体 1. 由数据库生成模型: php bin/console doctrine:mapping:convert --from-database yml D:\db\ D:\test_b ...

  2. django根据已有数据库表生成model类

    django根据已有数据库表生成model类 创建一个Django项目 django-admin startproject 'xxxx' 修改setting文件,在setting里面设置你要连接的数据 ...

  3. MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

    前文: hibernate带给我们的O/RMapping思想是很正确的,即从面相对象的角度来设计工程中的实体对象,建立pojo,然后在编写hbm.xml映射文件来生成数据表.但是在实际开发中,往往我们 ...

  4. MyEclipse数据库反向生成实体类

    MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...

  5. J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式

    J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式   反向工程又称逆向工程.   开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...

  6. 使用T4为数据库自动生成实体类

    T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...

  7. 自定义tt文本模板实现MySql指数据库中生成实体类

    自定义tt文本模板实现MySql指数据库中生成实体类 1.在项目中依次点击“添加”/“新建项”,选择“文本模板”,输入名称后点击添加. 2.在Base.tt中添加如下代码. <#@ templa ...

  8. IDEA快速生成数据库表的实体类

    IDEA连接数据库 IDEA右边侧栏有个DataSource,可以通过这个来连接数据库,我们先成功连接数据库 点击进入后填写数据库进行连接,注意记得一定要去Test Connection 确保正常连接 ...

  9. 使用hibernate利用实体类生成表和利用表生成实体类

    1,配置数据库,这里以oracle数据库为例.点击右侧Database图标:

随机推荐

  1. python初探-数据类型

    数据类型 可以使用BIF type()来查看对象的类型 数字 int float long 布尔(bool) True 机内表示1,机器识别非0 False 机内表示0,机器识别0 空值 None 字 ...

  2. [转]printf 函数实现的深入剖析

    研究printf的实现,首先来看看printf函数的函数体 int printf(const char *fmt, ...) { int i; char buf[256];          va_l ...

  3. Juicy Couture_百度百科

    Juicy Couture_百度百科 Juicy Couture

  4. python wsgi

    什么是wsgi? wsgi是一个web组件的接口防范,wsgi将web组件分为三类:web服务器,web中间件,web应用程序 wsgi基本处理模式为:wsgi Server -> wsgi m ...

  5. iOS 7 标签栏控制器进行模态视图跳转后变成透明

    要解决此问题,需要设置tabBar的如下属性: self.tabBar.translucent = NO;

  6. 覆盖与重载与隐藏——SAP电面(3)

    参考:http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042 8.2.1 重载与覆盖 成员函数被重载的特征: (1)相同的范围 ...

  7. USACO Section 5.4 TeleCowmunication(最小割)

    挺裸的一道最小割.把每台电脑拆成一条容量为1的边,然后就跑最大流.从小到大枚举每台电脑,假如去掉后 最大流=之前最大流+1,那这台电脑就是answer之一了. -------------------- ...

  8. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  9. maxContainerCapability 设置不足

    异常: REDUCE capability required is more than the supported max container capability in the cluster. K ...

  10. java和.net 处理任意格式日期字符串转日期类型,

    1.SimpleDateFormat.parse 把指定格式字符串转日期类型 public static Calendar convToCalender(String str,String templ ...