欢迎访问宙启技术站
智能推送

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

发布时间:2023-05-14 13:46:53

在Java开发中,使用实体类映射数据库表格是很普遍的做法。但是如果一个项目有很多的数据表需要映射,这就需要手动编写大量的实体类代码,非常耗时。那么有没有什么方法可以自动根据数据库表名生成实体类呢?下面我将为大家介绍一种实现这一需求的方法。

一、使用反向工程工具

反向工程是一种常用的方法,它可以根据数据库表结构自动生成基于Hibernate的实体类,从而避免手动编写实体类代码的繁琐过程。在使用反向工程工具前,需要在pom.xml文件中加入如下依赖:

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>5.2.10.Final</version>
</dependency>

接着,在IntelliJ IDEA中,创建一个项目,并添加Hibernate的支持。在添加Hibernate支持时,勾选“Generate Entities from Tables”选项,如下图所示:

![image-20210627122407009](https://cdn.jsdelivr.net/gh/dragon-yuan/picgo/img/image-20210627122407009.png)

然后连接到数据库,选择需要生成实体类的数据库表,即可自动生成实体类。

这种方法虽然可以减少手写代码的工作量,但生成的实体类质量和灵活性较低,难以满足特殊需求。

二、使用模板引擎

另外一种方法是使用模板引擎,如Freemarker、Velocity等,通过模板文件定制实体类模板,根据数据库表名生成实体类。

具体实现步骤如下:

1. 在项目中添加模板引擎库,在pom.xml文件中添加如下依赖:

<dependency>
   <groupId>org.freemarker</groupId>
   <artifactId>freemarker</artifactId>
   <version>2.3.31</version>
</dependency>

2. 创建一个模板文件,模板文件中根据变量表名生成实体类代码。

例如,下面是一个用Freemarker模板引擎生成实体类的例子:

package com.xxxx.entity;

public class ${className} {

<#list properties as property>
    private ${property.type} ${property.name};
</#list>

<#list properties as property>
    public void set${property.name?cap_first}(${property.type} ${property.name}) {
        this.${property.name} = ${property.name};
    }

    public ${property.type} get${property.name?cap_first}() {
        return ${property.name};
    }

</#list>

}

在这个模板文件中,${className}是模板变量,这个变量会在生成实体类过程中被替换为数据库表名;properties是另一个变量,包含实体类的属性信息,包括属性类型和属性名。

3. 编写Java代码,连接数据库,获取数据库表名,使用模板引擎根据表名生成实体类。

下面给出Java代码:

public class EntityGenerator {

    private static Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);

    static {
        cfg.setClassForTemplateLoading(EntityGenerator.class, "/templates");
    }

    public static void generateEntity(String tableName) {
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("className", ParserUtils.normalize(tableName));
        dataMap.put("properties", TableParser.parseTableFields(tableName));
        try {
            Template template = cfg.getTemplate("entity.ftl");
            StringWriter stringWriter = new StringWriter();
            template.process(dataMap, stringWriter);
            System.out.println(stringWriter.toString());
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
    }

}

其中,ParserUtils.normalize()方法将表名转换为符合Java命名规范的类名,TableParser.parseTableFields()方法获取表的属性信息,并将这些信息封装成一个Map对象,与模板文件中的变量对应起来。

4. 测试

在测试类中,调用EntityGenerator.generateEntity()方法,即可根据给定的数据库表名生成实体类。

如下面的代码所示:

public class TestEntityGenerator {

    @Test
    public void testGenerateEntity() {
        EntityGenerator.generateEntity("t_user");
    }

}

在运行测试用例之后,就会在控制台上输出生成的实体类代码。

这种方式生成的实体类代码比较灵活,可以根据自己的需求在模板文件中进行定制,生成的实体类代码质量相对较高。

以上就是根据数据库表名自动生成实体类的方法,希望对大家有所帮助。