码生成器=模板+数据+合成机制
FreeMarker是一款模板引擎:即是一种基本模板何数据,并用来生成输出文本(HTML网页,电子邮箱,配置文件,源代码等)的通用工具。
具体操作步骤:
下载freemarker jar包
作用:初始化环境配置
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
常用API:
初始化:
/**
* 完成环境初始化
*/
public void init(){
//Configuration的实例化
configuration=new Configuration(Configuration.getVersion());
//设置模板所在路径
String path=this.getClass().getClassLoader().getResource("").getPath();
try {
configuration.setDirectoryForTemplateLoading(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
**configuration.getTemplate(tempName);**模板的获取
template.process(Object data,Writer out)方法
参数data对数据的传递,out保存路径
1.输出基本类型数据或对象属性
数
据
或
者
{数据}或者
数据或者{数据.属性}
2.输出集合
<#list 名 as item>
</#list>
3.判断(item_has_next是否还有下一个元素)
<#if item_has_next>…
<#else>…
</#if>
/**
* 代码自动生成
* @param tempName 模板的名称
* @param savaPath 保存路径
*/
public void process(String tempName,String savaPath){
try {
//获取模板实例
Template template=configuration.getTemplate(tempName);
//组装数据
Map map=new HashMap();
map.put("name","fang");
//初始化保存路径
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(savaPath));
//传参,生成数据
template.process(map,outputStreamWriter);
} catch (Exception e) {
e.printStackTrace();
}
}
我创建的模板如下:
在E:\下创建成功!
获取数据库的所有表名
创建DatabaseMetaData对象:
DatabaseMetaData dbmd = conn.getMetaData();
getTables方法返回该数据库的所有表:
resultSet = dbmd.getTables(null, null, null, new String[]{“TABLE”});
获得结果集内该列下的表
String tableName=resultSet.getString(“TABLE_NAME”);
/**
* 获得该数据库表的信息
* @return
*/
public static List<Table> getTable() {
List<Table> list = new ArrayList<Table>();
try {
//3.获取所有表名的结果集
ResultSet rs = dbmd.getTables(null, null, null, new String[]{"TABLE"});
//4.遍历结果集
while (rs.next()) {
Table table = new Table();
String tableName = rs.getString("TABLE_NAME");
table.setClassName(PojoGeneratorUtil.toUpperCase(tableName));
table.setTableName(PojoGeneratorUtil.tableName(tableName));
table.setTable(tableName);
table.setList(getColumns(tableName));
list.add(table);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
方法getColumns获得表内信息
resultSet = dbmd.getColumns(null, “%”, tableName,"%");
//名称
String columnName=resultSet.getString(“COLUMN_NAME”);
//类型
String columnType=resultSet.getString(“TYPE_NAME”);
//备注
String remarks=resultSet.getString(“REMARKS”);
/**
* 获得该数据库表内的字段信息
* @return
*/
public static List<Column> getColumns(String tableName) {
List<Column> list = new ArrayList<Column>();
try {
ResultSet rs = dbmd.getColumns(null, "%", tableName, "%");
while (rs.next()) {
Column column = new Column();
String columnName = rs.getString("COLUMN_NAME");
String columnType = rs.getString("TYPE_NAME");
String remarks = rs.getString("REMARKS");
column.setColumnName(columnName);
column.setUpcolumnName(PojoGeneratorUtil.toUpperCase(columnName));
column.setJavaType(PojoGeneratorUtil.trJavaType(columnType));
column.setRemarks(remarks);
list.add(column);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
表名数据的封装:
字段数据封装:
获取模板,初始化环境,代码自动生成!
public class GeneratorUtil {
//Configuration的实例化
private static Configuration configuration=new Configuration(Configuration.getVersion());
private String path=this.getClass().getClassLoader().getResource("").getPath()+"\\template\\";
/**
* 完成环境初始化
*/
public void init(String path){
try {
configuration.setDirectoryForTemplateLoading(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 代码自动生成
* @param tempName 模板的名称
* @param savaPath 保存路径
*/
public static void process(String tempName,Map map,String savaPath){
try {
//获取模板实例
Template template=configuration.getTemplate(tempName);
//初始化保存路径
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(savaPath));
//传参,生成数据
template.process(map,outputStreamWriter);
} catch (Exception e) {
e.printStackTrace();
}
}
}
举例如下:(创建pojo)
模板:
1.pojoTemplate.ftl如下:
import java.io.Serializable;
import java.util.Date;
public class ${Table.className} implements Serializable {
<#list Table.list as list>
<#if list.remarks!=''>
//${list.remarks}
</#if>
private ${list.javaType} ${list.columnName};
</#list>
<#list Table.list as list>
public ${list.javaType} get${list.upcolumnName}() {
return ${list.columnName};
}
public void set${list.upcolumnName}(${list.javaType} ${list.columnName}) {
this.${list.columnName} = ${list.columnName};
}
</#list>
}
2.初始化,自动生成代码
3.获得数据带入模板生成代码
即成功!
附(代码)
链接: https://pan.baidu.com/s/15VAeiJ0lROsylcNPi-AtQA 提取码: avj1