前言

不知道大家有没有这样的感觉,在平时开发中,经常有很多daoservice类中存着很多重复的代码,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文件

我们可以修改domainNamepackageName来修改我们的包名和类名,我们运行下看:

我们看到生成成功,我们打开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模板引擎生成模板代码相关推荐

  1. SpringCloud核心教程 | 第四篇:服务注册与发现 Consul篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...

  3. OpenCV学习系列教程第五篇:测试和提高代码的效率

    Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...

  4. MVC教程第五篇:MVC整合Ajax

    MVC教程第五篇:MVC整合Ajax     摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET M ...

  5. 五分钟学会用Simulink模型生成HDL代码

    五分钟学会用Simulink模型生成HDL代码 1 核心步骤 2 视频展示 3 生成HDL代码的注意事项 3.1 HDL支持的库和模块 3.2 设置simulink模型为可生成 hdl 的模式 3.3 ...

  6. DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录

    DL之RNN:基于TF利用RNN算法实现生成编程语言代码(C语言).训练&测试过程全记录 目录 输出结果 监控模型 训练&测试过程全记录 训练的数据集展示 输出结果 1.test01 ...

  7. SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  8. 机器视觉实用工具集NO.6——图像变换应用,利用apriltag二维码+透视变换实现水平面相机像素/世界坐标转换

    二维码扫码已经是人们日常生活的一部分,二维码识别已经是事实证明的成熟有效的技术.可以说,二维码是联系现实世界(物理空间)与虚拟世界(像素空间)的很好的媒介.在机器视觉定位桌面物体任务时,可以利用二维码 ...

  9. 【linux】Valgrind工具集详解(五):命令行详解

    一.使用方法 usage: valgrind [options] prog-and-args 使用方法:valgrind [参数选项] 程序和参数 二.选择工具 tool-selection opti ...

最新文章

  1. 20家股东联名施压,要求贝佐斯停止向警方出售面部识别软件
  2. Java移位运算之算术右移位
  3. Java DecimalFormat 用法 小数位的处理 公司内部处理小数位
  4. create_softLink.sh
  5. 最容易理解的计算机网络 基础知识概论(下)
  6. AtCoder AGC037D Sorting a Grid (二分图匹配)
  7. web.xml mysql_JSP登录验证脚本失败(mysql后端)web.xml servlet映射?
  8. set.seed(7)什么意思
  9. 电子统计台账:中文标记月度流水账格式数据的转换,以及过滤模板的普遍适配性
  10. mybatis源码编译教程
  11. 搜狐财报:铠甲不硬,需要新杀手锏
  12. 一个汉字到底是多少个字节
  13. 机器学习的transformer
  14. 在不损坏硬盘数据情况下,MBR格式转GPT格式,手动创建EFI和MSR分区,安装WIN10/WIN8.1...
  15. general error c101008a: Failed to save the updated manifest to the file .\D
  16. hevc编码merge 模式
  17. 转:亚熟男 我们该拿你怎么办?
  18. 常见的麦克风供电方式总结(驻极体电容器麦克风)
  19. 分布式查询工具-Apache Drill
  20. 网络:TCP的滑动窗口与流量控制和拥塞控制

热门文章

  1. 日本后端女开发吐槽:不要找中国程序员!
  2. 阿里云域名动态IP解析Shell小脚本
  3. c语言结构体员工信息,给定N个职员的信息,包括姓名、基本工资、浮动工资和支出。(c语言)...
  4. 苹果服务器暂停响应怎么打开,iPhone 应用卡死、无响应或无法退出怎么办?
  5. 360兼容模式页面错位_解决360双核浏览器兼容模式的页面显示问题
  6. 使用border属性绘制三角形、五角星、心形
  7. 勾股定理一日一证连载86
  8. Java集合List转树结构工具类
  9. MS-OFFICE2013之EXCEL神器-Power Map数据地图可视化范例
  10. 开学季平价好用电容笔有哪些?ipadpro触控笔推荐