Velocity及基于Velocity的代码生成器

Velocity基于模板的代码/配置自动生成实例 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Velocity是什么?二、Velocity使用例子1.加入maven依赖2.编写模板文件3.编写测试程序3.生成的测试结果3.其它语法说明总结 前言 当前JAVA主流的技术还是使用MVC三层模型来进行开发,特别是基于SpringBoot来开发一些微服务,各个微服务代码结构基本相同,很多代码也能基本雷同。所以,为减少编码的工作量,代码生成工具应运而生。比如原生的Mybatis-plus, 其它的代码生成工具比如有,懒猴子 阅读详情

Velocity

简介:

Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法。页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把精力放在代码开发上。


Demo:

//        创建模板上下文对象
        VelocityContext context=new VelocityContext();
//        根据模板路径获得一个模板
//        默认路径是当前项目根目录
        Template template=Velocity.getTemplate("hello.vm","utf-8");
//        给上下文添加数据,
        context.put("name", "渣渣辉");
//        获取输出流
        StringWriter writer = new StringWriter();
//        将输出流和模板上下文合并
        template.merge(context, writer);
//        输出
        System.out.println(writer);

语法:

注释:

##单行注释

#*

​ 多行注释

*#

声明变量:

##声明变量
#set($username="账号")
#set($age=18)
#set($sex=true)


##输出变量
${username}
${age}
${sex}

空值处理:

如果一个变量 x x x 有 值 的 时 候 , 就 会 取 出 这 个 值 , 如 果 没 有 值 , 他 会 将 {xxx}有值的时候,就会取出这个值,如果没有值,他会将 xxx有值的时候,就会取出这个值,如果没有值,他会将{xxx}当做文本来处理,直接输出。

解决:加上!

例:$!{name}

调用方法:

		//传入一个时间对象
        context.put("date", new Date());
		//传入一个时间格式化对象
        context.put("simpleDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

velocity:

##调用刚刚传入的时间对象
$!{date}
## 调用方法
$!{simpleDate.format($date)}

输出结果:
在这里插入图片描述

获取对象的属性:

//        传入一个Employee对象
        Employee e=new Employee("用户名","密码","邮箱","头像",22,new Department(11L,"部门名称"));
        context.put("employee", e);

velocity:

##获取对象属性
$!{employee.username}
$!{employee.password}
$!{employee.email}
$!{employee.headImage}
$!{employee.department}

输出结果:

在这里插入图片描述

遍历:

数组
//        传入一个字符串数组
        String[] strs={"张三","刘六","赵五","麻子","王二","李四"};
        context.put("strs", strs);

velocity:

##遍历数组
#foreach($str in $strs)
    我是:$!{str}
#end

输出结果:

在这里插入图片描述

List:
//        传入一个List
        List<String> citys = new ArrayList<>();
        citys.add("北京");
        citys.add("上海");
        citys.add("广州");
        citys.add("深圳");
        context.put("citys", citys);

velocity:

##遍历集合
#foreach($city in $citys)
    $!{city}
#end

结果:

在这里插入图片描述

Set:
//        传入一个Map
        Map<String, String> map = new HashMap<String, String>();
        map.put("姓名", "张三丰");
        map.put("性别", "男");
        map.put("年龄", "108");
        map.put("门派", "武当");
        context.put("map", map);

velocity:

##遍历Map
#foreach($key in $map.keySet())
    $!{key}:$!{map.get($key)}
#end

结果:

在这里插入图片描述

条件分支:

##条件分支
#set($age=40)
#if($age<18)
    你还是未成年
    #elseif($age<30)
    青年
    #elseif($age<50)
    中年
    #else
    老年
#end

EasyCode:

简介:

EasyCode是IDEA的一个插件,它是完全基于Java代码开发出来的插件,基于IDEA工具中的另一个插件(Database)开发出来的插件,也就是说Database插件中支持的那些数据库产品,EasyCode都支持也就是说你必须先配置了Database插件中的DataSource之后才能使用EasyCode插件。EasyCode是基于Apache的Velocity模板语法来制作模板,用来生成代码文件(HTML、JS、CSS、Java、XML)。

设置EasyCode:

使用EasyCode之前需要配置Idea-DataSource的database;

点开EasyCode的设置,TypeMapper,修改对应的数据映射规则。左边是数据库的数据类型,右边是映射到Java的类型。

在这里插入图片描述

添加模板分组

在这里插入图片描述

基于EasyCode实现代码生成器。

  • Spring
  • SpringMVC
  • SpringDataJpa
  • JSP
  • EasyUI

EasyCode API介绍:

 属性
    $author 设置中的作者 java.lang.String
    $encode 设置的编码 java.lang.String
    $modulePath 选中的module路径 java.lang.String
    $projectPath 项目绝对路径 java.lang.String
对象
$tableInfo 表对象
    obj 表原始对象 com.intellij.database.model.DasTable
    name 表名(转换后的首字母大写)java.lang.String
    comment 表注释 java.lang.String
    fullColumn 所有列 java.util.List<ColumnInfo>
    pkColumn 主键列 java.util.List<ColumnInfo>
    otherColumn 其他列 java.util.List<ColumnInfo>,除主键以外的列
    savePackageName 保存的包名 java.lang.String
    savePath 保存路径 java.lang.String
    saveModelName 保存的model名称 java.lang.String
columnInfo 列对象
    obj 列原始对象 com.intellij.database.model.DasColumn
    name 列名(首字母小写) java.lang.String
    comment 列注释 java.lang.String
    type 列类型(类型全名) java.lang.String
    shortType 列类型(短类型) java.lang.String
    custom 是否附加列 java.lang.Boolean
    ext 附加字段(Map类型) java.lang.Map<java.lang.String, java.lang.Object>
$tableInfoList java.util.List<TableInfo>所有选中的表
$importList 所有需要导入的包集合 java.util.Set<java.lang.String>

回调
&callback        setFileName(String) 设置文件储存名字
    setSavePath(String) 设置文件储存路径,默认使用选中路径

工具
$tool
    firstUpperCase(String name) 首字母大写方法
    firstLowerCase(String name) 首字母小写方法
    getClsNameByFullName(String fullName) 通过包全名获取类名
    getJavaName(String name) 将下划线分割字符串转驼峰命名(属性名)
    getClassName(String name) 将下划线分割字符串转驼峰命名(类名)
    append(Object... objs) 多个数据进行拼接
    newHashSet(Object... objs) 创建一个HashSet对象
    newArrayList(Object... objs) 创建一个ArrayList对象
    newLinkedHashMap() 创建一个LinkedHashMap()对象
    newHashMap() 创建一个HashMap()对象
    getField(Object obj, String fieldName) 获取对象的属性值,可以访问任意修饰符修饰的属性.配合debug方法使用.
    call(Object... objs) 空白执行方法,用于调用某些方法时消除返回值
    debug(Object obj) 调式方法,用于查询对象结构.可查看对象所有属性与public方法
    serial() 随机获取序列化的UID
    service(String serviceName, Object... param)远程服务调用
$time
    currTime(String format) 获取当前时间,指定时间格式(默认:yyyy-MM-dd HH:mm:ss)

01-domain:

##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/top/young/domain", ".java")

##使用宏定义设置包后缀
#setPackageSuffix("domain")

##使用全局变量实现默认包导入
$!autoImport
import javax.persistence.*;

##使用宏定义实现类注释信息
#tableComment("domain实体类")
@Entity
public class $!{tableInfo.name} extends BaseDomain {
    
#foreach($column in $tableInfo.otherColumn)
    #if(${column.comment})//${column.comment}#end

    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法
    #getSetMethod($column)
#end

}

02-Query

##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/top/young/query", "Query.java")

##使用宏定义设置包后缀
#setPackageSuffix("query")

##使用全局变量实现默认包导入
$!autoImport
import com.github.wenhao.jpa.Specifications;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import top.young.domain.$!{tableInfo.name};
##使用宏定义实现类注释信息
#tableComment("$!{tableInfo.name}表的Query类}")

public class $!{tableInfo.name}Query extends BaseQuery<$!{tableInfo.name}> {
    private String name;
    @Override
    public Specification<$!{tableInfo.name}> getSpecification() {
        return Specifications.<$!{tableInfo.name}>and()
                .like(StringUtils.isNoneBlank(this.name),"name", "%" + this.name + "%")
                .build();
    }

    @Override
    public Sort getSort() {
        return this.getDefaultSort();
    }

    @Override
    public Pageable getPageable() {
        return new PageRequest(this.getJpaPageNumber(), this.getPageSize(), this.getSort());
    }
    
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

03-repository

##定义初始变量
#set($className = $tool.append("I",$tableInfo.name, "Repository"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/repository"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{className}  extends IBaseRepository<$!{tableInfo.name},Long>{

}

04-service:

##定义初始变量
#set($className = $tool.append("I",$tableInfo.name, "Service"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表service层
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{className}   extends IBaseService<$!{tableInfo.name}> {

}

05-serviceImpl

##定义初始变量
#set($className = $tool.append($tableInfo.name, "ServiceImpl"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service/impl"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;


import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import $!{tableInfo.savePackageName}.repository.I$!{tableInfo.name}Repository;
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表,service实现类
 *
 * @author $!author
 * @since $!time.currTime()
 */
 @Service
 @Transactional(readOnly = true)
public class $!{className} extends BaseServiceImpl<$!{tableInfo.name}> implements I$!{tableInfo.name}Service  {
    @Autowired
    private I$!{tableInfo.name}Repository  $tool.firstLowerCase($tableInfo.name)Repository;
}

06-controller

##定义初始变量
#set($className = $tool.append($tableInfo.name, "Controller"))
#set($small=$tool.firstLowerCase($tableInfo.name))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/controller"))



#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import top.young.domain.$!{tableInfo.name};
import top.young.query.$!{tableInfo.name}Query;
import top.young.service.I$!{tableInfo.name}Service;
import top.young.utils.PageInfo;
import top.young.utils.Result;


/**
 * $!{tableInfo.comment}($!{tableInfo.name})表,controller类。
 *
 * @author $!author
 * @since $!time.currTime()
 */

@Controller
@RequestMapping("/$!{small}")
public class $!{tableInfo.name}Controller {
    @Autowired
    private I$!{tableInfo.name}Service service;

    /**
     * 跳转到主页
     * @return
     */
    @RequestMapping("/index")
    public String index(){
        return "$!{small}/$!{small}";
    }

    /**
     * 获得分页列表
     * @param query
     * @return
     */
    @RequestMapping("/getPage")
    @ResponseBody
    public PageInfo getPage($!{tableInfo.name}Query query){
        return service.FindByPage(query);
    }


    /**
     * 批量删除
     * @param ids
     * @return
     */
    @RequestMapping("/delete")
    @ResponseBody
    public Result delete$!{tableInfo.name}(String ids){
        Result result = new Result(200, "删除成功");
        try {
            service.delete(ids);
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("删除失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 查询单个
     * @param id
     * @return
     */
    @RequestMapping("/find")
    @ResponseBody
    public $!{tableInfo.name} FindOne(Long id){
        return service.findOne(id);
    }

    /**
     * 新增
     * @param $!{small}
     * @return
     */
    @RequestMapping("/add")
    @ResponseBody
    public Result add$!{tableInfo.name}($!{tableInfo.name} $!{small}){
        Result result = new Result(200, "新增成功");
        try {
            service.save($!{small});
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("新增失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 更新
     * @param $!{small}
     * @return
     */
    @RequestMapping("/update")
    @ResponseBody
    public Result Update$!{tableInfo.name}(@ModelAttribute("update") $!{tableInfo.name} $!{small}){
        Result result = new Result(200, "修改成功");
        try {
            service.update($!{small});
        }catch (Exception e){
            result.setStatusCode(500);
            e.printStackTrace();
            result.setMsg("修改失败,错误代码:"+e.getMessage());
        }
        return result;
    }

    /**
     * 高级查询
     * @param query
     * @return
     */
    @RequestMapping("/search")
    @ResponseBody
    public PageInfo<$!{tableInfo.name}> doSearch($!{tableInfo.name}Query query){
        return service.FindByPage(query);
    }

    /**
     * 更新前的查询
     * @param action
     * @param id
     * @return
     */
    /*@ModelAttribute("update")
    public $!{tableInfo.name} beforeUpdate(String action,Long id){
        $!{tableInfo.name} $!{small}=null;
        if("update".equals(action)&&id!=null){
            $!{small} = service.findOne(id);
            $!{small}.setDepartment(null);
        }
        return employee;
    }*/
}

07-JS

##定义初始变量
#set($className = $tool.append($tableInfo.name, "ServiceImpl"))
##文件名
$!callback.setFileName($tool.append($className, ".java"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/top/young/service/impl"))
#set($small=$tool.firstLowerCase($tableInfo.name))
#set($big=$tableInfo.name)

$(function () {

    $(".easyui-linkbutton[data-method]").on("click", function () {
        var method = $(this).data("method");
        operation[method]();
    })

    $("#diaTool>#save").on("click");
});

var operation = {
    add: function () {
        $("#ff").form("clear");
        $("#dialog").dialog("center").dialog("setTitle", "保存").dialog("open");
        var d = $("#department").combobox("getData");
        $("#department").combobox("select", d[0].id);
    },
    edit: function () {
        $("#ff").form("clear");
        var edit = $("#tool #edit");
        if (edit.hasClass("l-btn-disabled")) {
            return false;
        }
        var checked = $("#grid").datagrid("getChecked");
        $.getJSON('/$!{small}/find', {id: checked[0].id}, function (data) {
            $("#ff").form("reset").form("load", data);
            if (data.department) {
                $("#department").combobox("setValue", data.department.id);
            }

        });

        $("#dialog").dialog("center").dialog("setTitle", "保存").dialog("open");
    },
    remove: function () {
        var remove = $("#tool #remove");
        if (remove.hasClass("l-btn-disabled")) {
            return false;
        }
        $.messager.confirm('确认删除?', '你确定要删除吗?', function (r) {
            if (r) {
                var checked = $("#grid").datagrid("getChecked");
                var ids = new Array();
                $.each(checked, function (i, o) {
                    ids.push(o.id);
                });
                $.post('/$!{small}/delete', {ids: ids.toString()}, function (result) {
                    if (result.statusCode == 200) {
                        //刷新表单
                        $("#grid").datagrid("reload");
                        // datagrid.datagrid("reload");
                        $("#tool>#remove").linkbutton({disabled: true});
                        $("#tool>#edit").linkbutton({disabled: true});

                    } else {
                        $.messager.alert('删除失败' + result.statusCode, result.msg);
                    }
                });
            }
        });

    },
    search: function () {
        var para = $("#searchFrom").serializeObject();
        console.log(para)
        $("#grid").datagrid("load", para);
    },
    close:function () {
        $('#dialog').dialog('close');
    },
    save: function () {
        var para = $("#ff").serializeObject();
        console.log(para)
        var url = "/$!{small}/add";
        if (para.id) {
            url = "/$!{small}/update";
            para.action = 'update';
        }
        console.log(url);
        $.post(url, para, function (result) {
            if (result.statusCode == 200) {
                //刷新表单
                $("#grid").datagrid("reload");
                $("#dialog").dialog("close");
            } else {
                $.messager.alert('操作失败' + result.statusCode, result.msg);
            }
        });
    },

}

function formatterDept(r, v, i) {
    return r ? r.name : "";
}

function formatterSex(r, v, i) {
    return r ? "男" : "女";
}

function checkMethod(index, row) {
    var checked = $("#grid").datagrid("getChecked");
    if (checked.length >= 1) {
        $("#tool #remove").linkbutton({disabled: false});
    } else {
        $("#tool #remove").linkbutton({disabled: true});
    }
    if (checked.length == 1) {
        $("#tool #edit").linkbutton({disabled: false});
    } else {
        $("#tool #edit").linkbutton({disabled: true});
    }
}



08-JSP

##定义初始变量
#set($small=$tool.firstLowerCase($tableInfo.name))
#set($className = $tool.append($tableInfo.name))
##文件名
$!callback.setFileName($tool.append($small, ".jsp"))
##设置保存路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/",$small))
#set($big=$tableInfo.name)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$!{big}</title>
    <%@include file="../common.jsp" %>

    <script src="/static/JS/$!{small}/$!{small}.js"></script>
</head>
<body>


<table id="grid" class="easyui-datagrid" data-options="
    url:'/$!{small}/getPage',
    fitColumns:true,
    striped:true,
    pagination:true,
    toolbar:'#tool',
    onCheck:checkMethod,
	onUncheck:checkMethod,
	onCheckAll:checkMethod,
	onUncheckAll:checkMethod,
    fit:true
">
    <thead>
    <tr>
        <th style="width: 5%" data-options="field:'$!{tableInfo.pkColumn}',checkbox:true">编号</th>
#foreach($column in $tableInfo.otherColumn)
      <th style="width: 20%" data-options="field:'$!{column.name}'">$!{big}</th>
#end

    </tr>
    </thead>
</table>

<div id="tool">
    <form id="searchFrom">
        <a id="add" href="#" class="easyui-linkbutton" data-method="add" data-options="iconCls:'icon-save'">添加</a>
        <a id="edit" href="#" class="easyui-linkbutton" data-method="edit"
           data-options="iconCls:'icon-edit',disabled:true">编辑</a>
        <a id="remove" href="#" class="easyui-linkbutton" data-method="remove"
           data-options="iconCls:'icon-remove',disabled:true">删除</a>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input class="easyui-textbox" data-options="iconCls:'icon-search',width:200,prompt:'请输入需要搜索的用户名'" type="text"
               name="username" id="search-username"></input>
        <input class="easyui-textbox" data-options="width:130,prompt:'请输入年龄'" type="number" name="age1"
               id="age1"></input>至
        <input class="easyui-textbox" data-options="width:130,prompt:'请输入年龄'" type="number" name="age2"
               id="age2"></input>
        <a id="search" href="#" class="easyui-linkbutton" data-method="search"
           data-options="iconCls:'icon-search'">搜索</a>
    </form>
</div>
<div id="diaTool">
    <a id="save"  data-method="save" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-save'">保存</a>
    <a id="cancel" οnclick="" href="#" class="easyui-linkbutton"
       data-method="close" data-options="iconCls:'icon-cancel'">关闭</a>
</div>
<div id="dialog" style="width:350px;height:350px" class="easyui-dialog"
     data-options="
            iconCls:'icon-save',
            resizable:true,
            modal:true,
            closed:true,
            buttons:'#diaTool',
">
    <form id="ff" method="post">
        <table id="formTable" cellpadding="5">
        <input type="hidden" name="$!{tableInfo.pkColumn}"/>
#foreach($column in $tableInfo.otherColumn)
    <tr>
        <td>$tool.firstUpperCase($column.name):</td>
        <td><input style="width: 250px" class="easyui-textbox" type="text" name="$!{column.name}" id="$!{column.name}"
              ></input></td>
    </tr>  
#end   

           


        </table>
    </form>
</div>
</body>
</html>

若依代码生成器原理velocity模板引擎(自用) 在ruoyi-generator模块下新增一个区域的实体类。 阅读详情

相关推荐

使用velocity 代码生成器,告别繁琐的增删改查

velocity 代码生成器本文采用velocity模板来生成基于spring mvc ,spring data jpa, spring 的后台架构 和前端用的Metronic 的crud代码。大大的提升了开发速度。Velocity 模板引擎介绍在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中。特别是在如今特别流行的 MVC 架构模式中,软件各个层次的功能更加独立,同时代

Sirius_KP的博客 4553

基于Velocity开发代码生成器

在项目开发中,我们有碰到大量的简单、重复的增删改查需求,通过阅读若依框架https://github.com/yangzongzhuan/RuoYi 的代码生成器实现,结合我项目所用的技术栈,开发出本项目的代码生成器。Velocity是一个基于Java的模板引擎,我们可以往Context容器中填值,在vm文件中使用模板语言(Velocity Template Language)获取变量的值,

weixin_42840266的博客 1522

若依源码解析:代码生成ruoyi-generator

若依的代码生成器模块(ruoyi-generator)可以根据数据库表的设计信息和配置的模板,自动生成相应的Java代码文件。代码生成器使用Velocity作为模板引擎,根据模板文件中的占位符和变量替换规则,将元数据信息嵌入到生成的代码中,生成具体的代码文件。通过导入表结构和生成代码两个后端接口,实现了快速导入数据库表结构和生成代码的功能。

程序员诚哥 1万+

Velocity模板引擎——若依代码生成器

比较擅长用于邮件,发票,web内容生成、代码生成、网页静态化模板化的东西适合使用当然模板引擎不止这一种,还有freemarker、thymeleaf等等.若依选择Velocity。

shall_zhao的博客 1484

Velocity代码生成器:自动化Java代码的生成

Velocity依赖于一系列的JAR文件来实现其功能。了解这些JAR文件的作用对于配置和优化代码生成器至关重要。

weixin_36303305的博客 775

DCM、PLL以及DLL等概念及详情

介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。

CLL_caicai的博客 8337

使用Velocity模板引擎编写自研代码生成器

本篇文章主要讲解通过Velocity模板引擎自研开发一个代码生成器框架,可根据数据库已有的表结构生成基于MVC架构的Java代码,也可个人需求随时添加或修改要生成的代码内容,非常方便,并提供了一些设计模式使用的范例,希望对读者有所帮助。Velocity模版引擎的具体使用可以参考这篇文章。Velocity模版引擎介绍,本篇文章只简单介绍一下最基础的使用。

chang_mao的博客 2960

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4585

使用Velocity模板技术构建代码生成器

Velocity 是一个基于 Java 的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由 Java 代码定义的对象,从而实现界面和 Java 代码的分离,使得界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点。但是在实际应用过程中,Velocity 又不仅仅被用在了 MVC 的架构中。 在如今特别流行的 MVC 架构模式中,软件各个层次的功

肖扬的专栏 1044

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 356

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

基于Ant+Velocity的简单代码生成器的思路与实现

基于Ant+Velocity的简单代码生成器的思路与实现    (原文:http://www.javaeye.com/topic/30893)在SSH项目中,我们应用了service layer模式,所以针对一个模块,它就存在pojo、dao、daoImpl、service、serviceImpl,再到struts中的action、form。假设设计是面向数据库的,针对一个数据库表

popkiler的专栏 1111

数字频率计设计中的常见误区:从VHDL代码到硬件实现的避坑指南

本文深入探讨了数字频率计从VHDL代码到FPGA硬件实现过程中的关键误区与解决方案。重点分析了闸门时间生成的精度与资源平衡、控制时序设计中的竞争冒险规避,以及如何利用EDA工具进行综合、时序约束与调试,确保设计稳定可靠。文章为开发者提供了从仿真成功到硬件可用的实战避坑指南。

spark7igniter的博客 213

MyBatisPlus新版代码生成器(Velocity模板引擎详解)

Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 ,填充到模板中,从而实现界面和java代码的分离。应用场景Web应用程序 : 作为为应用程序的视图, 展示数据源代码生成 : Velocity可用于基于模板生成Java源代码自动电子邮件 : 网站注册 , 认证等的电子邮件模板网页静态化 : 基于velocity模板 , 生成静态网页只需要关注.vm结尾模板即可(属于velocity引擎模板),其他模板是其他模板引擎的模板,这里不做过多介绍。

从基础到源码解析的学习记录 7899

网络无线AP信号走场测试软件(Ekahau 使用说明)

每次开启 Ekahau 软件需要重复此过程,才可以正常使用。 双击“Ekahau Pro activation.reg”,如下图所示; 点击“Yes”按钮 ,进行注册表合并; 点击“OK”按钮,确认; 运行“Ekahau Pro” 点击“Close”关闭提示; 点击“OK”,关闭提示; ...

Reyn_观极 6417

【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真

1.软件版本 MATLAB2010b 2.本算法理论知识 对短波信道建模具有里程碑意义的是沃特森在1970年发表的一篇文章,文章中提出了一种静态模型,并在大气中进行了实验验证。 此静态模型可以描述为高斯散射增益抽头延迟线模型,即Watterson模型。 Watterson信道模型是经典的窄带短波信道模型,在这个模型中,信道衰落是瑞利幅度分布,而在每种传播模式中多普勒扩展的功率谱满足高斯分布。Watterson模型没有定义延时扩展的形状,认为各个多径传输模式中不存在延时扩展。其...

FPGA/MATLAB学习教程/源码/项目合作开发 2757

一个粗糙的代码生成器,基于velocity

一个粗糙的后管项目代码生成器,基于velocity,java

GOGO的博客 556

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 239

RuoYi-Vue代码生成器模板:Velocity与Freemarker

在前后端分离的开发模式中,重复编写基础CRUD代码不仅耗时,还容易引入人为错误。RuoYi-Vue框架提供了强大的代码生成器功能,通过Velocity模板引擎实现代码的自动化生成,显著提升开发效率。本文将深入解析其模板系统的实现原理与使用方法。 ## 模板引擎架构解析 RuoYi-Vue的代码生成模块采用Velocity作为核心模板引擎,通过工厂模式初始化引擎配置,并提供上下文数据绑定功能。核...

gitblog_00750的博客 822

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

velocity简单使用-代码生成器

本文展示了如何在Maven项目中集成Velocity模板引擎,并使用JUnit进行测试。首先,通过Maven依赖引入了velocity-engine-core和junit库。接着,编写了一个Java测试方法,初始化Velocity引擎并创建模板上下文,填充数据后生成HTML文件。VM模板文件htm1.vm展示了Velocity的多种功能,包括变量输出、条件判断、循环遍历、宏定义等。通过include和parse指令,可以引入其他VM文件。最终生成的HTML文件包含了动态数据和模板逻辑,展示了Velocity

2509_90931430的博客 590

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

springBoot整合velocity实现代码生成器思路

代码生成器,由表数据,表名,列名转换为类名,属性名,生成类,此生成器只提供一个思路,模板依据原理自己实现。 1,导入pom依赖 <!-- 引入SpringBoot父类依赖 --> <parent> <groupId>org.springframework.boot</groupId> <art...

liuerchong的博客 1820

mybatis-plus(Velocity模板引擎)代码生成器的运用

MyBatis-Plus(Velocity 模板引擎)代码生成器可快速生成统一风格、遵循最佳实践且结构清晰的代码,极大提高开发效率并便于维护和扩展。MyBatis-Plus 的代码生成器结合 Velocity 模板引擎可以快速生成基于 MyBatis-Plus 的代码结构,提高开发效率。注意:设计好生成的模块位置。注意这里会生成新的模块。

m0_74022176的博客 425

3种模板引擎对比:Velocity、Freemarker、Beetl在MyBatis-Plus代码生成器中如何选择

MyBatis-Plus代码生成器(mybatis-plus-code-generator)是一款把数据库表一键逆向成 entity、mapper、service 等 Java 代码的可视化工具。而它底层渲染代码的能力,完全交给**模板引擎**——项目同时内置了 **Velocity、Freemarker、Beetl** 三款引擎。选错引擎,轻则报错,重则生成的代码风格不合团队习惯。本文用一张对比

gitblog_00666的博客 859

NDO 组件和例子下载,内置了一个基于Velocity模版引擎的代码生成器

     NDO 组件和例子下载,内置了一个基于Velocity模版引擎的代码生成器,NQL和活动记录目前仅仅支持sqlserer,该组件属于开源的,没有任何版权的纠纷,欢迎大家试用,如果有任何意见和建议请仅扔砖头就是了!   关于NDO 组件的介绍请看我下面的几篇文章:                  1:  NQL.Net 简介                   2:  NQL.NET 数...

weixin_34187862的博客 108

velocity代码生成器的使用

1.导入依赖 <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> 2.resou...

min954584739的博客 2079
上一篇: JPA知识点整理
下一篇: Spring知识点总结归纳。
Cola_可乐
博客等级 码龄8年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值