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();
}
}
}