`
xiang37
  • 浏览: 414221 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用JDBC生成数据库表对应的Class

 
阅读更多

简单的实现了Hibernate工具自动生成Class文件的功能。

 

 

package com.xiva.demo.util;

import java.io.File;
import java.io.IOException;
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.sql.Types;

import org.apache.commons.io.FileUtils;

/**
 * 
 * <功能简述> <详细描述>
 * 
 * @author XIVA
 * @version [1.0, 2013-5-1]
 * @see [相关类/方法]
 * @since [产品、模块版本]
 */
public class GenarateDomainClass
{

    private static Connection conn;

    private static StringBuffer classString;

    private static String lineSep = System.getProperty("line.separator");

    private static String fileName;

    static
    {
        try
        {
            Class.forName("org.gjt.mm.mysql.Driver");
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    private static void ininConn() throws SQLException
    {
        conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/blogsysdb?useUnicode=true&amp;characterEncoding=utf-8", "blogdb",
                "blogdb");
    }

    private static String getDataType(int type, int scale)
    {
        String dataType = "";

        switch (type)
        {
            case Types.LONGVARCHAR: // -1
                dataType = "Long";
                break;
            case Types.CHAR: // 1
                dataType = "Character";
                break;
            case Types.NUMERIC: // 2
                switch (scale)
                {
                    case 0:
                        dataType = "Number";
                        break;
                    case -127:
                        dataType = "Float";
                        break;
                    default:
                        dataType = "Number";
                }
                break;
            case Types.VARCHAR: // 12
                dataType = "String";
                break;
            case Types.DATE: // 91
                dataType = "Date";
                break;
            case Types.TIMESTAMP: // 93
                dataType = "Date";
                break;
            case Types.BLOB:
                dataType = "Blob";
                break;
            default:
                dataType = "String";
        }
        return dataType;
    }

    private static void queryTable(String tableName) throws SQLException
    {

        PreparedStatement preStat = conn.prepareStatement("select * from " + tableName);
        ResultSet result = preStat.executeQuery();
        ResultSetMetaData resultMeta = result.getMetaData();
        int colCount = resultMeta.getColumnCount();
        String clazzName = convertName(tableName, true);
        classString.append("public class " + clazzName + " extends BaseEntity {").append(lineSep);
        fileName = clazzName;
        for (int i = 1; i <= colCount; i++)
        {
            String dbColName = resultMeta.getColumnName(i);
            String colType = getDataType(resultMeta.getColumnType(i), resultMeta.getScale(i));
            String colName = convertName(dbColName, false);
            if (!dbColName.equals(colName))
            {
                classString.append("@Column(name = \"" + dbColName + "\")").append(lineSep);
            }
            classString.append("private " + colType + " " + colName + ";").append(lineSep);
        }
        classString.append("}");
    }

    private static String convertName(String dbname, boolean isTable)
    {
        StringBuffer className = new StringBuffer(32);

        String dbNameLow = dbname.toLowerCase();
        String[] names = dbNameLow.split("_");
        int len = names.length;
        if (len > 1)
        {
            for (int i = 0; i < len; i++)
            {
                String name = names[i];
                if (i == 0 && !isTable)
                {
                    className.append(name);
                    continue;
                }
                className.append(name.substring(0, 1).toUpperCase());
                className.append(name.substring(1));
            }
        }
        else
        {
            className.append(dbNameLow);
        }

        return className.toString();
    }

    public static void ininData(String tableName)
    {
        classString = new StringBuffer(1024);
        classString.append("package com.xiva.domain;").append(lineSep);
        classString.append(lineSep);
        classString.append("@Entity").append(lineSep);
        classString.append("@Table(name = \"" + tableName + "\")").append(lineSep);
    }

    public static void createFile(String path)
    {
        String filePath = path + File.separator + fileName + ".java";
        File file = new File(filePath);
        try
        {
            System.out.println(filePath);
            boolean isCreate = file.createNewFile();
            System.out.println(isCreate);
            FileUtils.write(file, classString, "utf-8");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 
     * @param args
     */
    public static void main(String[] args) throws SQLException
    {
        String tableName = "iv_resource";
        String path = "F:\\WorkSpace\\GitProjects\\xivamsys\\src\\com\\xiva\\domain";
        ininConn();
        ininData(tableName);
        queryTable(tableName);
        createFile(path);
        System.out.println(classString);
    }

}


 

 

生成结果如下所示:

 

package com.xiva.domain;

@Entity
@Table(name = "iv_function")
public class IvFunction extends BaseEntity {
@Column(name = "func_id")
private String funcId;
@Column(name = "func_name")
private String funcName;
@Column(name = "func_desc")
private String funcDesc;
}

 get set 的生成可以通过ctrl + shift + s快捷生成。导入的类,可以通过Ctrl + shift + o,格式化可以通过Ctrl + shift + f;文件路径可以指定。

 

分享到:
评论

相关推荐

    jdbc基础和参考

    线程安全的,一个数据库对应一个Sessionfactory(一般一个应用程序对应一个SessionFactory就够了) 3.是一个很大的缓存,本身维护了一个可配置的二级缓存 4.用来构建Session对象 Configuration 1.启动和配置...

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。...还有一个ddl2hbm,是根据数据库来导出表结构,并生成映射文件和POJO class。

    hibernate配置

    &lt;generator class="assigned"&gt;&lt;/generator&gt; //数据库中的主键生成策略 数据库中表的其它字段所对应的持久化对象中的属性名" column="对应数据库中表的其它字段名" type="java.lang.String(数据库中其它字段...

    springmvc+mybati+bootstrap

    springmvc+mybatis整合bootstrap前端框架的SMB架构,利用MybatisGenerator-v0.1.1.jar反向生成底层代码,专注于业务代码编写,达到快速开发的目的。 修改步骤: 一、修改项目名称、及包名(此步骤可忽略)。 二、...

    快逸报表在J2EE部署中最简实例

    如果你用的不是window系统,更改成与您对应的授权的文件.特别注意的是”/”反斜杠符号 ,拷贝过来的文件里原本是没有的 (6) 修改reportConfig.xml文件 在其中添加如下配置内容,主要用于数据库的连接,需要主要的地方...

    乐优商城.xmind

    name 定义了被标注字段在数据库表中所对应字段的名称; mapper service Controller 测试 报错500 实体类@table路径写错 新增 Controller @RequestBody 常用其来处理application/json类型 子主题 2 将...

    springmybatis

    3. 建立与数据库对应的 java class,以及映射文件. 在src_user下建立package:com.yihaomen.mybatis.model ,并在这个 package 下建立 User 类: 程序代码 程序代码 package com.yihaomen.mybatis.model; public class...

    ssh(structs,spring,hibernate)框架中的上传下载

     首先,必须定义一个能够从连接池中抽取出本地数据库JDBC对象(如OracleConnection,OracleResultSet等)的抽取器:nativeJdbcExtractor,这样才可以执行一些特定数据库的操作。对于那些仅封装了Connection而未包括...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    例如数据表中用户选择字段方式的改变,用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要...

    ibatis 开发指南(pdf)

    程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执 行。 大多数情况下( 特别是对新项目,新系统的开发而言) ,这样的机制无往不利...

    jpivot学习总结.doc

    该标签的主要作用是让 mondrian 执行指定的查询,该标签需要指定一个 JDBC 的 datasource 或单独指定 JDBC 连接的各个属性从而可以让 mondrian 连接到指定的数据库。 它的用法如下: jdbcDriver=...

    javaSE代码实例

    13.6.3 利用正则式对字符串进行分析 268 13.7 小结 269 第14章 集合框架——强大的对象管理器 270 14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 ...

    二十三种设计模式【PDF版】

    可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和...

    ORM软件monalisa-orm.zip

    @DB(url="jdbc:mysql://127.0.0.1:3306/test" ,username="root", password="root") 一些基本的数据库操作: //insert new User().setName("zzg.zhou").setStatus(1).save(); //parse data from type: Map, ...

    java 面试题 总结

    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上...

    超级有影响力霸气的Java面试题大全文档

    24、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态...

    JAVA面试题最全集

    描述使用JDBC连接数据库的过程 72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?ActiveX数据对象,是一个应用级程序接口. 75.四种JDBC方式?目前的版本? 76.EJB有哪几种?区别是什么? 77.JavaBean与...

Global site tag (gtag.js) - Google Analytics