如何让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日

相关文章

  • java安全编码指南之:Mutability可变性详解

    Java安全编码指南之:Mutability可变性详解 在Java编程中,可变性(Mutability)是一个非常重要的概念。可变性指的是对象在创建之后是否可被修改。如果一个对象是可变的,那么它的状态可以被修改,而不可变对象的状态则不能被修改。在Java编程中,一些安全漏洞与可变性有关,因此在编写Java代码时,我们需要特别注意可变性问题。 不可变对象的优点…

    Java 2023年5月20日
    00
  • 史上最全MyBatis面试题及答案

    史上最全MyBatis面试题及答案攻略 什么是MyBatis?它的作用是什么? MyBatis是一个持久层框架,用于简化Java应用程序中的数据库交互。它使用XML或注解来描述对象映射器,从而实现将Java对象映射为数据库表中的数据。MyBatis的主要作用是:简化数据库交互代码的编写,防止SQL注入攻击,提高代码的可维护性和可读性。 MyBatis中的Ma…

    Java 2023年5月20日
    00
  • Java Kryo,Protostuff,Hessian序列化方式对比

    下面是对比Java Kryo、Protostuff和Hessian序列化方式的详细攻略。 1. 背景介绍 在开发应用程序的过程中,序列化和反序列化是一个非常重要的步骤。序列化可以将一个对象转化为一个字节数组或者二进制流,从而可以进行网络传输或者存储到本地文件中。反序列化可以将字节数组或者二进制流转换为一个对象,从而可以进行数据的读取和解析。 在Java语言中…

    Java 2023年5月27日
    00
  • Nacos源码之注册中心的实现详解

    Nacos源码之注册中心的实现详解 Nacos 是一个开源的分布式系统服务发现、配置管理和服务管理平台,具有高度可扩展性和强一致性。 在 Nacos 中,注册中心是其核心组件之一,本文将详细讲解 Nacos 的注册中心实现原理及其源码解析。 注册中心的作用 在分布式系统中,服务提供者需要将自己的服务注册到注册中心,以便服务消费者可以通过注册中心获取服务提供者…

    Java 2023年6月15日
    00
  • Java日期时间使用方法汇总

    Java日期时间使用方法汇总 1. 日期时间的格式化 在Java中,可以使用SimpleDateFormat类来格式化日期时间。SimpleDateFormat的常见格式符如下: 符号 含义 yyyy 年份 MM 月份 dd 日期 HH 小时 mm 分钟 ss 秒 下面是一个示例代码: import java.text.SimpleDateFormat; i…

    Java 2023年5月20日
    00
  • Sprint Boot @ConditionalOnMissingBean使用方法详解

    @ConditionalOnMissingBean是Spring Boot中的一个注解,它用于根据Spring容器中是否缺少指定的Bean来决定是否启用或禁用某个组件。在使用Spring Boot开发应用程序时,@ConditionalOnMissingBean是非常有用的。本文将详细介绍@ConditionalOnMissingBean的作用和使用方法,并…

    Java 2023年5月5日
    00
  • Mybatis之类型处理器TypeHandler的作用与自定义方式

    下面是针对MyBatis中的类型处理器TypeHandler的作用与自定义方式的完整攻略。 什么是TypeHandler TypeHandler是Mybatis中一种类型转换器,用于将Java类中的数据类型转换为数据库中对应字段的类型或者将数据库查询结果的数据类型转换为Java对象中的数据类型。 例如,在将Java类中的Date类型转换成数据库中的Times…

    Java 2023年5月20日
    00
  • Java基本语法笔记(菜鸟必看篇)

    Java基本语法笔记(菜鸟必看篇) 数据类型 Java 中的基本数据类型包括整型、浮点型、布尔型、字符型和字符串型,它们分别为 int、float、double、boolean、char 和 String 类型。 整型 整型又分为四种类型:byte、short、int、long,不同的类型占用的内存大小不同,范围也不同。 byte:占1个字节,范围是 -12…

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