怎么让java只根据数据库表名自动生成实体类
在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”选项,如下图所示:

然后连接到数据库,选择需要生成实体类的数据库表,即可自动生成实体类。
这种方法虽然可以减少手写代码的工作量,但生成的实体类质量和灵活性较低,难以满足特殊需求。
二、使用模板引擎
另外一种方法是使用模板引擎,如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");
}
}
在运行测试用例之后,就会在控制台上输出生成的实体类代码。
这种方式生成的实体类代码比较灵活,可以根据自己的需求在模板文件中进行定制,生成的实体类代码质量相对较高。
以上就是根据数据库表名自动生成实体类的方法,希望对大家有所帮助。
