mybatis有代码生成器,mybatis-generator,pom引用配置生成位置即可,这个不是重点,网上一搜一大堆,这里不表。为啥呢,不通用,好多公司有自己的编码规范,封装了一些基础组件,不得不按照公司的规范来,那么freemarker就有用武之地了,下面咱们来介绍一下哈。
freemarker需要引用pom依赖:
org.freemarker freemarker2.3.16
编写模板:
entity.flt
package ${packageName};
public class ${className} {
<#list attrs as attr>
#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>包围起来的部分不会被解析
辅助类:
package com.neo.newDemo.helper;
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.*;
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 typeNameMap = new HashMap(){{
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 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 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 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 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();
}
}
}



