返回顶部
首页 > 资讯 > 后端开发 > Python >Java 如何使用Velocity引擎生成代码
  • 424
分享到

Java 如何使用Velocity引擎生成代码

2024-04-02 19:04:59 424人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录原理实战原理 其原理如图: 1.配置数据源信息(包括表名) 2.读取数据表字段信息:列名、类型、字段注释、表注释 3.编写代码模板,并将该模板加载到内存 4.根据模板所需,组装

原理

其原理如图:

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;


@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;


@Service
public class ${moduleClass}Service {

    @Autowired
    private ${moduleClass}Dao ${moduleVar}Dao;

    
    public ${moduleClass}Entity getById(Long id){
        return  ${moduleVar}Dao.selectById(id);
    }

    
    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);
    }

    
    public ResponseDTO<String> add(${moduleClass}AddDTO addDTO) {
        ${moduleClass}Entity entity = SmartBeanUtil.copy(addDTO, ${moduleClass}Entity.class);
        ${moduleVar}Dao.insert(entity);
        return ResponseDTO.succ();
    }

    
    @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();
    }

    
    @Transactional(rollbackFor = Exception.class)
    public ResponseDTO<String> deleteByIds(List<Long> idList) {
        ${moduleVar}Dao.deleteByIdList(idList);
        return ResponseDTO.succ();
    }

    
    public List<${moduleClass}ExcelVO> queryAllExportData(${moduleClass}QueryDTO queryDTO) {
        return ${moduleVar}Dao.queryAllExportData( queryDTO);
    }

    
    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引擎生成代码的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java 如何使用Velocity引擎生成代码

本文链接: https://lsjlt.com/news/128717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 如何使用Velocity引擎生成代码
    目录原理实战原理 其原理如图: 1.配置数据源信息(包括表名) 2.读取数据表字段信息:列名、类型、字段注释、表注释 3.编写代码模板,并将该模板加载到内存 4.根据模板所需,组装...
    99+
    2024-04-02
  • 如何使用IDEA代码生成器
    本篇内容主要讲解“如何使用IDEA代码生成器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用IDEA代码生成器”吧!基本使用IDEA 自带很多常用的动态模...
    99+
    2024-04-02
  • 如何使用Java生成二维码
    如何使用Java生成二维码?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理...
    99+
    2023-06-14
  • V8引擎如何执行JavaScript代码
    V8引擎如何执行JavaScript代码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。题目中说到的V8引擎,大家自然会联想到Node.js。我们先看一下官方对Node.js的定...
    99+
    2023-06-16
  • 如何使用Python代码自动生成文献的IEEE引用格式
    小编给大家分享一下如何使用Python代码自动生成文献的IEEE引用格式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用Python写了一个小程序用于根据BibT...
    99+
    2023-06-14
  • Java使用强大的Elastisearch搜索引擎实例代码
    Elastisearch是一个很强大,易用的搜索引擎在系统上运行Elastisearch只需以下几步下载Elastisearch复制代码 代码如下:...
    99+
    2023-05-31
    java elastisearch ava
  • navicat如何用代码生成表
    通过 navicat 代码生成表:1. 连接数据库;2. 创建表脚本;3. 指定设置(选择表、输出语言、选项);4. 生成脚本;5. 查看并执行代码。 Navicat 用代码生成表 如...
    99+
    2024-04-23
    navicat
  • 如何使用Java实现语音引擎
    这篇文章主要为大家展示了“如何使用Java实现语音引擎”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Java实现语音引擎”这篇文章吧。一、试用语音引擎 要使用这个语音引擎,你必须在CLA...
    99+
    2023-06-03
  • 如何使用代码生成器自定义Entity
    今天小编给大家分享一下如何使用代码生成器自定义Entity的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。代码生成器自定义En...
    99+
    2023-06-30
  • 如何使用WCF生成代理
    这篇文章主要为大家展示了“如何使用WCF生成代理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用WCF生成代理”这篇文章吧。利用WSE(Web Service Enhancements)可...
    99+
    2023-06-17
  • 如何使用PHP生成分布式二维码索引?
    在现代社会,二维码已经成为了非常普遍的一种扫描方式,人们可以通过扫描二维码来获取各种信息。而在某些场合下,我们需要对二维码进行管理和索引。那么,如何使用PHP生成分布式二维码索引呢?本文将为大家详细介绍。 一、什么是分布式二维码索引? 分...
    99+
    2023-06-27
    二维码 索引 分布式
  • 如何使用Java开发二维码生成器?
    Java是一种非常流行的编程语言,广泛应用于各种应用程序的开发。其中,二维码生成器是Java应用程序中非常常用的一种工具,可以帮助开发人员快速生成二维码图片,以便用于各种用途。本文将介绍如何使用Java开发二维码生成器。 一、二维码生成器的...
    99+
    2023-09-18
    二维码 开发技术 对象
  • 如何在Linux上使用Java生成二维码?
    二维码是一种方便快捷的信息传递工具,近年来被广泛应用于各个领域。在Linux系统上,我们可以使用Java语言来生成二维码,下面将介绍如何使用Java生成二维码的方法。 安装Java环境 首先,我们需要在Linux系统上安装Java环境...
    99+
    2023-07-29
    linux 二维码 自然语言处理
  • 如何使用Java生成和解析二维码?
    二维码是一种能够编码大量信息的矩阵条形码,它可以被扫描并解析成文本、URL、联系方式等信息。Java作为一门广泛应用于软件开发的编程语言,也提供了生成和解析二维码的功能。本篇文章将介绍如何使用Java生成和解析二维码。 生成二维码 1. 添...
    99+
    2023-08-15
    文件 数据类型 二维码
  • 如何进行C++代码的代码生成?
    如何进行C++代码的代码生成代码生成是软件开发中的一个重要环节,可以提高开发效率和代码质量。而对于C++开发来说,代码生成更是具有重要意义。本文将介绍如何进行C++代码的代码生成,帮助开发者提高开发效率和代码质量。使用模板库使用模板库是进行...
    99+
    2023-11-02
    - C++代码生成 - 代码自动生成 - C++编程工具
  • VB.NET如何动态生成代码
    这篇文章主要为大家展示了“VB.NET如何动态生成代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何动态生成代码”这篇文章吧。首先是当程序员需要动态建立一个控件并将代码附着于控件...
    99+
    2023-06-17
  • 如何使用Java在路径上生成二维码?
    二维码作为一种快速传递信息的方式,越来越受到人们的青睐。Java作为一种广泛应用的编程语言,也提供了多种生成二维码的方法。本文将介绍如何使用Java在路径上生成二维码。 1.准备工作 在使用Java生成二维码之前,我们需要先下载相应的ja...
    99+
    2023-08-29
    二维码 对象 path
  • Java中如何使用Spring框架生成二维码?
    随着二维码的普及,越来越多的应用需要生成二维码来提供给用户扫描。在Java中,使用Spring框架可以非常方便地生成二维码。本文将介绍如何使用Spring框架生成二维码的方法。 一、使用ZXing库生成二维码 ZXing是一个开源的条码和...
    99+
    2023-08-22
    二维码 spring laravel
  • 使用java如何生成一个验证码图片
    本文章向大家介绍使用java如何生成一个验证码图片的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程...
    99+
    2023-06-06
  • 如何把JS代码生成字节码
    本篇内容介绍了“如何把JS代码生成字节码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现原理nodejs...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作