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

本文介绍了一种使用Hibernate工具自动生成Java实体类的方法。通过连接数据库并解析表结构,能够快速生成对应的实体类代码,包括字段及注解。此方法提高了开发效率,简化了编码流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的实现了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;文件路径可以指定。

 

### 使用 MyBatis Plus 自动生成数据库结构 #### 定义实体 为了使用 MyBatis Plus 自动生成数据库结构,首先需要定义好实体并添加相应的注解。这有助于框架理解如何映射对象到数据库格。 ```java import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("user") public class User { private Long id; private String username; private String password; // 其他字段 } ``` 上述代码展示了 `User` 实体的定义方式[^4]。 #### 配置数据源 接着,在项目的配置文件中设置合适的数据源连接信息以便于 MyBatis Plus 能够访问目标数据库执行DDL语句操作。 对于 Spring Boot 应用程序而言,通常是在 `application.properties` 或者 `application.yml` 文件里完成这项工作: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver username: root password: your_password ``` 此部分描述了如何在应用程序属性文件内指定 MySQL 数据库的相关参数[^1]。 #### 启用自动建功能 为了让 MyBatis Plus 可以根据实体来自动生成对应数据库结构,还需要进一步调整全局配置项或特定实体级别的元数据处理器逻辑。 一种方法是利用 `GlobalConfig` 来进行全局范围内的设定;另一种则是继承抽象基实现更细粒度控制。例如可以通过重写 `MetaObjectHandler` 接口的方法来处理默认值填充等问题[^2]。 另外,如果希望所有实体共享相同的主键策略,则可以考虑创建一个公共父级模型作为模板[^3]。 最后值得注意的是,默认情况下 MyBatis Plus 并不会主动去同步实体变更至实际物理存储层面——即它并不会直接修改现有的模式设计。因此要使该特性生效可能还需借助第三方工具或是编写自定义 SQL 初始化脚本配合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值