代码生成器完结篇,从此效率提升一千倍
总结:写好一个代码生成器,要花点心思的,我这里主要讲解一下原理,重复的工作 直接一套搞定,当然师傅领进门,路漫漫兮修远兮,吾将上下而求索。
上次讲到了获取数据库元数据,这次是手动带大家实现一套流程吧。制作模板——》类型转换——》渲染——》io 生成文件 。话不多说代码如下:
1.制作模板 ftl
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* ${comments}
*
* @author ${author}
* @email ${email}
* @date ${datetime}
*/
@Data
@TableName("${tableName}")
public class ${className}Entity implements Serializable {
private static final long serialVersionUID = 1L;
<#list columns as column>
/**
* ${column.columnComment}
*/
<#if column.columnKey=="PRI">
@TableId
</#if>
private ${map[column.dataType]} ${column.columnName};
</#list>
2.类型转换主要是数据库类型到 java 类型
// 数据库类型 -》java 类型 private static HashMap map = new HashMap(); static { map.put("varchar","String"); map.put("int","Integer"); }
3. 渲染,4 生成 io 全部搞定,
@Resource(name = "mySQLGeneratorDao") private GeneratorDao generatorDao; @Autowired Configuration configuration; // 数据库类型 -》java 类型 private static HashMap map = new HashMap(); static { map.put("varchar","String"); map.put("int","Integer"); } @Test public void contextLoads() throws IOException, TemplateException { Template template = configuration.getTemplate("Entity.java.ftl"); Model model = new BindingAwareConcurrentModel(); model.addAttribute("table","user"); model.addAttribute("comments","user"); model.addAttribute("author","lyc"); model.addAttribute("email","984006207@qq.com"); model.addAttribute("datetime","2019-06-22"); model.addAttribute("tableName","user"); model.addAttribute("className","User"); model.addAttribute("map",map); model.addAttribute("columns",generatorDao.queryColumns("user")); String result = FreeMarkerTemplateUtils.processTemplateIntoString(template,model); FileOutputStream outputStream = new FileOutputStream("./"+"UserEntity.java"); IOUtils.write(result,outputStream,"utf-8"); System.out.println("result{}"+result); }
5. 看效果
/** * user * * @author lyc * @email 984006207@qq.com * @date 2019-06-22 */ @Data @TableName("user") public class UserEntity implements Serializable { private static final long serialVersionUID = 1L; /** * */ @TableId private Integer id; /** * 名字 */ private String name; /** * 年龄 */ private Integer age; }
读者可以实现任意模板文件,然后快速生成,原理就这个东东,没什么鸡儿难度,祝大家生活愉快。
github 地址:https://github.com/lyc88/autocode/
elk