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

AutoCAD Plant 3D自定义零件库实战:手把手教你用Python创建参数化槽式三通

本文详细介绍了如何利用Python脚本在AutoCAD Plant 3D中创建参数化槽式三通组件,从API原理到实战开发,帮助用户构建高效的自定义零件库。通过Python装饰器系统控制零件属性和行为,实现几何建模、参数管理和规格编辑器集成,提升工业管道设计的标准化和效率。

weixin_28267011的博客 330

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

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

chang_mao的博客 2960

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器?

本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。

weixin_30134145的博客 358

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

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

肖扬的专栏 1044

自动驾驶仿真:python和carsim联合仿真案例

carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和carsim联合仿真的方法,虽然carsim官方有个Steer_Control.py相关的案例,但是感觉比较冗余,这里抽出重点部分和大家交流探讨下。提示:以下是本篇文章正文内容,下面案例可供参考1、这里关于solvers的细节其实都没说,因为里面确实也没什么内容好讲的,本质就是调用carsim.dll,如果你需要更多的函数解析其实可以看vs_api.h,路径在,具体内容如下图所示。

zataji的博客 9060

从零构建腾讯滑块验证码破解引擎:逆向工程与实战对抗

本文深入解析腾讯滑块验证码(原天御验证码)的防护机制,包括环境感知层、行为分析层和验证决策层的核心技术。通过JSVMP虚拟机保护、轨迹验证算法和动态加密体系,腾讯验证码实现了高效的人机识别。文章还提供了安全研究实践指南,涵盖环境模拟和验证码识别方案,并探讨了防御对抗的演进趋势与合规研究建议。

rl6adventurer的博客 827

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

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

popkiler的专栏 1111

FMQL开发环境实战:从零构建国产FPGA SoC的软件基石

本文详细解析了构建国产复旦微FMQL FPGA SoC软件开发环境的完整流程。针对开发者在环境搭建中遇到的核心痛点,文章深入剖析了Procise、IAR与Vivado三大工具的协同角色与版本选择,提供了从软件下载、安装避坑到核心配置的实战指南,并总结了常见问题的排查方法,旨在帮助开发者高效跨过FMQL开发的“第一道坎”。

weixin_29215391的博客 125

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

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

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

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1919

基于STM32的蓝牙智能药盒设计

本研究设计了一种基于STM32F103C8T6单片机的蓝牙智能药盒系统,针对老年人用药管理需求,集成了定时提醒、药量检测、环境监测等功能。系统通过LCD1602显示屏实时显示时间与用药信息,支持每日3次定时提醒及3种药物用量设置,采用DHT11温湿度传感器、HX711药量检测模块和红外传感器实现环境监控,并通过蓝牙模块实现远程用药提醒。测试结果表明,系统定时误差≤30秒,温湿度监测精度±2℃,药量检测误差<1g,各项功能运行稳定。该设计为解决老年人用药依从性问题提供了智能化解决方案,具有实用价值和应用前景。

3254968421的博客 542

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

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

GOGO的博客 556

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1896

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

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

gitblog_00750的博客 822

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

velocity简单使用-代码生成器

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

2509_90931430的博客 590

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

liuerchong的博客 1820

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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的博客 858

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、付费专栏及课程。

余额充值