工具集核心教程 | 第五篇: 利用Velocity模板引擎生成模板代码
前言
不知道大家有没有这样的感觉,在平时开发中,经常有很多dao
、service
类中存着很多重复的代码,Velocity
提供了模板生成工具,今天我教大家怎么和这些大量的重复代码说再见。
参考项目:https://github.com/bigbeef/cppba-codeTemplate 个人博客:http://www.zhangbox.cn
注意
大家可以写适合自己的模板,这里为了演示,就直接拿cppba-web
的模板来示范,至于velocity
的语法大家可以查看这篇文章: 工具集核心教程 | 第四篇: Velocity模板引擎入门到大神
maven配置
<!-- velocity -->
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version>
</dependency>
创建模板文件
首先看下目录结构:
这里演示我就只贴出ServiceImplTemplate.java
,需要其他模板代码可以到我github
里面下载
#set ($domain = $!domainName.substring(0,1).toLowerCase()+$!domainName.substring(1))
package $!{packageName}.service.impl;import $!{packageName}.core.bean.PageEntity;
import $!{packageName}.dao.$!{domainName}Dao;
import $!{packageName}.dto.$!{domainName}Dto;
import $!{packageName}.dto.BaseDto;
import $!{packageName}.entity.$!{domainName};
import $!{packageName}.service.$!{domainName}Service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;/*** 开发者* nickName:星缘* email:1342541819@qq.com* github:https://github.com/bigbeef* velocity模板生成 cppba-codeTemplate*/
@Service
@Transactional
public class $!{domainName}ServiceImpl implements $!{domainName}Service{@Resourceprivate $!{domainName}Dao $!{domain}Dao;@Overridepublic void save($!{domainName} $!{domain}) {$!{domain}Dao.save($!{domain});}@Overridepublic void delete($!{domainName} $!{domain}) {$!{domain}Dao.delete($!{domain});}@Overridepublic void update($!{domainName} $!{domain}) {$!{domain}Dao.update($!{domain});}@Overridepublic $!{domainName} findById(int id) {return ($!{domainName}) $!{domain}Dao.get($!{domainName}.class, id);}@Overridepublic PageEntity<$!{domainName}> query(BaseDto baseDto) {String hql = " select distinct $!{domain} from $!{domainName} $!{domain} where 1=1 ";Map params = new HashMap<String,Object>();$!{domainName}Dto $!{domain}Dto = ($!{domainName}Dto)baseDto;$!{domainName} $!{domain} = $!{domain}Dto.get$!{domainName}();int page = $!{domain}Dto.getPage();int pageSize = $!{domain}Dto.getPageSize();List list = $!{domain}Dao.query(hql,params,page,pageSize);long count = $!{domain}Dao.count(hql,params);PageEntity<$!{domainName}> pe = new PageEntity<$!{domainName}>();pe.setCount(count);pe.setList(list);return pe;}
}
模板生成
接下来是生成模板的主函数:
package com.cppba.core;import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;/*** 开发者* nickName:星缘* email:1342541819@qq.com* github:https://github.com/bigbeef*/public class Main {static String domainName = "Articles"; //类名static String packageName = "com.cppba";//类包static String templateDir = "\\src\\main\\webapp\\template\\";static String sourcePath = System.getProperty("user.dir")+templateDir;static String resultDir = "\\out";static String targetPath = System.getProperty("user.dir")+ resultDir + "\\"+ packageName.replace(".", "\\");public static void main(String []args) throws Exception{Map<String,Object> map = new HashMap();map.put("DaoTemplate.java","dao/" + domainName + "Dao.java");map.put("ServiceTemplate.java","service/" + domainName + "Service.java");map.put("ServiceImplTemplate.java","service/impl/" + domainName + "ServiceImpl.java");map.put("DtoTemplate.java","dto/" + domainName + "Dto.java");for(String templateFile:map.keySet()){String targetFile = (String) map.get(templateFile);Properties pro = new Properties();pro.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");pro.setProperty(Velocity.INPUT_ENCODING, "UTF-8");pro.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, sourcePath);VelocityEngine ve = new VelocityEngine(pro);VelocityContext context = new VelocityContext();context.put("domainName",domainName);context.put("packageName",packageName);Template t = ve.getTemplate(templateFile, "UTF-8");File file = new File(targetPath, targetFile);if (!file.getParentFile().exists())file.getParentFile().mkdirs();if (!file.exists())file.createNewFile();FileOutputStream outStream = new FileOutputStream(file);OutputStreamWriter writer = new OutputStreamWriter(outStream,"UTF-8");BufferedWriter sw = new BufferedWriter(writer);t.merge(context, sw);sw.flush();sw.close();outStream.close();System.out.println("成功生成Java文件:"+ (targetPath + targetFile).replaceAll("/", "\\\\"));}}
}
生成java文件
我们可以修改domainName
和packageName
来修改我们的包名和类名,我们运行下看:
我们看到生成成功,我们打开ArticlesServiceImpl.java
看下:
package com.cppba.service.impl;import com.cppba.core.bean.PageEntity;
import com.cppba.dao.ArticlesDao;
import com.cppba.dto.ArticlesDto;
import com.cppba.dto.BaseDto;
import com.cppba.entity.Articles;
import com.cppba.service.ArticlesService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;/*** 开发者* nickName:星缘* email:1342541819@qq.com* github:https://github.com/bigbeef* velocity模板生成 cppba-codeTemplate*/
@Service
@Transactional
public class ArticlesServiceImpl implements ArticlesService{@Resourceprivate ArticlesDao articlesDao;@Overridepublic void save(Articles articles) {articlesDao.save(articles);}@Overridepublic void delete(Articles articles) {articlesDao.delete(articles);}@Overridepublic void update(Articles articles) {articlesDao.update(articles);}@Overridepublic Articles findById(int id) {return (Articles) articlesDao.get(Articles.class, id);}@Overridepublic PageEntity<Articles> query(BaseDto baseDto) {String hql = " select distinct articles from Articles articles where 1=1 ";Map params = new HashMap<String,Object>();ArticlesDto articlesDto = (ArticlesDto)baseDto;Articles articles = articlesDto.getArticles();int page = articlesDto.getPage();int pageSize = articlesDto.getPageSize();List list = articlesDao.query(hql,params,page,pageSize);long count = articlesDao.count(hql,params);PageEntity<Articles> pe = new PageEntity<Articles>();pe.setCount(count);pe.setList(list);return pe;}
}
生成成功,我们拷贝到cppba-web
中可完美运行!
写在最后
欢迎关注、喜欢、和点赞后续将推出更多的工具集教程,敬请期待。 欢迎关注我的微信公众号获取更多更全的学习资源,视频资料,技术干货!
公众号回复“学习”,拉你进程序员技术讨论群,干货资源第一时间分享。
公众号回复“视频”,领取800GJava视频学习资源。
公众号回复“全栈”,领取1T前端,Java,产品经理,微信小程序,Python等资源合集大放送。
公众号回复“慕课”,领取1T慕课实战学习资源。
公众号回复“实战”,领取750G项目实战学习资源。
公众号回复“面试”,领取8G面试实战学习资源。
转载于:https://my.oschina.net/u/3529959/blog/3040198
工具集核心教程 | 第五篇: 利用Velocity模板引擎生成模板代码相关推荐
- SpringCloud核心教程 | 第四篇:服务注册与发现 Consul篇
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
- 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)
转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...
- OpenCV学习系列教程第五篇:测试和提高代码的效率
Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...
- MVC教程第五篇:MVC整合Ajax
MVC教程第五篇:MVC整合Ajax 摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET M ...
- 五分钟学会用Simulink模型生成HDL代码
五分钟学会用Simulink模型生成HDL代码 1 核心步骤 2 视频展示 3 生成HDL代码的注意事项 3.1 HDL支持的库和模块 3.2 设置simulink模型为可生成 hdl 的模式 3.3 ...
- DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录
DL之RNN:基于TF利用RNN算法实现生成编程语言代码(C语言).训练&测试过程全记录 目录 输出结果 监控模型 训练&测试过程全记录 训练的数据集展示 输出结果 1.test01 ...
- SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
- 机器视觉实用工具集NO.6——图像变换应用,利用apriltag二维码+透视变换实现水平面相机像素/世界坐标转换
二维码扫码已经是人们日常生活的一部分,二维码识别已经是事实证明的成熟有效的技术.可以说,二维码是联系现实世界(物理空间)与虚拟世界(像素空间)的很好的媒介.在机器视觉定位桌面物体任务时,可以利用二维码 ...
- 【linux】Valgrind工具集详解(五):命令行详解
一.使用方法 usage: valgrind [options] prog-and-args 使用方法:valgrind [参数选项] 程序和参数 二.选择工具 tool-selection opti ...
最新文章
- 20家股东联名施压,要求贝佐斯停止向警方出售面部识别软件
- Java移位运算之算术右移位
- Java DecimalFormat 用法 小数位的处理 公司内部处理小数位
- create_softLink.sh
- 最容易理解的计算机网络 基础知识概论(下)
- AtCoder AGC037D Sorting a Grid (二分图匹配)
- web.xml mysql_JSP登录验证脚本失败(mysql后端)web.xml servlet映射?
- set.seed(7)什么意思
- 电子统计台账:中文标记月度流水账格式数据的转换,以及过滤模板的普遍适配性
- mybatis源码编译教程
- 搜狐财报:铠甲不硬,需要新杀手锏
- 一个汉字到底是多少个字节
- 机器学习的transformer
- 在不损坏硬盘数据情况下,MBR格式转GPT格式,手动创建EFI和MSR分区,安装WIN10/WIN8.1...
- general error c101008a: Failed to save the updated manifest to the file .\D
- hevc编码merge 模式
- 转:亚熟男 我们该拿你怎么办?
- 常见的麦克风供电方式总结(驻极体电容器麦克风)
- 分布式查询工具-Apache Drill
- 网络:TCP的滑动窗口与流量控制和拥塞控制
热门文章
- 日本后端女开发吐槽:不要找中国程序员!
- 阿里云域名动态IP解析Shell小脚本
- c语言结构体员工信息,给定N个职员的信息,包括姓名、基本工资、浮动工资和支出。(c语言)...
- 苹果服务器暂停响应怎么打开,iPhone 应用卡死、无响应或无法退出怎么办?
- 360兼容模式页面错位_解决360双核浏览器兼容模式的页面显示问题
- 使用border属性绘制三角形、五角星、心形
- 勾股定理一日一证连载86
- Java集合List转树结构工具类
- MS-OFFICE2013之EXCEL神器-Power Map数据地图可视化范例
- 开学季平价好用电容笔有哪些?ipadpro触控笔推荐