<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
其原理如圖:
1.設定資料來源資訊(包括表名)
2.讀取資料表欄位資訊:列名、型別、欄位註釋、表註釋
3.編寫程式碼模板,並將該模板載入到記憶體
4.根據模板所需,組裝Velocity引擎渲染所需欄位Map
5.建立Velocity上下文,將程式碼模板和替換欄位傳入
6.velocity上下文建立引擎,執行merge合併替換並將最終程式碼寫入檔案
1.通過maven構建專案,引入依賴:
<dependency> <artifactId>velocity</artifactId> <groupId>org.apache.velocity</groupId> <exclusions> <exclusion> <artifactId>commons-collections</artifactId> <groupId>commons-collections</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> </dependency>
2.在resources/templates/codegenerator目錄下面編寫程式碼模板:
VO:
package ${basePackage}.module.${modulePackage}.domain.vo; import lombok.Data; #foreach ($dtoImport in $dtoImports) $dtoImport #end import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; /** * [ ${tableDesc} ] * * @author ${author} * @version 1.0 * @company ${company} * @copyright (c) ${company}Inc. All rights reserved. * @date ${date} * @since JDK1.8 */ @Data public class ${moduleClass}VO { #foreach ($column in $columnList) #if($column.fieldType == 'Date') @ApiModelProperty("${column.columnDesc}") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private $column.fieldType $column.fieldName; #else @ApiModelProperty("${column.columnDesc}") private $column.fieldType $column.fieldName; #end #end }
SERVICE:
package ${basePackage}.module.${modulePackage}.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import ${basePackage}.common.domain.PageResultDTO; import ${basePackage}.common.domain.ResponseDTO; import ${basePackage}.module.${modulePackage}.dao.${moduleClass}Dao; import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}AddDTO; import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}UpdateDTO; import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}QueryDTO; import ${basePackage}.module.${modulePackage}.domain.entity.${moduleClass}Entity; import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}VO; import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}ExcelVO; import ${basePackage}.util.SmartPageUtil; import ${basePackage}.util.SmartBeanUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * [ ${tableDesc} ] * * @author ${author} * @version 1.0 * @company ${company} * @copyright (c) ${company}Inc. All rights reserved. * @date ${date} * @since JDK1.8 */ @Service public class ${moduleClass}Service { @Autowired private ${moduleClass}Dao ${moduleVar}Dao; /** * 根據id查詢 */ public ${moduleClass}Entity getById(Long id){ return ${moduleVar}Dao.selectById(id); } /** * 分頁查詢 * @author ${author} * @date ${date} */ public ResponseDTO<PageResultDTO<${moduleClass}VO>> queryByPage(${moduleClass}QueryDTO queryDTO) { Page page = SmartPageUtil.convert2QueryPage(queryDTO); IPage<${moduleClass}VO> voList = ${moduleVar}Dao.queryByPage(page, queryDTO); PageResultDTO<${moduleClass}VO> pageResultDTO = SmartPageUtil.convert2PageResult(voList); return ResponseDTO.succData(pageResultDTO); } /** * 新增 * @author ${author} * @date ${date} */ public ResponseDTO<String> add(${moduleClass}AddDTO addDTO) { ${moduleClass}Entity entity = SmartBeanUtil.copy(addDTO, ${moduleClass}Entity.class); ${moduleVar}Dao.insert(entity); return ResponseDTO.succ(); } /** * 編輯 * @author ${author} * @date ${date} */ @Transactional(rollbackFor = Exception.class) public ResponseDTO<String> update(${moduleClass}UpdateDTO updateDTO) { ${moduleClass}Entity entity = SmartBeanUtil.copy(updateDTO, ${moduleClass}Entity.class); ${moduleVar}Dao.updateById(entity); return ResponseDTO.succ(); } /** * 刪除 * @author ${author} * @date ${date} */ @Transactional(rollbackFor = Exception.class) public ResponseDTO<String> deleteByIds(List<Long> idList) { ${moduleVar}Dao.deleteByIdList(idList); return ResponseDTO.succ(); } /** * 查詢全部匯出物件 * @author ${author} * @date ${date} */ public List<${moduleClass}ExcelVO> queryAllExportData(${moduleClass}QueryDTO queryDTO) { return ${moduleVar}Dao.queryAllExportData( queryDTO); } /** * 批次查詢匯出物件 * @author ${author} * @date ${date} */ public List<${moduleClass}ExcelVO> queryBatchExportData(List<Long> idList) { return ${moduleVar}Dao.queryBatchExportData(idList); } }
Mapper:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="${basePackage}.module.${modulePackage}.dao.${moduleClass}Dao"> <resultMap id="${moduleClass}VO" type="${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}VO"></resultMap> <resultMap id="${moduleClass}ExcelVO" type="${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}ExcelVO"></resultMap> <select id="queryByPage" resultMap="${moduleClass}VO"> select #foreach($column in $columnList) #if($velocityCount != $columnList.size()) $column.columnName, #else $column.columnName #end #end from ${tableName} <where> #foreach($queryField in $queryFieldList) #if ($queryField.sqlOperate == 'like') <if test="queryDTO.${queryField.fieldName} != null and queryDTO.${queryField.fieldName} != ''"> AND INSTR($queryField.columnName,#{queryDTO.$queryField.fieldName}) </if> #end #if ($queryField.sqlOperate == 'equals') #if ($queryField.fieldType == 'String') <if test="queryDTO.${queryField.fieldName} != null and queryDTO.${queryField.fieldName} != ''"> AND $queryField.columnName = #{queryDTO.$queryField.fieldName} </if> #else <if test="queryDTO.${queryField.fieldName} != null"> AND $queryField.columnName = #{queryDTO.$queryField.fieldName} </if> #end #end #if ($queryField.sqlOperate == 'in') <if test="queryDTO.${queryField.fieldName}List !=null and queryDTO.${queryField.fieldName}List.size() > 0"> and $queryField.columnName in <foreach collection="queryDTO.${queryField.fieldName}List" open="(" index="index" separator="," close=")" item="item"> #{item} </foreach> </if> #end #end <if test="queryDTO.createTimeBegin != null "> AND create_time >= #{queryDTO.createTimeBegin} </if> <if test="queryDTO.createTimeEnd != null "> AND create_time <= #{queryDTO.createTimeEnd} </if> <if test="queryDTO.updateTimeBegin != null "> AND update_time >= #{queryDTO.updateTimeBegin} </if> <if test="queryDTO.updateTimeEnd != null "> AND update_time <= #{queryDTO.updateTimeEnd} </if> </where> </select> <select id="queryAllExportData" resultMap="${moduleClass}ExcelVO"> select #foreach($column in $columnList) #if($velocityCount != $columnList.size()) $column.columnName, #else $column.columnName #end #end from ${tableName} <where> #foreach($queryField in $queryFieldList) #if ($queryField.sqlOperate == 'like') <if test="queryDTO.${queryField.fieldName} != null and queryDTO.${queryField.fieldName} != ''"> AND INSTR($queryField.columnName,#{queryDTO.$queryField.fieldName}) </if> #end #if ($queryField.sqlOperate == 'equals') #if ($queryField.fieldType == 'String') <if test="queryDTO.${queryField.fieldName} != null and queryDTO.${queryField.fieldName} != ''"> AND $queryField.columnName = #{queryDTO.$queryField.fieldName} </if> #else <if test="queryDTO.${queryField.fieldName} != null"> AND $queryField.columnName = #{queryDTO.$queryField.fieldName} </if> #end #end #if ($queryField.sqlOperate == 'in') <if test="queryDTO.${queryField.fieldName}List !=null and queryDTO.${queryField.fieldName}List.size() > 0"> and $queryField.columnName in <foreach collection="queryDTO.${queryField.fieldName}List" open="(" index="index" separator="," close=")" item="item"> #{item} </foreach> </if> #end #end <if test="queryDTO.createTimeBegin != null "> AND create_time >= #{queryDTO.createTimeBegin} </if> <if test="queryDTO.createTimeEnd != null "> AND create_time <= #{queryDTO.createTimeEnd} </if> <if test="queryDTO.updateTimeBegin != null "> AND update_time >= #{queryDTO.updateTimeBegin} </if> <if test="queryDTO.updateTimeEnd != null "> AND update_time <= #{queryDTO.updateTimeEnd} </if> </where> </select> <select id="queryBatchExportData" resultMap="${moduleClass}ExcelVO"> select #foreach($column in $columnList) #if($velocityCount != $columnList.size()) $column.columnName, #else $column.columnName #end #end from ${tableName} where id in <foreach collection="idList" open="(" close=")" separator="," item="item"> #{item} </foreach> </select> <delete id="deleteById"> delete from ${tableName} where id = #{id} </delete> <delete id="deleteByIdList"> delete from ${tableName} where id in <foreach collection="idList" open="(" close=")" separator="," item="item"> #{item} </foreach> </delete> </mapper>
3.查詢表資訊:
<select id="selectTableDesc" resultType="String"> select table_comment from information_schema.tables where table_schema = (select database()) and table_name = #{tableName} </select> <select id="selectTableColumn" resultMap="ColumnDTO"> select column_name as columnName, data_type as columnType, column_comment as columnDesc from information_schema.columns where table_schema = (select database()) AND table_name = #{tableName} order by ordinal_position </select>
4.載入模板、組裝資料
public Map<String, String> codeTemplates(String moduleClass, String basePackage, String modulePackage) { String basePath = basePackage.replaceAll("\.", File.separator ); String modulePath = modulePackage.replaceAll("\.", File.separator ); String javaPackagePath = "java" + File.separator + basePath + File.separator + modulePath + File.separator; String xmlPackagePath = "mapper" + File.separator + modulePath + File.separator; String frontPackagePath = "web" + File.separator; Map<String, String> templateMap = new HashMap<>(); //後端 templateMap.put("templates/codegenerator/java/Controller.java.vm", javaPackagePath + "controller" + File.separator + moduleClass + "Controller.java" ); templateMap.put("templates/codegenerator/java/Dao.java.vm", javaPackagePath + "dao" + File.separator + moduleClass + "Dao.java" ); templateMap.put("templates/codegenerator/java/Dao.xml.vm", xmlPackagePath + moduleClass + "Mapper.xml" ); templateMap.put("templates/codegenerator/java/AddDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "AddDTO.java" ); templateMap.put("templates/codegenerator/java/UpdateDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "UpdateDTO.java" ); templateMap.put("templates/codegenerator/java/Entity.java.vm", javaPackagePath + "domain" + File.separator + "entity" + File.separator + moduleClass + "Entity.java" ); templateMap.put("templates/codegenerator/java/VO.java.vm", javaPackagePath + "domain" + File.separator + "vo" + File.separator + moduleClass + "VO.java" ); templateMap.put("templates/codegenerator/java/ExcelVO.java.vm", javaPackagePath + "domain" + File.separator + "vo" + File.separator + moduleClass + "ExcelVO.java" ); templateMap.put("templates/codegenerator/java/QueryDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "QueryDTO.java" ); templateMap.put("templates/codegenerator/java/Service.java.vm", javaPackagePath + "service" + File.separator + moduleClass + "Service.java" ); //前端 String webPackageName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, moduleClass).replaceAll("_", "-" ); templateMap.put("templates/codegenerator/web/Api.js.vm", frontPackagePath + "api" + File.separator + webPackageName + ".js" ); templateMap.put("templates/codegenerator/web/Router.js.vm", frontPackagePath + "router" + File.separator + webPackageName + ".js" ); templateMap.put("templates/codegenerator/web/List.vue.vm", frontPackagePath + webPackageName + File.separator + webPackageName + "-list.vue" ); templateMap.put("templates/codegenerator/web/ListForm.vue.vm", frontPackagePath + webPackageName + File.separator + "components" + File.separator + webPackageName + "-list-form.vue" ); return templateMap; }
Properties p = new Properties(); p.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); p.put("directive.foreach.counter.name", "velocityCount"); p.put("directive.foreach.counter.initial.value", "1"); Velocity.init(p); Map<String, Object> map = new HashMap<>(); map.put("company", codeGenerator.getCompany()); map.put("tableName", codeGenerator.getTableName()); map.put("basePackage", basePackage); map.put("modulePackage", modulePackage); map.put("moduleClass", moduleClass); map.put("tableDesc", tableDesc); map.put("author", author); map.put("date", date); map.put("moduleVar", moduleVar); map.put("columnList", columnList); map.put("queryFieldList", queryFieldList); map.put("queryImports", queryImports); map.put("dtoImports", dtoImports); map.put("entityImports", entityImports); map.put("webModuleName", CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, moduleClass).replaceAll("_", "-")); map.put("upperCamel", CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, moduleClass)); //前端的變數 map.put("ViewUIMessage", "$Message"); map.put("VueRefs", "$refs");
5.建立Velocity上下文,生成程式碼
VelocityContext context = new VelocityContext(map); private void codeGenerator(VelocityContext context, Map<String, String> codeTemplates) throws Exception { String projectPath = getOutputDir(); Velocity.setProperty("input.encoding", "UTF-8"); Velocity.setProperty("output.encoding", "UTF-8"); for (Entry<String, String> entry : codeTemplates.entrySet()) { String template = entry.getKey(); String filePath = projectPath + entry.getValue(); String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1); String fileDir = filePath.replace(fileName, ""); File directory = new File(fileDir); if (!directory.exists()) { directory.mkdirs(); } FileWriter writer; try { writer = new FileWriter(filePath); Template tpl = Velocity.getTemplate(template, "UTF-8"); tpl.merge(context, writer); writer.flush(); writer.close(); } catch (Exception e) { log.error("", e); } } }
以上就是如何使用Velocity引擎生成程式碼的詳細內容,更多關於使用Velocity引擎生成程式碼的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45