如何让java只根据数据库表名自动生成实体类

让我来讲解一下如何让Java只根据数据库表名自动生成实体类的完整攻略。

1. 创建Maven工程

首先,我们需要创建一个Maven工程,用于管理我们的项目依赖和构建。

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>auto-generate-entity</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 数据库连接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
    </dependencies>
</project>

2. 连接数据库

我们需要通过Java代码连接到数据库,然后获取数据库中的表名。

public class DatabaseUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";

    public static Set<String> getTableNames() {
        Set<String> tableNames = new HashSet<>();

        try (Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
             ResultSet rs = connection.getMetaData().getTables(null, null, null, null)) {
            while (rs.next()) {
                tableNames.add(rs.getString("TABLE_NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return tableNames;
    }
}

3. 自动生成实体类

接下来,我们可以根据表名自动生成实体类了。

public class EntityGenerator {
    private static final String PACKAGE_NAME = "com.example.entity";
    private static final String FILE_PATH = "src/main/java/com/example/entity/";

    public static void generate() {
        Set<String> tableNames = DatabaseUtil.getTableNames();

        for (String tableName : tableNames) {
            try (PrintWriter writer = new PrintWriter(FILE_PATH + tableName + ".java")) {
                writer.println("package " + PACKAGE_NAME + ";");
                writer.println();
                writer.println("public class " + tableName + " {");

                try (Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
                     ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM " + tableName + " LIMIT 1")) {
                    ResultSetMetaData metaData = rs.getMetaData();

                    for (int i = 1; i <= metaData.getColumnCount(); i++) {
                        String columnName = metaData.getColumnName(i);
                        String columnClassName = metaData.getColumnClassName(i);
                        int dotIndex = columnClassName.lastIndexOf(".");
                        String columnType = columnClassName.substring(dotIndex + 1);
                        writer.println("    private " + columnType + " " + toCamelCase(columnName) + ";");
                    }

                    writer.println("}");
                    writer.flush();
                }
            } catch (SQLException | FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    private static String toCamelCase(String s) {
        StringBuilder sb = new StringBuilder();
        boolean capitalizeNext = false;

        for (char c : s.toCharArray()) {
            if (c == '_') {
                capitalizeNext = true;
            } else {
                if (capitalizeNext) {
                    sb.append(Character.toUpperCase(c));
                    capitalizeNext = false;
                } else {
                    sb.append(c);
                }
            }
        }

        return sb.toString();
    }
}

上述代码通过遍历数据库中的所有表名,然后循环获取每个表的列信息,生成相应的实体类。实体类的命名规则为表名的驼峰命名方式。

假设我们的数据库有一张表名为user_info,则生成的实体类为:

package com.example.entity;

public class user_info {
    private Long id;
    private String name;
    private String gender;
    private Integer age;

    // 省略 getter/setter
}

示例1

假设我们的数据库有两张表,分别为user_infoorder_info,我们可以通过如下代码生成对应的实体类:

public static void main(String[] args) {
    EntityGenerator.generate();
}

这段代码执行后,会在项目的src/main/java/com/example/entity/目录下生成两个Java文件,分别为user_info.javaorder_info.java

示例2

假设我们的实体类需要扩展,为所有实体类添加一个公共的BaseEntity,我们可以修改EntityGenerator类,修改后的代码如下:

public class EntityGenerator {
    private static final String PACKAGE_NAME = "com.example.entity";
    private static final String FILE_PATH = "src/main/java/com/example/entity/";
    private static final String BASE_IMPORT = "com.example.entity.BaseEntity";

    public static void generate() {
        // 省略前面的代码

        for (String tableName : tableNames) {
            try (PrintWriter writer = new PrintWriter(FILE_PATH + tableName + ".java")) {
                writer.println("package " + PACKAGE_NAME + ";");
                writer.println();
                writer.println("import " + BASE_IMPORT + ";");
                writer.println();
                writer.println("public class " + tableName + " extends BaseEntity {");

                // 省略后面的代码
            } catch (SQLException | FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

在生成实体类时添加了一个基础类BaseEntity的继承关系,之后我们只需要在BaseEntity类中添加一些公共的属性和方法,即可为所有实体类提供基础功能。

关于一些细节处理,代码中已包含注释。希望对你有所帮助,如有疑问欢迎继续咨询。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何让java只根据数据库表名自动生成实体类 - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解SpringBoot集成jsp(附源码)+遇到的坑

    接下来我将为你详细讲解 “详解SpringBoot集成jsp(附源码)+遇到的坑”的完整攻略,并且提供两条示例。 一、前言 SpringBoot的主要目标是简化Spring应用程序的开发以及部署。在实际开发中,我们常常需要集成jsp,但是SpringBoot默认情况下是不支持jsp的,需要我们进行特殊的配置,下面将详细讲解SpringBoot集成jsp的步骤…

    Java 2023年5月15日
    00
  • Java后台线程操作示例【守护线程】

    下面是Java后台线程操作示例【守护线程】的完整攻略。 什么是守护线程? 在Java中,有两种线程:用户线程和守护线程。 守护线程是在后台运行的线程,不能阻止JVM退出,就是当所有用户线程都结束时,JVM会正常退出。 当创建一个新的线程时,它继承了创建它的线程的特点和属性。 默认情况下,线程都是用户线程,这意味着如果还有用户线程在运行,JVM就不会停止。 要…

    Java 2023年5月18日
    00
  • Java操作IO对象流进行数据的读写

    针对Java操作IO(输入/输出)对象流进行数据的读写,一般包括以下的几个步骤: 创建IO对象流(如FileInputStream、FileOutputStream等)以及处理器流(如InputStreamReader、OutputStreamWriter等) 读、写或处理流中读写的数据(如读文本文件、写二进制文件等) 关闭流以释放资源,避免内存泄漏 具体步…

    Java 2023年5月26日
    00
  • java实现随机数生成器

    生成随机数是我们在Java程序中经常遇到的问题,Java提供了一些内置的方法来生成伪随机数,我们也可以使用外部库来实现更高级别的随机化过程。本文将为大家介绍Java实现随机数生成器的完整攻略。 生成伪随机数 Java为我们提供了一些内置的类,比如Random和Math,来生成伪随机数。 使用Random类 Random类是Java中最基本的生成随机数的类之一…

    Java 2023年5月23日
    00
  • java中out.print和out.write的方法

    让我来为您详细讲解Java中out.print和out.write的方法。 out.print和out.write的方法 在Java中,System.out是一个静态成员变量,它是Java标准输出流的一个对象。通过System.out,我们可以向控制台输出信息。 System.out对象有两个常用的方法:print()和write()。两者的用途相似,但细节…

    Java 2023年5月26日
    00
  • java编写全年考勤日历

    下面我将详细介绍如何用Java编写全年考勤日历的完整攻略。 1. 设计思路 基本思路是从一年的第一天开始,每一天都计算它是星期几,再根据周末、节假日等情况进行判断,最终输出考勤日历。这个思路分为以下几个步骤: 获取当前年份,以及这一年有多少天(平年365天,闰年366天) 从1月1日开始遍历每一天,计算当天是星期几 判断当天是否是周末,如果是周末则标记为“休…

    Java 2023年6月1日
    00
  • JavaSpringBoot报错“NoSuchMethodError”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“NoSuchMethodError”错误。这个错误通常是由以下原因之一引起的: 依赖项版本不兼容:如果您的应用程序依赖项版本不兼容,则可能会出现此错误。在这种情况下,需要确保所有依赖项版本兼容。 类或方法名称错误:如果类或方法名称错误,则可能会出现此错误。在这种情况下,需要确保类或方法名称正确。 以下…

    Java 2023年5月5日
    00
  • idea使用外置tomcat配置springboot详细步骤

    下面是我为你准备的“idea使用外置tomcat配置springboot详细步骤”的攻略。希望能对你有所帮助。 1. 确定工具版本 在开始这个过程之前,我们需要确定使用的工具版本,以确保配置的正确性。以下是我们使用的工具版本: IDE: IntelliJ IDEA 2020.2 Tomcat: Apache Tomcat 9.0.38 Spring Boot…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部