自己利用spring3、mybatis3进行开发时,前期花费了大量的时间去写对应的model、mapper、service文件,并想到用freemarker来动态生成对应的JAVA文件.
开发思路:
其实就是将数据库中的表取出来,表名作为类名,并把对应的列名取出来,作为字段名称,然后通过 freemarker定制的模版去生成相关的文件即可。
我这里只举例说明如何生成对应的model文件,其它的可以直接COPY改改就成,示例代码如下:
首先定义一个对象SqlColumnData包含两个属性columnName(列名称),columnType(列类型),具体定义如下 :
1 package org.study.job.domain;
2 /**
3 * SqlColumnData.java Create on 2012-6-15上午10:37:47
4 *
5 *
6 * Copyright (c) 2012 by MTA.
7 *
8 * @author lmeteor
9 * @Email [email protected]
10 * @description
11 * @version 1.0
12 */
13 public class SqlColumnData
14 {
15
16 private String columnName;
17
18 private String columnType;
19
20 public String getColumnName()
21 {
22 return columnName;
23 }
24
25 public void setColumnName(String columnName)
26 {
27 this.columnName = columnName;
28 }
29
30 public String getColumnType()
31 {
32 return columnType;
33 }
34
35 public void setColumnType(String columnType)
36 {
37 this.columnType = columnType;
38 }
39
40
41 }
下面三个方法作用如下:
/**
* 将表名转成class名称
*
* @param tableName
* @return
*/
public String getTableNameToClassName(String tableName)
{
String[] splits = tableName.toLowerCase().split("_");
if (splits.length > 0)
{
StringBuffer className = new StringBuffer();
for (String split : splits)
{
String tempTableName = split.substring(0, 1).toUpperCase()
+ split.substring(1);
className.append(tempTableName);
}
return className.toString();
}
else
{
String className = splits[0].substring(0, 1).toUpperCase()
+ splits[0].substring(1);
return className;
}
}
SQL方面就准备的差不多了,现在开始准备对应的模版文件,如下:
我这里使用的freemarker
1 package org.study.job.domain;
2
3 import java.io.Serializable;
4 /**
5 * ${className?default('')}.java Create on ${datetime?default('')}
6 *
7 *
8 * Copyright (c) 2012 by MTA.
9 *
10 * @author lmeteor
11 * @Email [email protected]
12 * @description
13 * @version 1.0
14 */
15 @SuppressWarnings("serial")
16 public class ${className?default('')} implements Serializable
17 {
18 ${feilds?default('')}
19 }
用freemarker通过模版创建文件:
1 /**
2 * 创建静态文件
3 *
4 * @param templateFileName
5 * 模板文件名,例如:/WEB-INF/view/temp.ftl
6 * @param propMap
7 * 用于处理模板的属性object映射
8 * @param htmlFilePath
9 * 要生成的静态文件的路径,例如:/WEB-INF/view/1/2012/5/5
10 * @param htmlFileName
11 * 要生成的文件名:例如:1.html
12 * @param templateFilePath
13 * 模版路径
14 */
15 @SuppressWarnings(
16 { "unchecked" })
17 public static void createHtmlFile(String templateFileName, Map propMap,
18 String htmlFilePath, String htmlFileName, String templateFilePath)
19 {
20 try
21 {
22 Template t = getFreemarkerCFG(templateFilePath).getTemplate(
23 templateFileName);
24 //createDirs(htmlFilePath);
25 File file = null;
26 if(StringTools.isEmpty(htmlFileName))file = new File(htmlFilePath);
27 else file = new File(htmlFilePath + "/" + htmlFileName);
28 if(!file.exists())file.createNewFile();
29 else file.delete();
30 Writer out = new BufferedWriter(new OutputStreamWriter(
31 new FileOutputStream(file),"UTF-8"));
32 t.process(propMap, out);
33 out.flush();
34 out.close();
35 logger.info("文件:"+htmlFilePath+"生成成功。");
36 }
37 catch ( IOException e )
38 {
39 e.printStackTrace();
40 }
41 catch ( TemplateException e )
42 {
43 e.printStackTrace();
44 }
45 }
现在该准备的都准备好了,准备开始实际调用如下
1 /**
2 * 生成JAVAMODULE文件
3 * @param tableName
4 */
5 public static void createJavaModuleFile(String tableName)
6 {
7 String className = sqlutil.getTableNameToClassName(tableName);
8 // 生成到指定的目录下
9 String modelPath = "domain\\" + className + ".java";
10 Map<String,Object> context = new HashMap<String,Object>();
11 context.put("className", className); //
12 context.put("tableName", tableName);
13 context.put("datetime", DateTools.getDateTools().format(new Date()));
14 /****************************** 生成bean字段 *********************************/
15 try
16 {
17 context.put("feilds", sqlutil.getBeanField(tableName)); // 生成bean
18 logger.info("请稍侯,正在生成Bean属性及GET、SET方法");
19 }
20 catch ( Exception e )
21 {
22 e.printStackTrace();
23 }
24 // -------------------生成文件代码---------------------/
25 CreateHtml.createHtmlFile("TempBean.ftl", context, PCKPATH+modelPath, null, TEMPLATE_FILEPATH);
26 }
大致代码就是这么多,我在自己的项目中将这个功能界面化了,