如何利用freemarker生成MVC层代码

by yangle

解决的问题:避免做大量重复的复制黏贴替换工作,更专注在业务代码实现和难度更大的技术问题上,提高工作效率

使用的技术:freemarker模板引擎动态参数替换

技术难点:各个模块的组合和变量的设定

实现思路:通过freemarker模板引擎变量的动态提供技术,我们可以将标准的MVC代码的文件提取出来,所有可变的部分全部提取出来,使用一个变量作为占位符,例如,每个类文件都包含包名,作者名,我们可以使用一个变量进行占位,在加载模板的时候将变量传入,就能还原所有的类了,等等,其他类似。

现在让我们开始auto coding吧

一、Freemarker介绍

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

二、利用freemarker生成代码时所使用的基础语法

    IF指令:

<#if condition>    ...<#elseif condition2>    ...<#elseif condition3>    ...<#else>    ...

list指令:循环结果集

假设 users包含['Joe', 'Kate', 'Fred'] 序列:

<#list users as user>${user}</#list>

三、加载模板生成指定类型的文件:

/* 创建一个合适的configuration */

Configuration cfg =new Configuration();

// 设置模板加载的方式

cfg.setDirectoryForTemplateLoading(new File(templatePath));

cfg.setObjectWrapper(new DefaultObjectWrapper());

Map root =new HashMap();

root.put("packageInfo", packageInfo);

Template temp = cfg.getTemplate(info +".ftl");

BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter(paths.get(i)));

temp.process(root, bufferedWriter);

bufferedWriter.flush();

四、实现步骤(这里不贴代码,介绍思路)

①首先需要准备一个map,map里面存放的是你需要传到模板引擎里面的参数变量,例如:

            controller,entity层都需要的包名,则可以传入将packageName放进去,其他需要传的也是这样操作,包名,表名(mapper里面需要),generate_path(代码生成路径,后期需要和不同层的路径进行拼接)

Map map=new HashMap<>();

map.put("package_name",package_name);

②接着我们需要得到数据库里对应表的所有字段,这里我使用了原生jdbc链接数据库的方式,执行如下sql,遍历结果集得到我们需要的所有字段,

public static StringgetSQL(String tableName) {

String sql ="select a.column_name 'name',a.data_type 'type'," +

"a.CHARACTER_MAXIMUM_LENGTH 'length',a.COLUMN_DEFAULT 'defaultValue', " +

"a.COLUMN_COMMENT 'description' from information_schema.columns a where table_name='" + tableName +"'";

    return sql;

}

②将所有需要用到的信息放入map后,我们需要得到模板的路径,在这里我们首先应该得到一个模板根路径,然后根据不同层(dao,entity,mapper,controller组成的集合遍历)去拼接根路径得到模板真实路径;

③得到模板路径后,我们就需要去得到各个模板生成文件之后存放的文件路径,

List paths =new ArrayList<>();

for (String info : infos) {

String path ="";

    if (info.equals("mapper")) {

path = generate_path + File.separator +"resources" + File.separator + info + File.separator + packageInfo.getUrlPre();

        paths.add(path + File.separator + packageInfo.getClassName() +"Mapper.xml");

在上述步骤完成后,我们就可以得到一个集合paths里面存放着(每个层次dao,controlelr,entity,mapper..)生成文件的路径,并且这个路径集合和(dao,entity,mapper,controller集合是一一对应的),也就是说我们可以找到对应的模板和对应生成的文件位置。

④接下来,我们得到infos(模板文件集合),paths(生成文件的集合),我们就可以遍历这个集合,听过infos里面的info找到对应的模板去生成paths里面对应的文件,

⑤这样就实现了自动生成代码的功能,是不是很简单呢?

附上paths和info对应的关系图解

图解infos与paths

注解:第一次写技术博客,语言组织的不好,希望大家提出宝贵的建议!后期会持续更新的,希望大家关注。

附上代码生成的工具类下载链接,使用时请大家根据自己的开发环境进行相应的调整,如果没有积分的可以留言,我会上传到百度云中,提供你们下载。

https://download.csdn.net/download/weixin_34311210/10369276

上一篇:SpringBoot之整合Spring Security,为自己的系统提供安全保障


下一篇:Docker安装与入门