如何让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基于HttpMessageConverter实现全局日期格式化

    下面是详细讲解“SpringBoot基于HttpMessageConverter实现全局日期格式化”的完整攻略。 1. 什么是HttpMessageConverter HttpMessageConverter 是 Spring 框架中的一个接口,用于将请求和响应的数据转换为特定的格式。它可以将浏览器提交的数据(如:application/json 、 app…

    Java 2023年5月20日
    00
  • SpringMVC实现数据绑定及表单标签

    讲解“SpringMVC实现数据绑定及表单标签”的完整攻略如下: 1. 数据绑定 SpringMVC通过数据绑定将请求参数映射到控制器方法的入参中。实现数据绑定需要在控制器方法入参前面添加@ModelAttribute注解,例如: @RequestMapping(value="/user") public String showUserI…

    Java 2023年6月15日
    00
  • SpringBoot底层注解超详细介绍

    下面就详细讲解一下 Spring Boot 底层注解的完整攻略。 什么是 Spring Boot? Spring Boot 是一种基于 Spring Framework 的快速应用程序开发框架,它可以方便地创建一个独立的、产品级别的 Spring 应用程序。Spring Boot 通过尽可能地自动配置 Spring 和第三方库的方式,简化了 Spring 应…

    Java 2023年5月15日
    00
  • JavaSpringBoot报错“HttpMediaTypeNotAcceptableException”的原因和处理方法

    原因 “HttpMediaTypeNotAcceptableException” 错误通常是以下原因引起的: 媒体类型不可接受:如果您的媒体类型不可接受,则可能会出现此错误。在这种情况下,您需要检查您的媒体类型并确保它们可接受。 媒体类型不正确:如果您的媒体类型不正确,则可能会出现此错误。在这种情况下,您需要检查您的媒体类型并确保它们正确。 解决办法 以下是…

    Java 2023年5月4日
    00
  • Java实现的mysql事务处理操作示例

    当我们想要在Java应用程序中使用MySQL数据库时,需要处理事务操作。这里,我将向您展示如何使用Java和JDBC来处理MySQL事务。下面是一个完整攻略: 1. 添加MySQL JDBC驱动 在使用MySQL数据库之前,我们需要在Java项目中添加相应的MySQL JDBC驱动。您可以从官方网站下载最新的JDBC驱动程序,也可以使用第三方依赖管理工具,如…

    Java 2023年5月19日
    00
  • Java异常处理中的try-with-resources语句的作用是什么?

    Java中的异常处理是一门非常重要的技术,可以使程序在面对问题时,不至于直接崩溃而不能继续执行。一种常见的Java异常处理语句就是try-catch语句,它能够捕获代码块中的异常并进行处理。在Java 7中,又引入了try-with-resources语句,它是一个功能强大、易于使用的语言结构,广泛用于异常处理中。 try-with-resources语句可…

    Java 2023年4月27日
    00
  • Java实现FTP批量大文件上传下载篇1

    Java实现FTP批量大文件上传下载篇1攻略 1. FTP简介 FTP (File Transfer Protocol)即文件传输协议,是一个用户间传输文件的标准协议,基于客户端-服务端模式运作,被广泛应用于文件共享、网站更新等领域。FTP协议默认的传输端口是21,支持主动模式和被动模式两种连接方式。 2. 使用Java实现FTP文件上传下载 Java提供了…

    Java 2023年5月19日
    00
  • Java的Struts框架中的主题模板和国际化设置

    Java的Struts框架中的主题模板和国际化设置提供了一套全局约束的方式来统一管理Web应用的界面样式和用户语言环境,本文将为您提供完整的攻略,包括如何设置和使用主题模板和国际化设置。 设置主题模板 在Struts框架中,使用主题模板可以方便地统一管理Web应用的界面样式,通过以下步骤可以设置主题模板: 1. 在struts.xml中进行配置 在strut…

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