如何运用freemarker模板技术自动生成数据库中的存在的表格对应的domain!

 freemarker模板技术的基本使用步骤:   

    freemarker:是比较流行的一个模板技术【ftl】
      1.导包(freemarker是一个小框架)
      2.创建一个配置对象Configuration(加个版本)
      3.设置加载路径
      4.设置字符集(默认)
      5.创建模板(准备一个ftl模板)
      6.准备数据(Map,对象)
      7.数据+模板=输出文件(Writer)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面是用freemarker模板技术生成数据库存在表的domain的基础案例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CreateDomainTest {

@Autowired
private DataSource dataSource;

String tabalName="t_address";//这里是举例生成数据库存在的表t_address。如果

需要生成其它表,改表名就可以。
String className="Address";//这里是生成的domain类名。生成其它表的时候就可以,改成表名对应的类名。

@Test
public void testCreate() throws Exception {
//拿到数据库的链接对象
Connection connection = dataSource.getConnection();
//准备需要执行行sql语句
String sql="select * from "+tabalName;
//执行准备好的sql语句
PreparedStatement ps = connection.prepareStatement(sql);
//拿到结果集
ResultSet rs = ps.executeQuery();
//拿到参数的原数据
ResultSetMetaData metaData = rs.getMetaData();
//拿到当前表有多少个字段
int count = metaData.getColumnCount();
//在遍历集合相应的字段,并却准备一个list装我们拿到的字段
List<Map> list = new ArrayList<>();
for (int i = 1; i <= count; i++) {
//getColumnClassName拿到我们表中的字段类型,replaceFirst并把类型的前缀去掉
String type = metaData.getColumnClassName(i).replaceFirst("java.lang.", "");
//拿到表中的字段名称 java.lang.字段类型
String name = metaData.getColumnName(i);
//把name的第一个首字母变成大写的字母 Name
//substring这个方法是截取字段,从那个下标开始到那个下标结束,toUpperCase把首字母变大写
String upperName = name.substring(0, 1).toUpperCase()+name.substring(1);
HashMap<String,Object> map = new HashMap<>();
map.put("type", type);
map.put("name", name);
map.put("upperName", upperName);
list.add(map);
}

//准备好一个配置对象
Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
//在设置模板的加载path,
// Directory:目录 Template:模板 Loading:加载
String path = "F:/Navicat Premium 11.1/software/eclipse/eclipse-workspace-Spring/cms/src/main/webapp/template";//这地址是放domain.java的模板文件路径
cfg.setDirectoryForTemplateLoading(new File(path));
//设置模板字符集
cfg.setDefaultEncoding("UTF-8");
//获取一个模板对象
Template template = cfg.getTemplate("domain.java");
//准备相应的数据(Map,对象)
Map dataMap = new HashMap<>();
dataMap.put("className", className);
dataMap.put("filedList", list);

//生成文件
//数据(dataMap)+模板(template) = 输出文件(out)
File newFile = new File(path,className+".java");
FileWriter out = new FileWriter(newFile);
template.process(dataMap, out);
out.flush();
}
}

 

---------------------------------------------------------------------------------------------------------------------------------------

domain.java  模板内容:

public class ${className} {

<#list filedList as filed>
private ${filed.type} ${filed.name} ;
</#list>


<#list filedList as filed>
public ${filed.type} get${filed.upperName}() {
return ${filed.name};
}
public void set${filed.upperName}(${filed.type} ${filed.name}) {
this.${filed.name} = ${filed.name};
}
</#list>

}

上一篇:[备忘]js表单序列化代码


下一篇:java原生xml类的两个属性具有相同名称解決方法