自动根据数据库表,生成相应的带注解有POJO/EO对象

为了根据数据库表,自动生成EO对象,自已经写了一段代码,步骤如下生成:

第一步:新建jdbc.properties文件,内容如下, 主要为后续配置处理

dataSource.driverClassName=com.mysql.jdbc.Driver

dataSource.url=jdbc:mysql://localhost:3306/test

dataSource.password=1234

dataSource.username=rootgenerate.tablenames=t_job  ###相应需要生成的表名,有多个时以','隔开
generate.packagename=com.elitect.network.test.eo ##生成相应的包路径

generate.path=D:/work/workplace/WiFiPlaning/src ##工程的scr目录

第二步:如下的java类 GenerateEntity


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import java.io.FileWriter;  

/**
 *
 * @GenerateEntity
 */
public class GenerateEntity {
    //properties
    private static ResourceBundle messages = ResourceBundle.getBundle("jdbc");
    /**bean需要添加的后缀*/
    private static String BeanName = "Entity";
    
    private static final String jdbcString = messages
            .getString("dataSource.url");
    private static final String userName = messages
            .getString("dataSource.username");
    private static final String password = messages
            .getString("dataSource.password");

    /**
     * 用于调试,懒得写相应的参数
     *
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static Connection getConnection() throws ClassNotFoundException,
            SQLException {
        Connection connection = null;
        connection = DriverManager
                .getConnection(jdbcString, userName, password);
        return connection;
    }

    /**
     * generate String for table
     * @param tableName  
     * @param packageName
     * @param className
     * @return
     * @throws SQLException
     */
    public static String table2pojo(String tableName,String packageName,String className) throws SQLException {
        String sql = "select * from " + tableName + " where 1 <> 1";
        PreparedStatement ps = null;
        ResultSet rs = null;
        Connection connection = null;
        try {
            connection = GenerateEntity.getConnection();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        ps = connection.prepareStatement(sql);
        rs = ps.executeQuery();
        ResultSetMetaData md = rs.getMetaData();

        int columnCount = md.getColumnCount();

        StringBuffer sb = new StringBuffer();

        StringBuffer importStr = new StringBuffer();
        importStr.append("package " + packageName + LINE + LINE);
        importStr.append("import javax.persistence.Column;" + LINE);
        importStr.append("import javax.persistence.Entity;" + LINE);
        importStr.append("import javax.persistence.Id;" + LINE);
        importStr.append("import javax.persistence.Table;" + LINE);
        boolean haveDate = false;
        boolean haveBigDecimal = false;

        sb.append("@Entity");
        sb.append(LINE);
        sb.append("@Table(name = \"" + tableName + "\")");
        sb.append(LINE);
        className = generateClassName(className,tableName);
        sb.append("public class " + className + " {");
        sb.append(LINE);

        for (int i = 1; i <= columnCount; i++) {
            sb.append(LINE);
            String coumnType = GenerateEntity.getPojoType(md
                    .getColumnTypeName(i));
            // 对于日期处理
            if (haveDate == false && "Date".equals(coumnType)) {
                haveDate = true;
                importStr.append(importDateStr + LINE);
                importStr.append("import javax.persistence.Temporal;" + LINE);
                importStr.append("import javax.persistence.TemporalType;"
                        + LINE);
                sb.append(TAB);
                sb.append("@Temporal(TemporalType.TIMESTAMP)");
                // 对于number的处理
            } else if (haveBigDecimal == false
                    && "BigDecimal".equals(coumnType)) {
                importStr.append(importBigDecimaleStr + LINE);
            }
            sb.append(TAB);
            sb.append("@Column(name=\"" + md.getColumnName(i) + "\")");
            // System.out.println(md.getColumnLabel(i));

            sb.append(TAB);
            sb.append(LINE);
            sb.append(TAB);
            sb.append("/**" + md.getColumnName(i) + "*/");
            sb.append(LINE);
            sb.append(TAB);

            sb.append("private " + coumnType + " " + md.getColumnName(i) + ";");
            sb.append(LINE);
        }

        for (int i = 1; i <= columnCount; i++) {
            sb.append(TAB);
            String pojoType = GenerateEntity.getPojoType(md
                    .getColumnTypeName(i));
            String columnName = convertFieldName(md.getColumnName(i));
            String getName = null;
            String setName = null;
            if (columnName.length() > 1) {
                getName = "public " + pojoType + " get"
                        + columnName.substring(0, 1).toUpperCase()
                        + columnName.substring(1, columnName.length()) + "() {";
                setName = "public void set"
                        + columnName.substring(0, 1).toUpperCase()
                        + columnName.substring(1, columnName.length()) + "("
                        + pojoType + " " + columnName + ") {";
            } else {
                getName = "public get" + columnName.toUpperCase() + "() {";
                setName = "public set" + columnName.toUpperCase() + "("
                        + pojoType + " " + columnName + ") {";
            }
            
            sb.append(LINE).append(TAB).append(getName);
            sb.append(LINE).append(TAB).append(TAB);
            sb.append("return " + columnName + ";");
            sb.append(LINE).append(TAB).append("}");
            sb.append(LINE);
            sb.append(LINE).append(TAB).append(setName);
            sb.append(LINE).append(TAB).append(TAB);
            sb.append("this." + columnName + " = " + columnName + ";");
            sb.append(LINE).append(TAB).append("}");
            sb.append(LINE);

        }
        sb.append("}");
        importStr.append(LINE+ sb.toString());
        return importStr.toString();
    }

    private static Map<String, String> map;
    static {
        map = new HashMap<String, String>();
        map.put("varchar", "String");
        map.put("int", "Integer");
        map.put("datetime", "Date");
        map.put("date", "Date");
        map.put("nvarchar", "String");
        map.put("char", "String");
        map.put("uniqueidentifier", "String");
        map.put("number", "BigDecimal");
        map.put("decimal", "BigDecimal");
        map.put("bigint", "Long");
        map.put("tinyint", "Boolean");
    }
    private static final String LINE = "\r\n";
    private static final String TAB = "\t";
    private static final String importDateStr = "import java.util.Date;";
    private static final String importBigDecimaleStr = "import java.math.BigDecimal;";


    public static String getPojoType(String dataType) {
        String tmp = dataType.toLowerCase();
        StringTokenizer st = new StringTokenizer(tmp);
        return map.get(st.nextToken());
    }

    /***************************************************************************
     * 将s_name 变为 sName;
     *
     * @param sName
     * @return
     */
    public static String convertFieldName(String sName) {
        String[] str = sName.toLowerCase().split("_");
        StringBuffer beanS = new StringBuffer(str[0]);
        for (int i = 1; i < str.length; i++) {
            if ("".equals(str) || str == null) {
                continue;
            }
            String info = str[i];
            beanS.append(info.substring(0, 1).toUpperCase()
                    + info.substring(1, info.length()));
        }
        return beanS.toString();
    }
    
    /**
     * 生成类名
     * @param className
     * @return
     */
    private static String generateClassName(String className,String tableName){
        if(className ==null || "".equals(className))
            className = convertFieldName(tableName) + BeanName;
        return className;
    }
    /***
     * 入口函数
     * @param args
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws SQLException,
            ClassNotFoundException {
        
        String strTables = messages.getString("generate.tablenames");
        String packageName = messages.getString("generate.packagename");
        String src= messages.getString("generate.path");
        for( String tableName:strTables.split(",")){
            try {
                String className = generateClassName(null,tableName);
                String classInfo = GenerateEntity.table2pojo(tableName, packageName,className);
                System.out.println(classInfo);
                String fileName = src + packageName.replace(".", "/") + className + ".java";
                FileWriter writer;
                writer = new FileWriter(fileName);
                writer.write(classInfo);  
                writer.close();  
                System.out.println("GenerateEntity:" +  fileName);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除前缀,并支持去除多个前缀,支持精确指定只生成哪几个的Bean,也支持模糊查找生成哪几个的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的名和字段名的支持,例如名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成的Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选功能,在文本框中已选中的在打开选对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值