SSM的项目实现freemarker :
pom.xml配置:
<!--自动生成代码 需要的jar-->
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.8</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
AutoGenerationJavaCode方法:
package com.crs811.core;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class AutoGenerationJavaCode {
private String url;
private String name;
private String passWord;
private String driver;
private String sql;
private String tableName;
private String templateDir;
// private String autoGeneratedFile;
private static String[][] fileNameArray = new String[6][3];
static {
fileNameArray[0][0] = "dmoTemplate.ftl";
fileNameArray[0][1] = ".java";
fileNameArray[0][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\pojo";
fileNameArray[1][0] = "serviceTemplate.ftl";
fileNameArray[1][1] = "Service.java";
fileNameArray[1][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\service";
fileNameArray[2][0] = "serviceImplTemplate.ftl";
fileNameArray[2][1] = "ServiceImpl.java";
fileNameArray[2][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\service\\impl";
fileNameArray[3][0] = "daoTemplate.ftl";
fileNameArray[3][1] = "Dao.java";
fileNameArray[3][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\dao";
fileNameArray[4][0] = "controllerTemplate.ftl";
fileNameArray[4][1] = "Controller.java";
fileNameArray[4][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\controller";
fileNameArray[5][0] = "dmoVoTemplate.ftl";
fileNameArray[5][1] = "Vo.java";
fileNameArray[5][2] = "C:\\java\\IDEA\\Xm_Dz\\SSMWeb02\\src\\main\\java\\com\\crs811\\pojo\\vo";
}
public AutoGenerationJavaCode(String url, String name, String passWord, String driver, String tableName,
String templateDir) {
this.url = url;
this.name = name;
this.passWord = passWord;
this.driver = driver;
this.sql = "select * from " + tableName;
this.tableName = tableName;
this.templateDir = templateDir;
// this.autoGeneratedFile = autoGeneratedFile;
}
public void autoGenerationJavaCode() throws IOException, TemplateException, ClassNotFoundException,
SQLException {
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("utf-8");
String className = dealTableName();
String fileName = dealClassName(className);
Map<String, Object> columnMap = getColumn();
//设置模板文件路径
cfg.setDirectoryForTemplateLoading(new File(templateDir));
Map<String, Object> rootMap = new HashMap<String, Object>();
rootMap.put("className", className);
rootMap.put("classNameLower", className.substring(0, 1).toLowerCase() + className.substring(1));
rootMap.put("columnMap", columnMap);
for (int i = 0; i < fileNameArray.length; i++) {
File dir = new File(fileNameArray[i][2] + "\\");
//检查目录是否存在,不存在则创建
if (!dir.exists()) {
dir.mkdir();
}
Template temp = cfg.getTemplate(fileNameArray[i][0]);
File docFile = new File(fileNameArray[i][2] + "\\" + fileName + fileNameArray[i][1]);
Writer docout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
//输出文件
temp.process(rootMap, docout);
}
System.out.println("==============文件生产成功===============");
}
//获取数据库表字段名放入map中
public Map<String, Object> getColumn() throws ClassNotFoundException, SQLException {
Connection conn;
PreparedStatement pStemt = null;
Class.forName(driver);
conn = DriverManager.getConnection(url, name, passWord);
pStemt = conn.prepareStatement(sql);
ResultSetMetaData rsmd = pStemt.getMetaData();
Map<String, Object> columnMap = new HashMap<String, Object>();
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
String columnName = dealColumnName(rsmd, i);
columnMap.put(columnName, columnName);
}
conn.close();
return columnMap;
}
//将表名转换为DMO的字段名,比如 operate_type 转换后为 operateType
private String dealColumnName(ResultSetMetaData rsmd, int i) throws SQLException {
String columnName = rsmd.getColumnName(i + 1).toLowerCase();
String charAfterLine = String.valueOf(columnName.charAt((columnName.indexOf("_") + 1)));
String convertedChar = charAfterLine.toUpperCase();
//columnName = columnName.replace("_" + charAfterLine, convertedChar);
// columnName = columnName.replace("" + charAfterLine, convertedChar);
return columnName;
}
//将表名转换为类型类名 比如 t_operate_log 转换后为 operateLog ,类名首字母应为大写,这里在freemarker的模板里直接转换
// private String dealTableName() {
// String className = tableName.toLowerCase().substring(tableName.indexOf("_") + 1);
// String charAfterLine = String.valueOf(className.charAt((className.indexOf("_") + 1)));
// String convertedChar = charAfterLine.toUpperCase();
// className = className.replace("_" + charAfterLine, convertedChar);
// return className;
// }
//首字母大写
private String dealTableName() {
String className = tableName.substring(0, 1).toUpperCase() + tableName.substring(1);
return className;
}
//将类名转换为文件名,java公共类名与其文件名应该相同,这里将首字母转换为大写 如operateLog 转换后为 OperateLog
private String dealClassName(String className) {
String first = className.substring(0, 1).toUpperCase();
String rest = className.substring(1, className.length());
String fileName = new StringBuffer(first).append(rest).toString();
return fileName;
}
}
AutoGenerationDemo调用方法:
package com.crs811.core;
import freemarker.template.TemplateException;
import java.io.IOException;
import java.sql.SQLException;
public class AutoGenerationDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException, TemplateException {
//数据库地址
String url = "jdbc:mysql://localhost:3306/panda?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
//用户名
String name = "root";
//密码
String passWord = "123456";
//驱动
String driver = "com.mysql.jdbc.Driver";
//表名
String tableName = "sys_product";
//模板路径
String templateDir = "C:\\java\\test";
//实例化
AutoGenerationJavaCode autoGenerationJavaCode = new AutoGenerationJavaCode(url, name, passWord, driver,
tableName,templateDir);
//调用生成java代码方法
autoGenerationJavaCode.autoGenerationJavaCode();
}
}
模版文件: