使用freemarker模板引擎技术批量生成mysql数据库表的POJO实体类

本文介绍使用Freemarker模板引擎结合JDBC技术批量生成数据库表对应的POJO实体类的方法,涵盖从配置到生成文件的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近琢磨着写个程序自动完成数据库表对应的实体类的代码批量开发,所以想到了freemarker模板引擎技术,生成的实体类(包括表中字段的注释一并生成)开发过程具体步骤如下:

1.首先在项目中pom.xml文件引入freemarker和数据库jdbc依赖

<dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.16</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.22</version>
</dependency>

2.在项目的类路径resource目录下创建文件夹module,创建模板文件module.ftl。模板文件内容如下:

public class ${myClass.className} {
 
    <#list myClass.fieldList as field>
        //${field.fieldRemarks}
        private ${field.fieldType} ${field.fieldName};
    </#list>
 
    <#list myClass.fieldList as field>
        public ${field.fieldType} get${field.fieldNameUpperFirstLetter}() {
            return ${field.fieldName};
        }
 
        public void set${field.fieldNameUpperFirstLetter}(${field.fieldType} ${field.fieldName}) {
            this.${field.fieldName} = ${field.fieldName};
        }
    </#list>
}

3.创建自定义实体类Field模板文件,内容如下:

//自定义实体类模板
public class Field {
    //字段名
    private String fieldName;
    //字段类型
    private String fieldType;
    //字段注释
    private String fieldRemarks;
    //字段名首字母大写
    private String fieldNameUpperFirstLetter;
 
    public String getFieldName() {
        return fieldName;
    }
 
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
 
    public String getFieldType() {
        return fieldType;
    }
 
    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }
 
    public String getFieldRemarks() {
        return fieldRemarks;
    }
 
    public void setFieldRemarks(String fieldRemarks) {
        this.fieldRemarks = fieldRemarks;
    }
 
    public String getFieldNameUpperFirstLetter() {
        return fieldNameUpperFirstLetter;
    }
 
    public void setFieldNameUpperFirstLetter(String fieldNameUpperFirstLetter) {
        this.fieldNameUpperFirstLetter = fieldNameUpperFirstLetter;
    }
}

4.创建生成实体类Field的文件

import java.util.List;
 
public class MyClass {
    //实体类名
    private String className;
    //表字段的集合
    private List<Field> fieldList;
 
    public String getClassName() {
        return className;
    }
 
    public void setClassName(String className) {
        this.className = className;
    }
 
    public List<Field> getFieldList() {
        return fieldList;
    }
 
    public void setFieldList(List<Field> fieldList) {
        this.fieldList = fieldList;
    }
}

5.创建生成实体类的工具类,根据jdbc连接配置,进行数据库操作

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
 
public class ClassGenerator {
 
    public DatabaseMetaData init(){
        DatabaseMetaData databaseMetaData = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://192.168.126.133:3306/itrip";
            String user = "root";
            String password = "123456";
            Connection connection = DriverManager.getConnection(url, user, password);
            databaseMetaData = connection.getMetaData();
        }catch (Exception e){
            e.printStackTrace();
        }
        return databaseMetaData;
    }
 
    //根据表名生产出类
    public MyClass generateClass(String tableName){
        MyClass myClass = new MyClass();
        List<Field> fieldList = new ArrayList<Field>();
        DatabaseMetaData databaseMetaData = init();
        try{
            ResultSet rs = databaseMetaData.getColumns(null, "%", tableName, "%");
            while(rs.next()){
                //列名
                String columnName = rs.getString("COLUMN_NAME");
                //类型
                String typeName = rs.getString("TYPE_NAME");
                System.out.println("typeName:" + typeName);
                //注释
                String remarks = rs.getString("REMARKS");
 
                Field field = new Field();
                field.setFieldName(columnName);
                field.setFieldType(columnTypeToFieldType(typeName));
                field.setFieldRemarks(remarks);
                field.setFieldNameUpperFirstLetter(upperFirstLetter(columnName));
                fieldList.add(field);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
 
        myClass.setClassName(tableNameToClassName(tableName));
        myClass.setFieldList(fieldList);
 
        return myClass;
    }
 
    //字段类型转换成属性类型
    public String columnTypeToFieldType(String columnType){
        String fieldType = null;
        switch (columnType) {
            case "INT":
                fieldType = "Integer";
                break;
            case "VARCHAR":
                fieldType = "String";
                break;
            case "CHAR":
                fieldType = "String";
                break;
            case "DATE":
                fieldType = "Date";
                break;
            case "BIGINT":
                fieldType = "Long";
                break;
            default:
                fieldType = "String";
                break;
        }
        return fieldType;
    }
 
    //首字母大写
    public String upperFirstLetter(String src){
        String firstLetter = src.substring(0, 1).toUpperCase();
        String otherLetters = src.substring(1);
        return firstLetter + otherLetters;
    }
 
    //表名转类名
    public String tableNameToClassName(String tableName){
        StringBuilder className = new StringBuilder();
        //aa_bb_cc  AaBbCc
        String[] split = tableName.split("_");
        for (String item : split) {
            className.append(upperFirstLetter(item));
        }
        return className.toString();
    }
}

6.创建生成数据库表对应的POJO实体类文件,指定目录

import cn.code.User;
import freemarker.template.Configuration;
import freemarker.template.Template;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Generator {
 
    public static void main(String[] args) throws Exception{
        //创建Configuration对象
        Configuration configuration = new Configuration();
        //设置模板所在目录
        String path = Generator.class.getClassLoader().getResource("module").getPath();
        configuration.setDirectoryForTemplateLoading(new File(path));
        //获取模板
        Template template = configuration.getTemplate("class.ftl");
        //设置数据并执行
        Map map = new HashMap();
 
        ClassGenerator classGenerator = new ClassGenerator();
        MyClass myClass = classGenerator.generateClass("user");
 
        map.put("myClass", myClass);
 
        Writer writer = new OutputStreamWriter(new FileOutputStream("G:/"+myClass.getClassName()+".java"));
 
        template.process(map, writer);
    }
}

使用freemarker模板引擎技术编写POJO实体类等自定义的类,欢迎下方留言评论,转发+关注!!!

7.支持一下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

传道授业解惑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值