freemarker生成代码

mybatis有代码生成器,mybatis-generator,pom引用配置生成位置即可,这个不是重点,网上一搜一大堆,这里不表。为啥呢,不通用,好多公司有自己的编码规范,封装了一些基础组件,不得不按照公司的规范来,那么freemarker就有用武之地了,下面咱们来介绍一下哈。

freemarker需要引用pom依赖:

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

编写模板:

entity.flt

package ${packageName};

/**
 * @author ${author}
 */

public class ${className} {
    <#list attrs as attr>
    /**
     * ${attr.columnComment}
     */
    </#list>
    private ${attr.columnType} ${attr.columnName};
    <#list attrs as attr>
    public ${attr.columnType} get${attr.columnName?cap_first}(){
        return ${attr.columnName};
    }
    public void set${attr.columnName?cap_first}(${attr}.columnType) ${attr.columnName}{
        this.${attr.columnName} = ${attr.columnName};
    }
    </#list>
}

模板tips:

<#noparse></#noparse>包围起来的部分不会被解析 

<#assign x=0/> 声明变量

<#assign x=x+1> 操作变量

<#if x==1> 判断变量

辅助类: 

package com.neo.newDemo.helper;

/**
 * @author: neo
 * @Description:
 * @Date: 11:23 上午 2021/12/28
 */
public class ColumnInfo {
    /**
     * 数据库字段名称
     */
    private String dbColumnName;
    /**
     * 实体属性名称
     */
    private String columnName;
    /**
     * 实体字段类型
     */
    private String columnType;
    /**
     * 数据库字段类型
     */
    private String dbColumnType;
    /**
     * 字段注释
     */
    private String columnComment;

    public String getDbColumnName() {
        return dbColumnName;
    }

    public void setDbColumnName(String dbColumnName) {
        this.dbColumnName = dbColumnName;
    }

    public String getColumnName() {
        return columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    public String getColumnType() {
        return columnType;
    }

    public void setColumnType(String columnType) {
        this.columnType = columnType;
    }

    public String getDbColumnType() {
        return dbColumnType;
    }

    public void setDbColumnType(String dbColumnType) {
        this.dbColumnType = dbColumnType;
    }

    public String getColumnComment() {
        return columnComment;
    }

    public void setColumnComment(String columnComment) {
        this.columnComment = columnComment;
    }

    public ColumnInfo(String dbColumnName, String columnName, String columnType, String dbColumnType, String columnComment) {
        this.dbColumnName = dbColumnName;
        this.columnName = columnName;
        this.columnType = columnType;
        this.dbColumnType = dbColumnType;
        this.columnComment = columnComment;
    }
}

主类:

package com.neo.newDemo.helper;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.util.StringUtils;

import java.io.*;
import java.sql.*;
import java.util.*;

/**
 * @author: dongzhihai
 * @Description:
 * @Date: 11:30 上午 2021/12/28
 */
public class AmazingClass {
    /**
     * 类名,多个以逗号分割
     */
    private static final String CLASS_NAME = "Amazing";
    /**
     * 数据库表名
     */
    private static final String TABLE_NAME = "amazing_info";
    /**
     * 模板位置
     */
    private static final String LOCAL_TEMPLATE_PATH = "/Users/neo/Document/new_demo/src/main/resources/templates";
    /**
     * 模板名称
     */
    private static final String TEMPLATE_NAME = "entity.flt";
    /**
     * 包名
     */
    private static final String PACKAGE_NAME = "com/neo/newDemo";
    /**
     * 作者
     */
    private static final String AUTHOR = "neo";
    /**
     * 文件生成路径
     */
    private static final String FILE_TO_PATH = "/Users/neo/Document/new_demo/src/main/java/com/neo/newDemo/entity";

    private static Map<String, String> typeNameMap = new HashMap<String, String>(){{
       put("VARCHAR2","String");
       put("DATE","Date");
       put("NUMBER","Integer");
    }};

    public static void main(String[] args) {
        generate();
    }
    private static void generate(){
        if(!StringUtils.hasLength(CLASS_NAME) ||
                !StringUtils.hasLength(TABLE_NAME)){
            return;
        }
        if(CLASS_NAME.indexOf(",")>0){
            String[] classNameArr = CLASS_NAME.split(",");
            String[] tableNameArr = TABLE_NAME.split(",");
            for(int i = 0;i<classNameArr.length;i++){
                gen(tableNameArr[i],classNameArr[i]);
            }
            return;
        }
        gen(TABLE_NAME, CLASS_NAME);
    }
    private static void gen(String tableName, String className){
        gen(getColumnList(tableName), className);
    }
    private static List<ColumnInfo> getColumnList(String tableName){
        Properties info = new Properties();
        info.put("user","username");
        info.put("password","123456");
        info.put("remarksReporting","true");
        String oracleUrl = "jdbc:oracle:thin:@ip:port:dbName";
        String mysql = "jdbc:mysql://ip:port/dbName";
        try {
            Connection connection = DriverManager.getConnection(mysql, info);
            DatabaseMetaData metaData = connection.getMetaData();
            ResultSet columns = metaData.getColumns(null, null, tableName, null);
            List<ColumnInfo> columnInfoList = new ArrayList<>();
            while(columns.next()){
                String columnName = columns.getString("COLUMN_NAME").toLowerCase();
                String typeName = columns.getString("TYPE_NAME").toLowerCase();
                String remarks = columns.getString("REMARKS")==null?"":columns.getString("TYPE_NAME").toLowerCase();
                ColumnInfo columnInfo = new ColumnInfo(columnName, replaceUpderlineToUpper(columnName,"_",""),
                        typeNameMap.get(typeName), typeName, remarks);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String replaceUpderlineToUpper(String columnName, String regex, String replacement) {
        if(!StringUtils.hasLength(columnName)){
            return columnName;
        }
        String newString = "";
        int first;
        while(columnName.indexOf(regex)!=-1){
            first = columnName.indexOf(regex);
            if(first != columnName.length()){
                newString = newString + columnName.substring(0, first) + replacement;
                columnName = columnName.substring(first + regex.length());
                columnName = firstCharacterToUpper(columnName);
            }
        }
        newString = newString + columnName;
        return newString;
    }

    private static String firstCharacterToUpper(String str){return str.substring(0,1).toUpperCase() + str.substring(1);}

    private static void gen(List<ColumnInfo> list, String className){
        Configuration cfg = new Configuration();
        try {
            cfg.setDirectoryForTemplateLoading (new File(LOCAL_TEMPLATE_PATH));
            cfg.setDefaultEncoding("UTF-8");
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            Template template = cfg.getTemplate(TEMPLATE_NAME);
            Map<String, Object> root = new HashMap<>();
            root.put ("packageName", PACKAGE_NAME);
                    root.put ("className",
                            className);
            root.put ("author", AUTHOR);
            root.put ("attrs" ,list);
            File dir = new File (FILE_TO_PATH);
            if (dir.exists()){
                dir.mkdirs();
            }
            OutputStream fos
                    = new FileOutputStream(new File(dir, className+". java")) ;
            Writer out = new OutputStreamWriter(fos);
            template.process (root, out);
            fos.flush();
            fos.close();
            System.out.println("success");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值