代码生成器
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
官方中文参考地址
代码生成器
代码生成器:可以生成代码的程序。
代码生成器 = 模版 + 数据 + 合成机制
代码生成器的好处:
1.节省人力成本
2.易于代码规范控制
下面是使用freemark根据数据库表名生成实体类
//所需依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.16</version>
</dependency>
模板文件
package com.cp;
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>
}
属性类
package com.cp;
//属性名
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;
}
}
实体类
package com.cp;
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;
}
}
数据处理类
package com.cp;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class ClassGenerater {
public DatabaseMetaData init(String database){
DatabaseMetaData databaseMetaData = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/"+database;
Connection connection = DriverManager.getConnection(url,"root","123");
databaseMetaData = connection.getMetaData();
}catch (Exception e){
e.printStackTrace();
}
return databaseMetaData;
}
//根据表名生成类
public MyClass generateClass(String database,String tableName) throws SQLException {
MyClass myClass = new MyClass();
List<Field> fieldList = new ArrayList<>();
DatabaseMetaData databaseMetaData = init(database);
ResultSet resultSet = databaseMetaData.getColumns(null, "%", tableName, "%");
while(resultSet.next()){
String columnName = resultSet.getString("COLUMN_NAME");
String columnType = resultSet.getString("TYPE_NAME");
String columnRemarks = resultSet.getString("REMARKS");
Field field = new Field();
field.setFieldName(columnName);
field.setFieldType(dbTypeToJavaType(columnType));
field.setFieldRemarks(columnRemarks);
field.setFieldNameUpperFirstLetter(firstLetterToUpperCase(columnName));
fieldList.add(field);
}
myClass.setClassName(tableNameToClassName(tableName));
myClass.setFieldList(fieldList);
return myClass;
}
//数据库类型转java类型
private String dbTypeToJavaType(String dbType){
String javaType = null;
switch (dbType){
case "VARCHAR":
javaType = "String";
break;
case "INT":
javaType = "Integer";
break;
case "CHAR":
javaType = "String";
break;
case "DATE":
javaType = "Date";
break;
case "TIMESTAMP":
javaType = "Date";
break;
case "BIGINT":
javaType = "Long";
break;
case "TEXT":
javaType = "String";
break;
case "DATETIME":
javaType = "Date";
break;
case "DECIMAL":
javaType = "Date";
break;
}
return javaType;
}
//首字母变大写
private String firstLetterToUpperCase(String src){
return src.substring(0,1).toUpperCase()+src.substring(1);
}
//表名转类名 db_student_hello
private String tableNameToClassName(String tableName){
StringBuilder sb = new StringBuilder();
String[] items = tableName.split("_");
for (String item : items){
sb.append(firstLetterToUpperCase(item));
}
return sb.toString();
}
}
测试类
package com.cp;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.*;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) throws IOException, SQLException, TemplateException {
Configuration configuration = new Configuration();
String path = Test.class.getClassLoader().getResource("").getPath();
configuration.setDirectoryForTemplateLoading(new File(path));
Template template = configuration.getTemplate("bean.ftl");
//数据
Map<String,Object> data = new HashMap<>();
ClassGenerater classGenerater = new ClassGenerater();
MyClass myClass = classGenerater.generateClass("库名","表名");
data.put("myClass",myClass);
Writer writer = new OutputStreamWriter(new FileOutputStream("输出的路径"+myClass.getClassName()+".java"));
template.process(data,writer);
System.out.println("finish");
}
}
运行测试类,便会输出在指定的目录根据数据库字段名输出.java文件